diff --git a/docs/include/interface.early-repayment.json b/docs/include/interface.early-repayment.json index 638d64c..0dbfb43 100644 --- a/docs/include/interface.early-repayment.json +++ b/docs/include/interface.early-repayment.json @@ -21,7 +21,7 @@ ], "returns": { "type": "(uint64, uint64, byte[])", - "desc": "Paid principal amount, Payment timestamp, Payment information" + "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment information" }, "errors": [ { diff --git a/docs/include/interface.get-account-info.json b/docs/include/interface.get-account-info.json index 44fdef7..993ead2 100644 --- a/docs/include/interface.get-account-info.json +++ b/docs/include/interface.get-account-info.json @@ -11,7 +11,7 @@ ], "returns": { "type": "(address,uint64,uint64,uint64,bool)", - "desc": "Payment Address, D-ASA units, Unit nominal value, Paid coupons, Suspended" + "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" }, "errors": [ { diff --git a/docs/include/interface.get-asset-info.json b/docs/include/interface.get-asset-info.json index 3be9bc6..59b0798 100644 --- a/docs/include/interface.get-asset-info.json +++ b/docs/include/interface.get-asset-info.json @@ -4,7 +4,7 @@ "readonly": true, "args": [], "returns": { - "type": "(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64, uint64,uint64,uint64,bool,bool)", - "desc": "Denomination Asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Defaulted" + "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64, uint64,uint64,uint64,bool,bool)", + "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Defaulted" } } diff --git a/docs/include/interface.pay-coupon.json b/docs/include/interface.pay-coupon.json index d9c7889..ef50c0f 100644 --- a/docs/include/interface.pay-coupon.json +++ b/docs/include/interface.pay-coupon.json @@ -16,7 +16,7 @@ ], "returns": { "type": "(uint64, uint64, byte[])", - "desc": "Paid coupon amount, Payment timestamp, Payment context" + "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context" }, "errors": [ { diff --git a/docs/include/interface.pay-principal.json b/docs/include/interface.pay-principal.json index b6757ed..2e18337 100644 --- a/docs/include/interface.pay-principal.json +++ b/docs/include/interface.pay-principal.json @@ -16,7 +16,7 @@ ], "returns": { "type": "(uint64, uint64, byte[])", - "desc": "Paid principal amount, Payment timestamp, Payment context" + "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment context" }, "errors": [ { diff --git a/docs/payment-agent.md b/docs/payment-agent.md index c6d46b1..4730683 100644 --- a/docs/payment-agent.md +++ b/docs/payment-agent.md @@ -1,16 +1,19 @@ # Payment Agent {#payment-agent} -> Debt instruments' cash flows depend on the payoff, they usually involve: +> Debt instruments' cash flows usually involve: > -> - *Principal repayment;* -> - *Early repayment options;* -> - *Coupon payments.* +> - *Principal repayment* +> - *Early repayment options* +> - *Coupon payments* > D-ASA supports both on-chain and off-chain payment agents, depending on the settlement > asset (see [Settlement](./settlement.md) section). The D-ASA payment methods **MAY** provide additional information about the payment. -> The payment information could be used to add a unique identifier or external context -> to the payments, enabling external payment system integration in the case of off-chain -> payment agents. +> The payment information could be used, for example, for: +> +> - Adding unique identifiers or external context to the payments +> - Enabling external payment system integration in the case of off-chain settlement +> - Providing information about the settled amount and conversion rate used with +> respect to the denomination asset diff --git a/docs/settlement.md b/docs/settlement.md index 095c31f..8cc661f 100644 --- a/docs/settlement.md +++ b/docs/settlement.md @@ -3,7 +3,7 @@ > Debt instruments cash flows may be settled in a currency different from the denomination. The D-ASA **MUST** define either in an on-chain or off-chain *settlement asset* -\\([CURS]\\)[^1] to regulate the cash flows. +to regulate the cash flows. The *settlement asset identifier* (`uint64`) **MUST** be set using the `asset_config` method. @@ -42,8 +42,3 @@ The *settlement asset* **MUST** use the decimal digits specified by the > - Regulates payments’ approval conditions (e.g. a coupon is due); > - Notarizes the amounts and timestamps of payments settled off-chain. - ---- - -[^1]: ACTUS only allows ISO 4217 currency identifiers, therefore an on-chain settlement -is not supported by ACTUS. diff --git a/smart_contracts/abi_types.py b/smart_contracts/abi_types.py index 260caaf..20dee13 100644 --- a/smart_contracts/abi_types.py +++ b/smart_contracts/abi_types.py @@ -13,6 +13,7 @@ class AssetInfo(arc4.Struct, kw_only=True): """D-ASA Info""" denomination_asset_id: arc4.UInt64 + settlement_asset_id: arc4.UInt64 outstanding_principal: arc4.UInt64 unit_value: arc4.UInt64 day_count_convention: arc4.UInt8 diff --git a/smart_contracts/artifacts/base_d_asa/BaseDAsa.approval.puya.map b/smart_contracts/artifacts/base_d_asa/BaseDAsa.approval.puya.map index d6aad5f..c96cc1e 100644 --- a/smart_contracts/artifacts/base_d_asa/BaseDAsa.approval.puya.map +++ b/smart_contracts/artifacts/base_d_asa/BaseDAsa.approval.puya.map @@ -3,7 +3,7 @@ "sources": [ "../../base_d_asa/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCmD;;AAAf;;AAA5B;AAkBA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AACA;AAAkB;AAAlB;AACA;;AAA4B;AAA5B;AAGA;;AAAgB;;AAAhB;AAGA;;AAAmB;AAAnB;AACA;AAAyB;AAAzB;AAGA;;AAAqB;AAArB;AAIA;;AAAqB;AAArB;AAKA;;AAAyC;AAAzC;AACA;;AAAyC;AAAzC;AACA;;AAAqB;AAArB;AACA;;AAAqC;AAArC;AACA;;AAAqC;AAArC;AACA;;AAAqB;AAArB;AAGA;AAAc;AAAd;AACA;;AAAiB;AAAjB;AACA;;AAAiB;AAAjB;AAhER;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AA85BK;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAPA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjBA;;AAAA;AAAA;AAAA;;AAAA;AAz3BL;;;AAy3BK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9BA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAdA;;AAAA;AAAA;AAAA;;AAAA;AA70BL;;;AA60BK;;;AAAA;;AAvBA;;AAAA;AAAA;AAAA;;AAAA;AAtzBL;;;AAAA;;;AAszBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlBA;;AAAA;AAAA;AAAA;;AAAA;AApyBL;;;AAoyBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA1CA;;AAAA;AAAA;AAAA;;AAAA;AA1vBL;;;AAAA;;;AA0vBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9BA;;AAAA;AAAA;AAAA;;AAAA;AA5tBL;;;AA4tBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAnCA;;AAAA;AAAA;AAAA;;AAAA;AAzrBL;;;AAAA;;;AAyrBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhDA;;AAAA;AAAA;AAAA;;AAAA;AAzoBL;;;AAAA;;;AAyoBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/DA;;AAAA;AAAA;AAAA;;AAAA;AA1kBL;;;AAAA;;;AAAA;;;AA0kBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAxDA;;AAAA;AAAA;AAAA;;AAAA;AAlhBL;;;AAkhBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlFA;;AAAA;AAAA;AAAA;;AAAA;AAhcL;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAgcK;;;AAAA;;AAtBA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AA1aL;;;AAAA;;;AA0aK;;;AAAA;;AA1aL;AAAA;;AAAA;;;;AAAA;;;AAsbK;;AAAA;AAAL;;;AAAA;;AAZA;;;AASQ;;AAAA;;AAAA;AACgB;;AAAA;;;AAAhB;;AAAA;AAAA;;AAYR;;;;;;;AAyCQ;;;AACO;AAAA;AAAA;AAAA;AAAA;AAAP;AAG+B;;AAAA;AAAA;AAxV3B;;;AAAuC;;AAAA;;AAAA;AAAA;;AAAA;AAAvC;;;;AADJ;AAMA;;AAAA;;AAAA;AAuV6B;;AAAA;AAjVF;AAAA;;AAAA;AAAA;AAAvB;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAEA;AAIQ;;AAHO;AAAA;;AAAA;AAAA;AACI;;AACF;;;;;;;AAHjB;;;;;AAAA;AA+UI;;AAAA;AAAmB;;AAAA;AAAnB;AAAA;AAAA;AADJ;AAGA;AAAA;;AAAA;AACmB;AAAnB;;AAAA;AAAA;AAGiC;;AAAA;AAAA;AAAA;;AA1U7B;;AADG;AAAA;;;AAAA;;AAEH;;;AAFG;AAAA;;;;AAAP;AAOA;;AAAA;;AAAA;AAwU0B;;AAAA;AApU1B;AAAA;AAIA;;AAAA;AAAA;AAIW;;AAAA;AAAA;AAAJ;AAAA;AAAP;AAIA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AAAX;;;AACY;;AAAA;;AAAA;;AAAA;;AAAA;AAKA;;AAAA;AAAA;AAAsB;AAAA;;AAAA;AAAA;AAAqB;AAArB;AAAtB;AADJ;AA2TA;;AAAA;;;AAAA;;AAjSA;;AAAA;;AAAA;;AAAA;;AAAA;AACyC;;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGyC;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGqB;;;AAAA;AAArB;;AAAA;AAAA;AAGG;;AAAA;AAAA;AAAA;AAAA;;AAAsB;AAAA;;AAAA;AAAA;AAAqB;AAArB;AAAtB;AAAX;;;AACiC;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAArB;;AAAA;AAAA;AAIO;;AAAA;AAAA;AAAJ;AAAP;AAyRA;AAAc;;AAAd;;;;;;;;;;AAzbR;;;AAEe;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAP;;AAyHR;;;;;;AAGY;;AAAA;;;AAAA;AAAA;;;AAAA;AACE;;AADF;AADJ;AAIiB;;AAAA;AAAA;AAAqB;AAArB;AAAP;AAAA;;AAAA;;AAAA;AAAlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKqB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AAAA;;AAC0B;AAAL;AAAA;AAAA;;AAAZ;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AACO;AAAP;AACG;AAAA;;AAAA;AAAA;AAA6B;;;AAA7B;AAAf;;;AAEwB;;AAAA;;AAAA;AAAmB;;;;AAApB;AAAA;AAAP;;;;;;;;;AAgThB;;;;AAqBQ;;;AA1dO;AAAA;AAAA;AAAA;AAAe;;AAAf;AA2dA;AAAP;AACA;;;AAEO;;AAAA;AAAA;AAAP;AAAA;AACyC;AAAtC;;;;AAAX;;;AACY;;AAAA;;;;AAAA;;;;;;;;AAEA;AAAA;;AAAA;AAAA;AACG;;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAEI;;AAAA;AAAA;AADD;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAKI;AAAA;;AAAA;AAAA;AAD0B;AAI1B;AAAA;;AAAA;AAAA;AAD0B;AAJ3B;AAAP;;AAAA;AAlfR;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAyfR;;;AAqBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;AASS;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA6BQ;AANwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;AAKW;;AAAZ;AAAP;AAAA;AAXmC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACyD;;AAAA;;;AAAzD;;;;AAJ2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACuD;;AAAA;;;AAAvD;;;;AAN2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEI;;AAAA;;;AADJ;;;;AAPwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;;;;AALA;;AAAA;;AAAA;;;;;;;;AA8BhB;;;AAkBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAAP;AASS;;;;;;;AAFT;;AAAA;;;;;;;;;;;;AAkBQ;AAHuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAGW;;AAAZ;AAAP;AAAA;AAP+B;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;;;;;AAiBhB;;;AAoBQ;;;AAhoBO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAioBA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEgC;;AAEtB;;AAFsB;AAGjB;;AAHiB;AAIf;;AAJe;AAKlB;;AALkB;AAAhC;AAOmB;;AAAZ;AAAP;AA/nBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AAXR;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAuoBR;;;AAkBQ;;;AACA;;;AAhmB0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAmmBe;AAAA;AAAA;AAAA;;;AAAA;AAAf;AAAA;;AACA;;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzaG;AAAA;AAAA;AAAA;AAAX;;;AACY;AAAc;;AAAd;AA2aC;;AAAA;AAAuC;;AAAZ;AADzB;AAAP;AAAA;AAIR;;;;;;;AAjrBe;AAAA;AAAA;AAAA;AAAe;;AAAf;AAuLH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AAtJc;;AAFQ;;AAElB;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAuC0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAuoBA;;;AACA;;;AACO;;AAAA;AAAP;AAAA;AAEI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAyC;AAAA;;AAAA;AAAA;AAAzC;AADJ;AAIA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAEI;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AADkC;AAAtC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAGuD;AAAA;AAAA;AAAA;AAAZ;AAA3C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AACmB;AAAA;;AAAA;AAAA;AAAmB;AAAA;AAAA;AAAA;AAAnB;AAAZ;AAAP;;AAAA;;;;;;;;;AAER;;;AAcQ;;;AACiB;;;AAAO;AAAxB;;AAAA;AAAA;AACmB;;AAAZ;AAAP;AA3rBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AA0rBR;;;AAkBQ;;;AAzrB0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2rBA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AACmB;;AAAZ;AAAP;AAER;;;;AA1tBsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAuuBiB;;;AAAO;AAAxB;;AAAA;AAAA;;;;;;AAER;;;AAW8C;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;AAAA;AAAA;AAAyB;AAAA;AAAA;AAAA;AAAzB;AAAZ;AACC;AAAA;AAAA;AAAA;AAAZ;AACqB;AAAA;;AAAA;AAAA;AAAX;AAAA;;;AACK;AAAA;;AAAA;AAAA;AAAZ;AAAA;;;AACW;AAAA;;AAAA;AAAA;AAAZ;AACkB;AAAA;AAAA;AAAA;AAAZ;AAEf;AAAA;;AAAA;AAAA;AAD8B;AAI9B;AAAA;;AAAA;AAAA;AAD8B;AAGR;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AACW;AAAA;;AAAA;AAAA;AAAf;;AAAA;AAAA;;AAAA;AACe;AAAA;;AAAA;AAAA;AAAf;;AAAA;AAAA;;AAAA;AAjBP;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAP;AAoBR;;;AA1uBkC;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAyvBO;AAAA;AAAP;AAER;;;AAQsB;;;;AAz0BP;AAAA;AAAA;AAAA;AAAe;;AAAf;AA00Bf;;;AAC0B;;AAAA;AAAA;AAAA;;AAAA;AAClB;;AAAA;AAAA;AAER;;;AAGwB;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AAFG;AAAA;;;;AAAA;AAAA;AAAP;AAKR;;;AAEiC;AAAA;;AAAA;AAAA;AAAlB;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAP;AA1eR;;;AAQQ;;;", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCmD;;AAAf;;AAA5B;AAkBA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AACA;AAAkB;AAAlB;AACA;;AAA4B;AAA5B;AAGA;;AAAgB;;AAAhB;AAGA;;AAAmB;AAAnB;AACA;AAAyB;AAAzB;AAGA;;AAAqB;AAArB;AAIA;;AAAqB;AAArB;AAKA;;AAAyC;AAAzC;AACA;;AAAyC;AAAzC;AACA;;AAAqB;AAArB;AACA;;AAAqC;AAArC;AACA;;AAAqC;AAArC;AACA;;AAAqB;AAArB;AAGA;AAAc;AAAd;AACA;;AAAiB;AAAjB;AACA;;AAAiB;AAAjB;AAhER;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAm6BK;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjBA;;AAAA;AAAA;AAAA;;AAAA;AAx3BL;;;AAw3BK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAdA;;AAAA;AAAA;AAAA;;AAAA;AA30BL;;;AA20BK;;;AAAA;;AAvBA;;AAAA;AAAA;AAAA;;AAAA;AApzBL;;;AAAA;;;AAozBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlBA;;AAAA;AAAA;AAAA;;AAAA;AAlyBL;;;AAkyBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA1CA;;AAAA;AAAA;AAAA;;AAAA;AAxvBL;;;AAAA;;;AAwvBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9BA;;AAAA;AAAA;AAAA;;AAAA;AA1tBL;;;AA0tBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAnCA;;AAAA;AAAA;AAAA;;AAAA;AAvrBL;;;AAAA;;;AAurBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhDA;;AAAA;AAAA;AAAA;;AAAA;AAvoBL;;;AAAA;;;AAuoBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/DA;;AAAA;AAAA;AAAA;;AAAA;AAxkBL;;;AAAA;;;AAAA;;;AAwkBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAxDA;;AAAA;AAAA;AAAA;;AAAA;AAhhBL;;;AAghBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlFA;;AAAA;AAAA;AAAA;;AAAA;AA9bL;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AA8bK;;;AAAA;;AAtBA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAxaL;;;AAAA;;;AAwaK;;;AAAA;;AAxaL;AAAA;;AAAA;;;;AAAA;;;AAobK;;AAAA;AAAL;;;AAAA;;AAZA;;;AASQ;;AAAA;;AAAA;AACgB;;AAAA;;;AAAhB;;AAAA;AAAA;;AAYR;;;;;;;AAyCQ;;;AACO;AAAA;AAAA;AAAA;AAAA;AAAP;AAG+B;;AAAA;AAAA;AAtV3B;;;AAAuC;;AAAA;;AAAA;AAAA;;AAAA;AAAvC;;;;AADJ;AAMA;;AAAA;;AAAA;AAqV6B;;AAAA;AA/UF;AAAA;;AAAA;AAAA;AAAvB;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAEA;AAIQ;;AAHO;AAAA;;AAAA;AAAA;AACI;;AACF;;;;;;;AAHjB;;;;;AAAA;AA6UI;;AAAA;AAAmB;;AAAA;AAAnB;AAAA;AAAA;AADJ;AAGA;AAAA;;AAAA;AACmB;AAAnB;;AAAA;AAAA;AAGiC;;AAAA;AAAA;AAAA;;AAxU7B;;AADG;AAAA;;;AAAA;;AAEH;;;AAFG;AAAA;;;;AAAP;AAOA;;AAAA;;AAAA;AAsU0B;;AAAA;AAlU1B;AAAA;AAIA;;AAAA;AAAA;AAIW;;AAAA;AAAA;AAAJ;AAAA;AAAP;AAIA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AAAX;;;AACY;;AAAA;;AAAA;;AAAA;;AAAA;AAKA;;AAAA;AAAA;AAAsB;AAAA;;AAAA;AAAA;AAAqB;AAArB;AAAtB;AADJ;AAyTA;;AAAA;;;AAAA;;AA/RA;;AAAA;;AAAA;;AAAA;;AAAA;AACyC;;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGyC;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGqB;;;AAAA;AAArB;;AAAA;AAAA;AAGG;;AAAA;AAAA;AAAA;AAAA;;AAAsB;AAAA;;AAAA;AAAA;AAAqB;AAArB;AAAtB;AAAX;;;AACiC;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAArB;;AAAA;AAAA;AAIO;;AAAA;AAAA;AAAJ;AAAP;AAuRA;AAAc;;AAAd;;;;;;;;;;AAvbR;;;AAEe;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAP;;AAyHR;;;;;;AAGY;;AAAA;;;AAAA;AAAA;;;AAAA;AACE;;AADF;AADJ;AAIiB;;AAAA;AAAA;AAAqB;AAArB;AAAP;AAAA;;AAAA;;AAAA;AAAlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKqB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AAAA;;AAC0B;AAAL;AAAA;AAAA;;AAAZ;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AACO;AAAP;AACG;AAAA;;AAAA;AAAA;AAA6B;;;AAA7B;AAAf;;;AAEwB;;AAAA;;AAAA;AAAmB;;;;AAApB;AAAA;AAAP;;;;;;;;;AA8ShB;;;;AAqBQ;;;AAxdO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAydA;AAAP;AACA;;;AAEO;;AAAA;AAAA;AAAP;AAAA;AACyC;AAAtC;;;;AAAX;;;AACY;;AAAA;;;;AAAA;;;;;;;;AAEA;AAAA;;AAAA;AAAA;AACG;;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAEI;;AAAA;AAAA;AADD;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAKI;AAAA;;AAAA;AAAA;AAD0B;AAI1B;AAAA;;AAAA;AAAA;AAD0B;AAJ3B;AAAP;;AAAA;AAhfR;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAufR;;;AAqBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;AASS;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA6BQ;AANwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;AAKW;;AAAZ;AAAP;AAAA;AAXmC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACyD;;AAAA;;;AAAzD;;;;AAJ2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACuD;;AAAA;;;AAAvD;;;;AAN2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEI;;AAAA;;;AADJ;;;;AAPwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;;;;AALA;;AAAA;;AAAA;;;;;;;;AA8BhB;;;AAkBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAAP;AASS;;;;;;;AAFT;;AAAA;;;;;;;;;;;;AAkBQ;AAHuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAGW;;AAAZ;AAAP;AAAA;AAP+B;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;;;;;AAiBhB;;;AAoBQ;;;AA9nBO;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+nBA;AAAP;AACA;;;AACA;;;AAC8B;;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEgC;;AAEtB;;AAFsB;AAGjB;;AAHiB;AAIf;;AAJe;AAKlB;;AALkB;AAAhC;AAOmB;;AAAZ;AAAP;AA7nBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AAXR;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAqoBR;;;AAkBQ;;;AACA;;;AA9lB0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAimBe;AAAA;AAAA;AAAA;;;AAAA;AAAf;AAAA;;AACA;;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzaG;AAAA;AAAA;AAAA;AAAX;;;AACY;AAAc;;AAAd;AA2aC;;AAAA;AAAuC;;AAAZ;AADzB;AAAP;AAAA;AAIR;;;;;;;AA/qBe;AAAA;AAAA;AAAA;AAAe;;AAAf;AAuLH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AAtJc;;AAFQ;;AAElB;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAuC0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqoBA;;;AACA;;;AACO;;AAAA;AAAP;AAAA;AAEI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAyC;AAAA;;AAAA;AAAA;AAAzC;AADJ;AAIA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAEI;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AADkC;AAAtC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAGuD;AAAA;AAAA;AAAA;AAAZ;AAA3C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AACmB;AAAA;;AAAA;AAAA;AAAmB;AAAA;AAAA;AAAA;AAAnB;AAAZ;AAAP;;AAAA;;;;;;;;;AAER;;;AAcQ;;;AACiB;;;AAAO;AAAxB;;AAAA;AAAA;AACmB;;AAAZ;AAAP;AAzrBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AAwrBR;;;AAkBQ;;;AAvrB0B;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAyrBA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AACmB;;AAAZ;AAAP;AAER;;;;AAxtBsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAquBiB;;;AAAO;AAAxB;;AAAA;AAAA;;;;;;AAER;;;AAW8C;AAAA;;AAAA;AAAA;AAAZ;AACU;AAAA;;AAAA;AAAA;AAAZ;AACc;AAAA;AAAA;AAAA;AAAyB;AAAA;AAAA;AAAA;AAAzB;AAAZ;AACC;AAAA;AAAA;AAAA;AAAZ;AACqB;AAAA;;AAAA;AAAA;AAAX;AAAA;;;AACK;AAAA;;AAAA;AAAA;AAAZ;AAAA;;;AACW;AAAA;;AAAA;AAAA;AAAZ;AACkB;AAAA;AAAA;AAAA;AAAZ;AAEf;AAAA;;AAAA;AAAA;AAD8B;AAI9B;AAAA;;AAAA;AAAA;AAD8B;AAGR;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AACW;AAAA;;AAAA;AAAA;AAAf;;AAAA;AAAA;;AAAA;AACe;AAAA;;AAAA;AAAA;AAAf;;AAAA;AAAA;;AAAA;AAlBP;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAP;AAqBR;;;AAzuBkC;;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAwvBO;AAAA;AAAP;AAER;;;AAQsB;;;;AAx0BP;AAAA;AAAA;AAAA;AAAe;;AAAf;AAy0Bf;;;AAC0B;;AAAA;AAAA;AAAA;;AAAA;AAClB;;AAAA;AAAA;AAER;;;AASwB;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AAFG;AAAA;;;;AAAA;AAAA;AAAP;AAKR;;;AAQiC;AAAA;;AAAA;AAAA;AAAlB;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAP;AAvfR;;;AAQQ;;;", "op_pc_offset": 0, "pc_events": { "1": { @@ -14,7 +14,7 @@ "op": "intcblock 0 1 8 4 200" }, "9": { - "op": "bytecblock 0x151f7c75 \"circulating_units\" \"status\" \"unit_value\" \"total_units\" \"total_coupons\" \"maturity_date\" 0x52333023 0x52323023 \"denomination_asset_id\" \"day_count_convention\" \"primary_distribution_opening_date\" \"primary_distribution_closure_date\" \"issuance_date\" \"secondary_market_opening_date\" \"secondary_market_closure_date\" \"suspended\" \"defaulted\" \"settlement_asset_id\" \"metadata\" \"interest_rate\" 0x74696d654576656e7473 0x52373023 0x52363023 0x52353023 0x52343023 0x0000000000000000 0x00 0x636f75706f6e5261746573 0x068101 0x52383023" + "op": "bytecblock 0x151f7c75 \"circulating_units\" \"status\" \"unit_value\" \"total_units\" \"total_coupons\" \"maturity_date\" 0x52333023 0x52323023 \"denomination_asset_id\" \"settlement_asset_id\" \"day_count_convention\" \"primary_distribution_opening_date\" \"primary_distribution_closure_date\" \"issuance_date\" \"secondary_market_opening_date\" \"secondary_market_closure_date\" \"suspended\" \"defaulted\" \"metadata\" \"interest_rate\" 0x74696d654576656e7473 0x52373023 0x52363023 0x52353023 0x52343023 0x0000000000000000 0x00 0x636f75706f6e5261746573 0x068101 0x52383023" }, "413": { "op": "txn ApplicationID", @@ -48,7 +48,7 @@ "op": "app_global_put" }, "427": { - "op": "bytec 18 // \"settlement_asset_id\"" + "op": "bytec 10 // \"settlement_asset_id\"" }, "429": { "op": "intc_0 // 0" @@ -66,7 +66,7 @@ "op": "app_global_put" }, "434": { - "op": "bytec 10 // \"day_count_convention\"" + "op": "bytec 11 // \"day_count_convention\"" }, "436": { "op": "intc_0 // 0" @@ -120,7 +120,7 @@ "op": "app_global_put" }, "458": { - "op": "bytec 11 // \"primary_distribution_opening_date\"" + "op": "bytec 12 // \"primary_distribution_opening_date\"" }, "460": { "op": "intc_0 // 0" @@ -129,7 +129,7 @@ "op": "app_global_put" }, "462": { - "op": "bytec 12 // \"primary_distribution_closure_date\"" + "op": "bytec 13 // \"primary_distribution_closure_date\"" }, "464": { "op": "intc_0 // 0" @@ -138,7 +138,7 @@ "op": "app_global_put" }, "466": { - "op": "bytec 13 // \"issuance_date\"" + "op": "bytec 14 // \"issuance_date\"" }, "468": { "op": "intc_0 // 0" @@ -147,7 +147,7 @@ "op": "app_global_put" }, "470": { - "op": "bytec 14 // \"secondary_market_opening_date\"" + "op": "bytec 15 // \"secondary_market_opening_date\"" }, "472": { "op": "intc_0 // 0" @@ -156,7 +156,7 @@ "op": "app_global_put" }, "474": { - "op": "bytec 15 // \"secondary_market_closure_date\"" + "op": "bytec 16 // \"secondary_market_closure_date\"" }, "476": { "op": "intc_0 // 0" @@ -183,7 +183,7 @@ "op": "app_global_put" }, "485": { - "op": "bytec 16 // \"suspended\"" + "op": "bytec 17 // \"suspended\"" }, "487": { "op": "intc_0 // 0" @@ -192,7 +192,7 @@ "op": "app_global_put" }, "489": { - "op": "bytec 17 // \"defaulted\"" + "op": "bytec 18 // \"defaulted\"" }, "491": { "op": "intc_0 // 0" @@ -216,7 +216,7 @@ "stack_out": [] }, "498": { - "op": "pushbytess 0x63f99589 0xd3a4d6ab 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x301dd919 0xed02759f 0xfad2173e 0x08efea35 0xddcec07b // method \"asset_create(address,byte[])void\", method \"asset_config(uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void\", method \"set_secondary_time_events(uint64[])(uint64,uint64)\", method \"assign_role(address,uint8,byte[])uint64\", method \"revoke_role(address,uint8)uint64\", method \"open_account(address,address)uint64\", method \"close_account(address)(uint64,uint64)\", method \"primary_distribution(address,uint64)uint64\", method \"set_asset_suspension(bool)uint64\", method \"set_account_suspension(address,bool)uint64\", method \"set_default_status(bool)void\", method \"get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)\", method \"get_account_info(address)(address,uint64,uint64,uint64,bool)\", method \"get_time_events()uint64[]\", method \"get_secondary_market_schedule()uint64[]\", method \"get_asset_metadata()byte[]\"" + "op": "pushbytess 0x63f99589 0xd3a4d6ab 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x80bfcdd1 0xed02759f 0xfad2173e 0x08efea35 0xddcec07b // method \"asset_create(address,byte[])void\", method \"asset_config(uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void\", method \"set_secondary_time_events(uint64[])(uint64,uint64)\", method \"assign_role(address,uint8,byte[])uint64\", method \"revoke_role(address,uint8)uint64\", method \"open_account(address,address)uint64\", method \"close_account(address)(uint64,uint64)\", method \"primary_distribution(address,uint64)uint64\", method \"set_asset_suspension(bool)uint64\", method \"set_account_suspension(address,bool)uint64\", method \"set_default_status(bool)void\", method \"get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)\", method \"get_account_info(address)(address,uint64,uint64,uint64,bool)\", method \"get_time_events()uint64[]\", method \"get_secondary_market_schedule()uint64[]\", method \"get_asset_metadata()byte[]\"" }, "580": { "op": "txna ApplicationArgs 0" @@ -2296,7 +2296,7 @@ ] }, "1034": { - "op": "bytec 18 // \"settlement_asset_id\"", + "op": "bytec 10 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", "denomination_asset_id#1", @@ -2360,7 +2360,7 @@ ] }, "1042": { - "op": "bytec 18 // \"settlement_asset_id\"", + "op": "bytec 10 // \"settlement_asset_id\"", "stack_out": [ "array_head_and_tail%0#0", "day_count_convention#1", @@ -2857,7 +2857,7 @@ ] }, "1103": { - "op": "bytec 10 // \"day_count_convention\"", + "op": "bytec 11 // \"day_count_convention\"", "defined_out": [ "\"day_count_convention\"" ], @@ -3534,7 +3534,7 @@ ] }, "1187": { - "op": "bytec 11 // \"primary_distribution_opening_date\"", + "op": "bytec 12 // \"primary_distribution_opening_date\"", "defined_out": [ "\"primary_distribution_opening_date\"", "array_head_and_tail%0#0", @@ -3615,7 +3615,7 @@ ] }, "1196": { - "op": "bytec 12 // \"primary_distribution_closure_date\"", + "op": "bytec 13 // \"primary_distribution_closure_date\"", "defined_out": [ "\"primary_distribution_closure_date\"", "array_head_and_tail%0#0", @@ -3683,7 +3683,7 @@ ] }, "1204": { - "op": "bytec 13 // \"issuance_date\"", + "op": "bytec 14 // \"issuance_date\"", "defined_out": [ "\"issuance_date\"", "array_head_and_tail%0#0", @@ -4955,7 +4955,7 @@ ] }, "1377": { - "op": "bytec 10 // \"day_count_convention\"", + "op": "bytec 11 // \"day_count_convention\"", "defined_out": [ "\"day_count_convention\"", "0", @@ -5364,7 +5364,7 @@ ] }, "1456": { - "op": "bytec 13 // \"issuance_date\"", + "op": "bytec 14 // \"issuance_date\"", "defined_out": [ "\"issuance_date\"", "0" @@ -5525,7 +5525,7 @@ ] }, "1477": { - "op": "bytec 14 // \"secondary_market_opening_date\"", + "op": "bytec 15 // \"secondary_market_opening_date\"", "defined_out": [ "\"secondary_market_opening_date\"", "array_head_and_tail%0#0", @@ -5670,7 +5670,7 @@ "op": "assert // Invalid secondary market closure date" }, "1513": { - "op": "bytec 15 // \"secondary_market_closure_date\"" + "op": "bytec 16 // \"secondary_market_closure_date\"" }, "1515": { "op": "swap" @@ -5695,7 +5695,7 @@ ] }, "1518": { - "op": "bytec 14 // \"secondary_market_opening_date\"", + "op": "bytec 15 // \"secondary_market_opening_date\"", "defined_out": [ "\"secondary_market_opening_date\"", "0" @@ -5750,7 +5750,7 @@ ] }, "1524": { - "op": "bytec 15 // \"secondary_market_closure_date\"", + "op": "bytec 16 // \"secondary_market_closure_date\"", "defined_out": [ "\"secondary_market_closure_date\"", "0", @@ -5837,7 +5837,7 @@ ] }, "1537": { - "op": "bytec 17 // \"defaulted\"", + "op": "bytec 18 // \"defaulted\"", "defined_out": [ "\"defaulted\"", "0" @@ -7997,7 +7997,7 @@ ] }, "2008": { - "op": "bytec 16 // \"suspended\"", + "op": "bytec 17 // \"suspended\"", "defined_out": [ "\"suspended\"", "0" @@ -8537,7 +8537,7 @@ "op": "intc_0 // 0" }, "2093": { - "op": "bytec 11 // \"primary_distribution_opening_date\"" + "op": "bytec 12 // \"primary_distribution_opening_date\"" }, "2095": { "op": "app_global_get_ex" @@ -8565,7 +8565,7 @@ "op": "intc_0 // 0" }, "2107": { - "op": "bytec 12 // \"primary_distribution_closure_date\"" + "op": "bytec 13 // \"primary_distribution_closure_date\"" }, "2109": { "op": "app_global_get_ex" @@ -9756,7 +9756,7 @@ ] }, "2276": { - "op": "bytec 16 // \"suspended\"", + "op": "bytec 17 // \"suspended\"", "defined_out": [ "\"suspended\"", "reinterpret_uint64%0#0" @@ -10361,7 +10361,7 @@ ] }, "2422": { - "op": "bytec 17 // \"defaulted\"", + "op": "bytec 18 // \"defaulted\"", "defined_out": [ "\"defaulted\"", "reinterpret_uint64%0#0" @@ -10474,19 +10474,19 @@ ] }, "2441": { - "op": "bytec_1 // \"circulating_units\"", + "op": "bytec 10 // \"settlement_asset_id\"", "defined_out": [ - "\"circulating_units\"", + "\"settlement_asset_id\"", "0", "val_as_bytes%0#0" ], "stack_out": [ "val_as_bytes%0#0", "0", - "\"circulating_units\"" + "\"settlement_asset_id\"" ] }, - "2442": { + "2443": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -10499,231 +10499,317 @@ "maybe_exists%1#0" ] }, - "2443": { + "2444": { + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", + "stack_out": [ + "val_as_bytes%0#0", + "maybe_value%1#0" + ] + }, + "2445": { + "op": "itob", + "defined_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ] + }, + "2446": { + "op": "intc_0 // 0", + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "0" + ] + }, + "2447": { + "op": "bytec_1 // \"circulating_units\"", + "defined_out": [ + "\"circulating_units\"", + "0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "0", + "\"circulating_units\"" + ] + }, + "2448": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%2#0", + "maybe_value%2#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "2449": { "error": "check self.circulating_units exists", "op": "assert // check self.circulating_units exists", "stack_out": [ "val_as_bytes%0#0", - "maybe_value%1#0" + "val_as_bytes%1#0", + "maybe_value%2#0" ] }, - "2444": { + "2450": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", - "maybe_value%1#0", + "val_as_bytes%1#0", + "maybe_value%2#0", "0" ] }, - "2445": { + "2451": { "op": "bytec_3 // \"unit_value\"", "defined_out": [ "\"unit_value\"", "0", - "maybe_value%1#0", - "val_as_bytes%0#0" + "maybe_value%2#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" ], "stack_out": [ "val_as_bytes%0#0", - "maybe_value%1#0", + "val_as_bytes%1#0", + "maybe_value%2#0", "0", "\"unit_value\"" ] }, - "2446": { + "2452": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%2#0", - "maybe_value%1#0", + "maybe_exists%3#0", "maybe_value%2#0", - "val_as_bytes%0#0" + "maybe_value%3#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" ], "stack_out": [ "val_as_bytes%0#0", - "maybe_value%1#0", + "val_as_bytes%1#0", "maybe_value%2#0", - "maybe_exists%2#0" + "maybe_value%3#0", + "maybe_exists%3#0" ] }, - "2447": { + "2453": { "error": "check self.unit_value exists", "op": "assert // check self.unit_value exists", "stack_out": [ "val_as_bytes%0#0", - "maybe_value%1#0", - "maybe_value%2#0" + "val_as_bytes%1#0", + "maybe_value%2#0", + "maybe_value%3#0" ] }, - "2448": { + "2454": { "op": "*", "defined_out": [ "to_encode%0#0", - "val_as_bytes%0#0" + "val_as_bytes%0#0", + "val_as_bytes%1#0" ], "stack_out": [ "val_as_bytes%0#0", + "val_as_bytes%1#0", "to_encode%0#0" ] }, - "2449": { + "2455": { "op": "itob", "defined_out": [ "val_as_bytes%0#0", - "val_as_bytes%1#0" + "val_as_bytes%1#0", + "val_as_bytes%2#0" ], "stack_out": [ "val_as_bytes%0#0", - "val_as_bytes%1#0" + "val_as_bytes%1#0", + "val_as_bytes%2#0" ] }, - "2450": { + "2456": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", + "val_as_bytes%2#0", "0" ] }, - "2451": { + "2457": { "op": "bytec_3 // \"unit_value\"", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", + "val_as_bytes%2#0", "0", "\"unit_value\"" ] }, - "2452": { + "2458": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0", + "maybe_exists%4#0", + "maybe_value%4#0", "val_as_bytes%0#0", - "val_as_bytes%1#0" + "val_as_bytes%1#0", + "val_as_bytes%2#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", - "maybe_value%3#0", - "maybe_exists%3#0" + "val_as_bytes%2#0", + "maybe_value%4#0", + "maybe_exists%4#0" ] }, - "2453": { + "2459": { "error": "check self.unit_value exists", "op": "assert // check self.unit_value exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", - "maybe_value%3#0" + "val_as_bytes%2#0", + "maybe_value%4#0" ] }, - "2454": { + "2460": { "op": "itob", "defined_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ] }, - "2455": { + "2461": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "0" ] }, - "2456": { - "op": "bytec 10 // \"day_count_convention\"", + "2462": { + "op": "bytec 11 // \"day_count_convention\"", "defined_out": [ "\"day_count_convention\"", "0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "0", "\"day_count_convention\"" ] }, - "2458": { + "2464": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%4#0", - "maybe_value%4#0", + "maybe_exists%5#0", + "maybe_value%5#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "maybe_value%4#0", - "maybe_exists%4#0" + "val_as_bytes%3#0", + "maybe_value%5#0", + "maybe_exists%5#0" ] }, - "2459": { + "2465": { "error": "check self.day_count_convention exists", "op": "assert // check self.day_count_convention exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "maybe_value%4#0" + "val_as_bytes%3#0", + "maybe_value%5#0" ] }, - "2460": { + "2466": { "op": "itob", "defined_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%3#0" + "val_as_bytes%3#0", + "val_as_bytes%4#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%3#0" + "val_as_bytes%3#0", + "val_as_bytes%4#0" ] }, - "2461": { + "2467": { "op": "extract 7 1", "defined_out": [ "tmp%0#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0" ] }, - "2464": { + "2470": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "0" ] }, - "2465": { + "2471": { "op": "bytec 20 // \"interest_rate\"", "defined_out": [ "\"interest_rate\"", @@ -10731,93 +10817,103 @@ "tmp%0#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "0", "\"interest_rate\"" ] }, - "2467": { + "2473": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%5#0", - "maybe_value%5#0", + "maybe_exists%6#0", + "maybe_value%6#0", "tmp%0#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "maybe_value%5#0", - "maybe_exists%5#0" + "maybe_value%6#0", + "maybe_exists%6#0" ] }, - "2468": { + "2474": { "error": "check self.interest_rate exists", "op": "assert // check self.interest_rate exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "maybe_value%5#0" + "maybe_value%6#0" ] }, - "2469": { + "2475": { "op": "itob", "defined_out": [ "tmp%0#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%4#0" + "val_as_bytes%3#0", + "val_as_bytes%5#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "val_as_bytes%4#0" + "val_as_bytes%5#0" ] }, - "2470": { + "2476": { "op": "extract 6 2", "defined_out": [ "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0" ] }, - "2473": { + "2479": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", "0" ] }, - "2474": { + "2480": { "op": "bytec 4 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -10826,52 +10922,57 @@ "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", "0", "\"total_units\"" ] }, - "2476": { + "2482": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%6#0", - "maybe_value%6#0", + "maybe_exists%7#0", + "maybe_value%7#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "maybe_value%6#0", - "maybe_exists%6#0" + "maybe_value%7#0", + "maybe_exists%7#0" ] }, - "2477": { + "2483": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "maybe_value%6#0" + "maybe_value%7#0" ] }, - "2478": { + "2484": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -10879,79 +10980,86 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0" + "val_as_bytes%3#0", + "val_as_bytes%6#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0" + "val_as_bytes%6#0" ] }, - "2479": { + "2485": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", + "val_as_bytes%6#0", "0" ] }, - "2480": { + "2486": { "op": "bytec_1 // \"circulating_units\"", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", + "val_as_bytes%6#0", "0", "\"circulating_units\"" ] }, - "2481": { + "2487": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%7#0", - "maybe_value%7#0", + "maybe_exists%8#0", + "maybe_value%8#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0" + "val_as_bytes%3#0", + "val_as_bytes%6#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", - "maybe_value%7#0", - "maybe_exists%7#0" + "val_as_bytes%6#0", + "maybe_value%8#0", + "maybe_exists%8#0" ] }, - "2482": { + "2488": { "error": "check self.circulating_units exists", "op": "assert // check self.circulating_units exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", - "maybe_value%7#0" + "val_as_bytes%6#0", + "maybe_value%8#0" ] }, - "2483": { + "2489": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -10959,34 +11067,37 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", - "val_as_bytes%6#0" + "val_as_bytes%3#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", - "val_as_bytes%6#0" + "val_as_bytes%6#0", + "val_as_bytes%7#0" ] }, - "2484": { + "2490": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", + "val_as_bytes%7#0", "0" ] }, - "2485": { - "op": "bytec 11 // \"primary_distribution_opening_date\"", + "2491": { + "op": "bytec 12 // \"primary_distribution_opening_date\"", "defined_out": [ "\"primary_distribution_opening_date\"", "0", @@ -10995,61 +11106,66 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", - "val_as_bytes%6#0" + "val_as_bytes%3#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", + "val_as_bytes%7#0", "0", "\"primary_distribution_opening_date\"" ] }, - "2487": { + "2493": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%8#0", - "maybe_value%8#0", + "maybe_exists%9#0", + "maybe_value%9#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", - "val_as_bytes%6#0" + "val_as_bytes%3#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", - "maybe_value%8#0", - "maybe_exists%8#0" + "val_as_bytes%7#0", + "maybe_value%9#0", + "maybe_exists%9#0" ] }, - "2488": { + "2494": { "error": "check self.primary_distribution_opening_date exists", "op": "assert // check self.primary_distribution_opening_date exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", - "maybe_value%8#0" + "val_as_bytes%7#0", + "maybe_value%9#0" ] }, - "2489": { + "2495": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -11057,37 +11173,40 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", - "val_as_bytes%7#0" + "val_as_bytes%7#0", + "val_as_bytes%8#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", - "val_as_bytes%7#0" + "val_as_bytes%7#0", + "val_as_bytes%8#0" ] }, - "2490": { + "2496": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", + "val_as_bytes%8#0", "0" ] }, - "2491": { - "op": "bytec 12 // \"primary_distribution_closure_date\"", + "2497": { + "op": "bytec 13 // \"primary_distribution_closure_date\"", "defined_out": [ "\"primary_distribution_closure_date\"", "0", @@ -11096,66 +11215,71 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", - "val_as_bytes%7#0" + "val_as_bytes%7#0", + "val_as_bytes%8#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", + "val_as_bytes%8#0", "0", "\"primary_distribution_closure_date\"" ] }, - "2493": { + "2499": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%9#0", - "maybe_value%9#0", + "maybe_exists%10#0", + "maybe_value%10#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", - "val_as_bytes%7#0" + "val_as_bytes%7#0", + "val_as_bytes%8#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", - "maybe_value%9#0", - "maybe_exists%9#0" + "val_as_bytes%8#0", + "maybe_value%10#0", + "maybe_exists%10#0" ] }, - "2494": { + "2500": { "error": "check self.primary_distribution_closure_date exists", "op": "assert // check self.primary_distribution_closure_date exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", - "maybe_value%9#0" + "val_as_bytes%8#0", + "maybe_value%10#0" ] }, - "2495": { + "2501": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -11163,40 +11287,43 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", - "val_as_bytes%8#0" + "val_as_bytes%8#0", + "val_as_bytes%9#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", - "val_as_bytes%8#0" + "val_as_bytes%8#0", + "val_as_bytes%9#0" ] }, - "2496": { + "2502": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", + "val_as_bytes%9#0", "0" ] }, - "2497": { - "op": "bytec 13 // \"issuance_date\"", + "2503": { + "op": "bytec 14 // \"issuance_date\"", "defined_out": [ "\"issuance_date\"", "0", @@ -11205,79 +11332,85 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", - "val_as_bytes%8#0" + "val_as_bytes%8#0", + "val_as_bytes%9#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", + "val_as_bytes%9#0", "0", "\"issuance_date\"" ] }, - "2499": { + "2505": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%10#0", - "maybe_value%10#0", + "maybe_exists%11#0", + "maybe_value%11#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", - "val_as_bytes%8#0" + "val_as_bytes%8#0", + "val_as_bytes%9#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", - "maybe_value%10#0", - "maybe_exists%10#0" + "val_as_bytes%9#0", + "maybe_value%11#0", + "maybe_exists%11#0" ] }, - "2500": { + "2506": { "error": "check self.issuance_date exists", "op": "assert // check self.issuance_date exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", - "maybe_value%10#0" + "val_as_bytes%9#0", + "maybe_value%11#0" ] }, - "2501": { + "2507": { "op": "itob", "defined_out": [ "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", + "val_as_bytes%10#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -11287,32 +11420,34 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", - "val_as_bytes%9#0" + "val_as_bytes%9#0", + "val_as_bytes%10#0" ] }, - "2502": { + "2508": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", + "val_as_bytes%10#0", "0" ] }, - "2503": { + "2509": { "op": "bytec 6 // \"maturity_date\"", "defined_out": [ "\"maturity_date\"", @@ -11321,8 +11456,9 @@ "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", + "val_as_bytes%10#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -11332,28 +11468,30 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", + "val_as_bytes%10#0", "0", "\"maturity_date\"" ] }, - "2505": { + "2511": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%11#0", - "maybe_value%11#0", + "maybe_exists%12#0", + "maybe_value%12#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", + "val_as_bytes%10#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -11363,35 +11501,37 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", - "maybe_value%11#0", - "maybe_exists%11#0" + "val_as_bytes%10#0", + "maybe_value%12#0", + "maybe_exists%12#0" ] }, - "2506": { + "2512": { "error": "check self.maturity_date exists", "op": "assert // check self.maturity_date exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", - "maybe_value%11#0" + "val_as_bytes%10#0", + "maybe_value%12#0" ] }, - "2507": { + "2513": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -11399,8 +11539,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -11410,35 +11551,37 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", - "val_as_bytes%10#0" + "val_as_bytes%10#0", + "val_as_bytes%11#0" ] }, - "2508": { + "2514": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "0" ] }, - "2509": { - "op": "bytec 16 // \"suspended\"", + "2515": { + "op": "bytec 17 // \"suspended\"", "defined_out": [ "\"suspended\"", "0", @@ -11447,8 +11590,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -11458,30 +11602,32 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "0", "\"suspended\"" ] }, - "2511": { + "2517": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%12#0", - "maybe_value%12#0", + "maybe_exists%13#0", + "maybe_value%13#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -11491,48 +11637,51 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", - "maybe_value%12#0", - "maybe_exists%12#0" + "val_as_bytes%11#0", + "maybe_value%13#0", + "maybe_exists%13#0" ] }, - "2512": { + "2518": { "error": "check self.suspended exists", "op": "assert // check self.suspended exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", - "maybe_value%12#0" + "val_as_bytes%11#0", + "maybe_value%13#0" ] }, - "2513": { + "2519": { "op": "bytec 27 // 0x00", "defined_out": [ "0x00", - "maybe_value%12#0", + "maybe_value%13#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -11542,57 +11691,60 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", - "maybe_value%12#0", + "val_as_bytes%11#0", + "maybe_value%13#0", "0x00" ] }, - "2515": { + "2521": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", - "maybe_value%12#0", + "val_as_bytes%11#0", + "maybe_value%13#0", "0x00", "0" ] }, - "2516": { + "2522": { "op": "uncover 2", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "0x00", "0", - "maybe_value%12#0" + "maybe_value%13#0" ] }, - "2518": { + "2524": { "op": "setbit", "defined_out": [ "encoded_bool%0#0", @@ -11601,8 +11753,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -11612,37 +11765,39 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0" ] }, - "2519": { + "2525": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "0" ] }, - "2520": { - "op": "bytec 17 // \"defaulted\"", + "2526": { + "op": "bytec 18 // \"defaulted\"", "defined_out": [ "\"defaulted\"", "0", @@ -11652,8 +11807,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -11663,32 +11819,34 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "0", "\"defaulted\"" ] }, - "2522": { + "2528": { "op": "app_global_get_ex", "defined_out": [ "encoded_bool%0#0", - "maybe_exists%13#0", - "maybe_value%13#0", + "maybe_exists%14#0", + "maybe_value%14#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -11698,98 +11856,103 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", - "maybe_value%13#0", - "maybe_exists%13#0" + "maybe_value%14#0", + "maybe_exists%14#0" ] }, - "2523": { + "2529": { "error": "check self.defaulted exists", "op": "assert // check self.defaulted exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", - "maybe_value%13#0" + "maybe_value%14#0" ] }, - "2524": { + "2530": { "op": "bytec 27 // 0x00", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", - "maybe_value%13#0", + "maybe_value%14#0", "0x00" ] }, - "2526": { + "2532": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", - "maybe_value%13#0", + "maybe_value%14#0", "0x00", "0" ] }, - "2527": { + "2533": { "op": "uncover 2", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "0x00", "0", - "maybe_value%13#0" + "maybe_value%14#0" ] }, - "2529": { + "2535": { "op": "setbit", "defined_out": [ "encoded_bool%0#0", @@ -11799,8 +11962,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -11810,40 +11974,42 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0" ] }, - "2530": { - "op": "uncover 12" + "2536": { + "op": "uncover 13" }, - "2532": { - "op": "uncover 12", + "2538": { + "op": "uncover 13", "stack_out": [ "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0" ] }, - "2534": { + "2540": { "op": "concat", "defined_out": [ "encoded_bool%0#0", @@ -11852,8 +12018,9 @@ "tmp%0#0", "tmp%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -11861,37 +12028,39 @@ ], "stack_out": [ "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%2#0" ] }, - "2535": { - "op": "uncover 11", + "2541": { + "op": "uncover 12", "stack_out": [ + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%2#0", "val_as_bytes%2#0" ] }, - "2537": { + "2543": { "op": "concat", "defined_out": [ "encoded_bool%0#0", @@ -11900,130 +12069,140 @@ "tmp%0#0", "tmp%1#0", "val_as_bytes%10#0", - "val_as_bytes%5#0", + "val_as_bytes%11#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0" ], "stack_out": [ + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%3#0" ] }, - "2538": { - "op": "uncover 10", + "2544": { + "op": "uncover 11", "stack_out": [ + "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%3#0", - "tmp%0#0" + "val_as_bytes%3#0" ] }, - "2540": { + "2546": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%4#0", + "tmp%0#0", "tmp%1#0", "val_as_bytes%10#0", - "val_as_bytes%5#0", + "val_as_bytes%11#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0" ], "stack_out": [ + "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%4#0" ] }, - "2541": { - "op": "uncover 9", + "2547": { + "op": "uncover 10", "stack_out": [ - "val_as_bytes%5#0", + "tmp%1#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%4#0", - "tmp%1#0" + "tmp%0#0" ] }, - "2543": { + "2549": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%5#0", + "tmp%1#0", "val_as_bytes%10#0", - "val_as_bytes%5#0", + "val_as_bytes%11#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0" ], "stack_out": [ - "val_as_bytes%5#0", + "tmp%1#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%5#0" ] }, - "2544": { - "op": "uncover 8", + "2550": { + "op": "uncover 9", "stack_out": [ "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%5#0", - "val_as_bytes%5#0" + "tmp%1#0" ] }, - "2546": { + "2552": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%6#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -12035,31 +12214,34 @@ "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%6#0" ] }, - "2547": { - "op": "uncover 7", + "2553": { + "op": "uncover 8", "stack_out": [ "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%6#0", "val_as_bytes%6#0" ] }, - "2549": { + "2555": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%7#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0" @@ -12069,30 +12251,33 @@ "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%7#0" ] }, - "2550": { - "op": "uncover 6", + "2556": { + "op": "uncover 7", "stack_out": [ "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%7#0", "val_as_bytes%7#0" ] }, - "2552": { + "2558": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%8#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%8#0", "val_as_bytes%9#0" ], @@ -12100,161 +12285,193 @@ "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%8#0" ] }, - "2553": { - "op": "uncover 5", + "2559": { + "op": "uncover 6", "stack_out": [ "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%8#0", "val_as_bytes%8#0" ] }, - "2555": { + "2561": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%9#0" ], "stack_out": [ "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%9#0" ] }, - "2556": { - "op": "uncover 4", + "2562": { + "op": "uncover 5", "stack_out": [ "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%9#0", "val_as_bytes%9#0" ] }, - "2558": { + "2564": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%10#0", - "val_as_bytes%10#0" + "val_as_bytes%10#0", + "val_as_bytes%11#0" ], "stack_out": [ "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%10#0" ] }, - "2559": { - "op": "uncover 3", + "2565": { + "op": "uncover 4", "stack_out": [ + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%10#0", "val_as_bytes%10#0" ] }, - "2561": { + "2567": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", - "encoded_tuple_buffer%11#0" + "encoded_tuple_buffer%11#0", + "val_as_bytes%11#0" ], "stack_out": [ + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%11#0" ] }, - "2562": { - "op": "uncover 2", + "2568": { + "op": "uncover 3", "stack_out": [ + "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%11#0", - "encoded_bool%0#0" + "val_as_bytes%11#0" ] }, - "2564": { + "2570": { "op": "concat", "defined_out": [ + "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%12#0" ], "stack_out": [ + "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%12#0" ] }, - "2565": { - "op": "swap", + "2571": { + "op": "uncover 2", "stack_out": [ + "encoded_bool%1#0", "encoded_tuple_buffer%12#0", + "encoded_bool%0#0" + ] + }, + "2573": { + "op": "concat", + "defined_out": [ + "encoded_bool%1#0", + "encoded_tuple_buffer%13#0" + ], + "stack_out": [ + "encoded_bool%1#0", + "encoded_tuple_buffer%13#0" + ] + }, + "2574": { + "op": "swap", + "stack_out": [ + "encoded_tuple_buffer%13#0", "encoded_bool%1#0" ] }, - "2566": { + "2575": { "op": "intc_0 // 0", "stack_out": [ - "encoded_tuple_buffer%12#0", + "encoded_tuple_buffer%13#0", "encoded_bool%1#0", "0" ] }, - "2567": { + "2576": { "op": "getbit", "defined_out": [ - "encoded_tuple_buffer%12#0", + "encoded_tuple_buffer%13#0", "is_true%0#0" ], "stack_out": [ - "encoded_tuple_buffer%12#0", + "encoded_tuple_buffer%13#0", "is_true%0#0" ] }, - "2568": { - "op": "pushint 601 // 601" + "2577": { + "op": "pushint 665 // 665" }, - "2571": { + "2580": { "op": "swap", "defined_out": [ - "601", - "encoded_tuple_buffer%12#0", + "665", + "encoded_tuple_buffer%13#0", "is_true%0#0" ], "stack_out": [ - "encoded_tuple_buffer%12#0", - "601", + "encoded_tuple_buffer%13#0", + "665", "is_true%0#0" ] }, - "2572": { + "2581": { "op": "setbit", "defined_out": [ - "encoded_tuple_buffer%13#0" + "encoded_tuple_buffer%14#0" ], "stack_out": [ - "encoded_tuple_buffer%13#0" + "encoded_tuple_buffer%14#0" ] }, - "2573": { + "2582": { "retsub": true, "op": "retsub" }, - "2574": { + "2583": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_account_info", "params": { "holding_address#0": "bytes" @@ -12263,7 +12480,7 @@ "stack_in": [], "op": "proto 1 1" }, - "2577": { + "2586": { "op": "bytec 7 // 0x52333023", "defined_out": [ "0x52333023" @@ -12272,7 +12489,7 @@ "0x52333023" ] }, - "2579": { + "2588": { "op": "frame_dig -1", "defined_out": [ "0x52333023", @@ -12283,7 +12500,7 @@ "holding_address#0 (copy)" ] }, - "2581": { + "2590": { "op": "concat", "defined_out": [ "tmp%0#1" @@ -12292,7 +12509,7 @@ "tmp%0#1" ] }, - "2582": { + "2591": { "op": "dup", "defined_out": [ "tmp%0#1", @@ -12303,7 +12520,7 @@ "tmp%0#1 (copy)" ] }, - "2583": { + "2592": { "op": "box_len", "defined_out": [ "maybe_exists%0#0", @@ -12316,21 +12533,21 @@ "maybe_exists%0#0" ] }, - "2584": { + "2593": { "op": "bury 1", "stack_out": [ "tmp%0#1", "maybe_exists%0#0" ] }, - "2586": { + "2595": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ "tmp%0#1" ] }, - "2587": { + "2596": { "op": "box_get", "defined_out": [ "maybe_exists%0#0", @@ -12341,31 +12558,31 @@ "maybe_exists%0#0" ] }, - "2588": { + "2597": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ "maybe_value%0#0" ] }, - "2589": { + "2598": { "retsub": true, "op": "retsub" }, - "2590": { + "2599": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_time_events", "params": {}, "block": "get_time_events", "stack_in": [], "op": "proto 0 1" }, - "2593": { + "2602": { "op": "pushbytes 0x0000" }, - "2597": { + "2606": { "op": "intc_0 // 0" }, - "2598": { + "2607": { "op": "bytec_2 // \"status\"", "defined_out": [ "\"status\"", @@ -12378,7 +12595,7 @@ "\"status\"" ] }, - "2599": { + "2608": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -12391,7 +12608,7 @@ "maybe_exists%0#0" ] }, - "2600": { + "2609": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -12399,7 +12616,7 @@ "maybe_value%0#0" ] }, - "2601": { + "2610": { "op": "pushint 100 // 100", "defined_out": [ "100", @@ -12412,7 +12629,7 @@ "100" ] }, - "2603": { + "2612": { "op": "==", "defined_out": [ "time_events#0", @@ -12423,29 +12640,29 @@ "tmp%0#1" ] }, - "2604": { + "2613": { "op": "bz get_time_events_after_if_else@2", "stack_out": [ "time_events#0" ] }, - "2607": { + "2616": { "op": "bytec 21 // 0x74696d654576656e7473" }, - "2609": { + "2618": { "op": "box_get" }, - "2610": { + "2619": { "op": "swap" }, - "2611": { + "2620": { "op": "frame_bury 0" }, - "2613": { + "2622": { "error": "check self.time_events exists", "op": "assert // check self.time_events exists" }, - "2614": { + "2623": { "block": "get_time_events_after_if_else@2", "stack_in": [ "time_events#0" @@ -12459,21 +12676,21 @@ "time_events#0" ] }, - "2616": { + "2625": { "op": "swap" }, - "2617": { + "2626": { "retsub": true, "op": "retsub" }, - "2618": { + "2627": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_secondary_market_schedule", "params": {}, "block": "get_secondary_market_schedule", "stack_in": [], "op": "proto 0 1" }, - "2621": { + "2630": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -12482,8 +12699,8 @@ "0" ] }, - "2622": { - "op": "bytec 14 // \"secondary_market_opening_date\"", + "2631": { + "op": "bytec 15 // \"secondary_market_opening_date\"", "defined_out": [ "\"secondary_market_opening_date\"", "0" @@ -12493,7 +12710,7 @@ "\"secondary_market_opening_date\"" ] }, - "2624": { + "2633": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -12504,14 +12721,14 @@ "maybe_exists%0#0" ] }, - "2625": { + "2634": { "error": "check self.secondary_market_opening_date exists", "op": "assert // check self.secondary_market_opening_date exists", "stack_out": [ "maybe_value%0#0" ] }, - "2626": { + "2635": { "op": "itob", "defined_out": [ "val_as_bytes%0#0" @@ -12520,15 +12737,15 @@ "val_as_bytes%0#0" ] }, - "2627": { + "2636": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "0" ] }, - "2628": { - "op": "bytec 15 // \"secondary_market_closure_date\"", + "2637": { + "op": "bytec 16 // \"secondary_market_closure_date\"", "defined_out": [ "\"secondary_market_closure_date\"", "0", @@ -12540,7 +12757,7 @@ "\"secondary_market_closure_date\"" ] }, - "2630": { + "2639": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -12553,7 +12770,7 @@ "maybe_exists%1#0" ] }, - "2631": { + "2640": { "error": "check self.secondary_market_closure_date exists", "op": "assert // check self.secondary_market_closure_date exists", "stack_out": [ @@ -12561,7 +12778,7 @@ "maybe_value%1#0" ] }, - "2632": { + "2641": { "op": "itob", "defined_out": [ "val_as_bytes%0#0", @@ -12572,7 +12789,7 @@ "val_as_bytes%1#0" ] }, - "2633": { + "2642": { "op": "concat", "defined_out": [ "result%1#0" @@ -12581,7 +12798,7 @@ "result%1#0" ] }, - "2634": { + "2643": { "op": "pushbytes 0x0002", "defined_out": [ "0x0002", @@ -12592,14 +12809,14 @@ "0x0002" ] }, - "2638": { + "2647": { "op": "swap", "stack_out": [ "0x0002", "result%1#0" ] }, - "2639": { + "2648": { "op": "concat", "defined_out": [ "array_data%0#0" @@ -12608,18 +12825,18 @@ "array_data%0#0" ] }, - "2640": { + "2649": { "retsub": true, "op": "retsub" }, - "2641": { + "2650": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_metadata", "params": {}, "block": "get_asset_metadata", "stack_in": [], "op": "proto 0 1" }, - "2644": { + "2653": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -12628,7 +12845,7 @@ "0" ] }, - "2645": { + "2654": { "op": "bytec 19 // \"metadata\"", "defined_out": [ "\"metadata\"", @@ -12639,7 +12856,7 @@ "\"metadata\"" ] }, - "2647": { + "2656": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -12650,14 +12867,14 @@ "maybe_exists%0#0" ] }, - "2648": { + "2657": { "error": "check self.metadata exists", "op": "assert // check self.metadata exists", "stack_out": [ "maybe_value%0#0" ] }, - "2649": { + "2658": { "op": "dup", "defined_out": [ "maybe_value%0#0", @@ -12668,7 +12885,7 @@ "maybe_value%0#0 (copy)" ] }, - "2650": { + "2659": { "op": "len", "defined_out": [ "length%0#0", @@ -12679,7 +12896,7 @@ "length%0#0" ] }, - "2651": { + "2660": { "op": "itob", "defined_out": [ "as_bytes%0#0", @@ -12690,7 +12907,7 @@ "as_bytes%0#0" ] }, - "2652": { + "2661": { "op": "extract 6 2", "defined_out": [ "length_uint16%0#0", @@ -12701,14 +12918,14 @@ "length_uint16%0#0" ] }, - "2655": { + "2664": { "op": "swap", "stack_out": [ "length_uint16%0#0", "maybe_value%0#0" ] }, - "2656": { + "2665": { "op": "concat", "defined_out": [ "encoded_value%0#0" @@ -12717,22 +12934,22 @@ "encoded_value%0#0" ] }, - "2657": { + "2666": { "retsub": true, "op": "retsub" }, - "2658": { + "2667": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.asset_update", "params": {}, "block": "asset_update", "stack_in": [], "op": "proto 0 0" }, - "2661": { + "2670": { "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger", "op": "callsub assert_caller_is_arranger" }, - "2664": { + "2673": { "retsub": true, "op": "retsub" } diff --git a/smart_contracts/artifacts/base_d_asa/BaseDAsa.approval.teal b/smart_contracts/artifacts/base_d_asa/BaseDAsa.approval.teal index 8f971f6..9f89bb3 100644 --- a/smart_contracts/artifacts/base_d_asa/BaseDAsa.approval.teal +++ b/smart_contracts/artifacts/base_d_asa/BaseDAsa.approval.teal @@ -4,7 +4,7 @@ // smart_contracts.base_d_asa.contract.BaseDAsa.__algopy_entrypoint_with_init() -> uint64: main: intcblock 0 1 8 4 200 - bytecblock 0x151f7c75 "circulating_units" "status" "unit_value" "total_units" "total_coupons" "maturity_date" 0x52333023 0x52323023 "denomination_asset_id" "day_count_convention" "primary_distribution_opening_date" "primary_distribution_closure_date" "issuance_date" "secondary_market_opening_date" "secondary_market_closure_date" "suspended" "defaulted" "settlement_asset_id" "metadata" "interest_rate" 0x74696d654576656e7473 0x52373023 0x52363023 0x52353023 0x52343023 0x0000000000000000 0x00 0x636f75706f6e5261746573 0x068101 0x52383023 + bytecblock 0x151f7c75 "circulating_units" "status" "unit_value" "total_units" "total_coupons" "maturity_date" 0x52333023 0x52323023 "denomination_asset_id" "settlement_asset_id" "day_count_convention" "primary_distribution_opening_date" "primary_distribution_closure_date" "issuance_date" "secondary_market_opening_date" "secondary_market_closure_date" "suspended" "defaulted" "metadata" "interest_rate" 0x74696d654576656e7473 0x52373023 0x52363023 0x52353023 0x52343023 0x0000000000000000 0x00 0x636f75706f6e5261746573 0x068101 0x52383023 txn ApplicationID bnz main_after_if_else@2 // smart_contracts/base_d_asa/contract.py:41-42 @@ -21,7 +21,7 @@ main: app_global_put // smart_contracts/base_d_asa/contract.py:61 // self.settlement_asset_id = UInt64() - bytec 18 // "settlement_asset_id" + bytec 10 // "settlement_asset_id" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:62 @@ -31,7 +31,7 @@ main: app_global_put // smart_contracts/base_d_asa/contract.py:63 // self.day_count_convention = UInt64() - bytec 10 // "day_count_convention" + bytec 11 // "day_count_convention" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:65-66 @@ -64,27 +64,27 @@ main: app_global_put // smart_contracts/base_d_asa/contract.py:82 // self.primary_distribution_opening_date = UInt64() - bytec 11 // "primary_distribution_opening_date" + bytec 12 // "primary_distribution_opening_date" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:83 // self.primary_distribution_closure_date = UInt64() - bytec 12 // "primary_distribution_closure_date" + bytec 13 // "primary_distribution_closure_date" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:84 // self.issuance_date = UInt64() - bytec 13 // "issuance_date" + bytec 14 // "issuance_date" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:85 // self.secondary_market_opening_date = UInt64() - bytec 14 // "secondary_market_opening_date" + bytec 15 // "secondary_market_opening_date" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:86 // self.secondary_market_closure_date = UInt64() - bytec 15 // "secondary_market_closure_date" + bytec 16 // "secondary_market_closure_date" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:87 @@ -100,12 +100,12 @@ main: app_global_put // smart_contracts/base_d_asa/contract.py:91 // self.suspended = UInt64() - bytec 16 // "suspended" + bytec 17 // "suspended" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:92 // self.defaulted = UInt64() - bytec 17 // "defaulted" + bytec 18 // "defaulted" intc_0 // 0 app_global_put @@ -114,7 +114,7 @@ main_after_if_else@2: // class BaseDAsa(ARC4Contract): txn NumAppArgs bz main_bare_routing@21 - pushbytess 0x63f99589 0xd3a4d6ab 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x301dd919 0xed02759f 0xfad2173e 0x08efea35 0xddcec07b // method "asset_create(address,byte[])void", method "asset_config(uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", method "set_secondary_time_events(uint64[])(uint64,uint64)", method "assign_role(address,uint8,byte[])uint64", method "revoke_role(address,uint8)uint64", method "open_account(address,address)uint64", method "close_account(address)(uint64,uint64)", method "primary_distribution(address,uint64)uint64", method "set_asset_suspension(bool)uint64", method "set_account_suspension(address,bool)uint64", method "set_default_status(bool)void", method "get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", method "get_account_info(address)(address,uint64,uint64,uint64,bool)", method "get_time_events()uint64[]", method "get_secondary_market_schedule()uint64[]", method "get_asset_metadata()byte[]" + pushbytess 0x63f99589 0xd3a4d6ab 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x80bfcdd1 0xed02759f 0xfad2173e 0x08efea35 0xddcec07b // method "asset_create(address,byte[])void", method "asset_config(uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", method "set_secondary_time_events(uint64[])(uint64,uint64)", method "assign_role(address,uint8,byte[])uint64", method "revoke_role(address,uint8)uint64", method "open_account(address,address)uint64", method "close_account(address)(uint64,uint64)", method "primary_distribution(address,uint64)uint64", method "set_asset_suspension(bool)uint64", method "set_account_suspension(address,bool)uint64", method "set_default_status(bool)void", method "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", method "get_account_info(address)(address,uint64,uint64,uint64,bool)", method "get_time_events()uint64[]", method "get_secondary_market_schedule()uint64[]", method "get_asset_metadata()byte[]" txna ApplicationArgs 0 match main_asset_create_route@5 main_asset_config_route@6 main_set_secondary_time_events_route@7 main_assign_role_route@8 main_revoke_role_route@9 main_open_account_route@10 main_close_account_route@11 main_primary_distribution_route@12 main_set_asset_suspension_route@13 main_set_account_suspension_route@14 main_set_default_status_route@15 main_get_asset_info_route@16 main_get_account_info_route@17 main_get_time_events_route@18 main_get_secondary_market_schedule_route@19 main_get_asset_metadata_route@20 @@ -125,7 +125,7 @@ main_after_if_else@23: return main_get_asset_metadata_route@20: - // smart_contracts/base_d_asa/contract.py:954 + // smart_contracts/base_d_asa/contract.py:959 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -141,7 +141,7 @@ main_get_asset_metadata_route@20: return main_get_secondary_market_schedule_route@19: - // smart_contracts/base_d_asa/contract.py:947 + // smart_contracts/base_d_asa/contract.py:946 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -157,7 +157,7 @@ main_get_secondary_market_schedule_route@19: return main_get_time_events_route@18: - // smart_contracts/base_d_asa/contract.py:934 + // smart_contracts/base_d_asa/contract.py:933 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -173,7 +173,7 @@ main_get_time_events_route@18: return main_get_account_info_route@17: - // smart_contracts/base_d_asa/contract.py:917 + // smart_contracts/base_d_asa/contract.py:916 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -183,7 +183,7 @@ main_get_account_info_route@17: // smart_contracts/base_d_asa/contract.py:28 // class BaseDAsa(ARC4Contract): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:917 + // smart_contracts/base_d_asa/contract.py:916 // @arc4.abimethod(readonly=True) callsub get_account_info bytec_0 // 0x151f7c75 @@ -194,7 +194,7 @@ main_get_account_info_route@17: return main_get_asset_info_route@16: - // smart_contracts/base_d_asa/contract.py:887 + // smart_contracts/base_d_asa/contract.py:885 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -210,7 +210,7 @@ main_get_asset_info_route@16: return main_set_default_status_route@15: - // smart_contracts/base_d_asa/contract.py:873 + // smart_contracts/base_d_asa/contract.py:871 // @arc4.abimethod txn OnCompletion ! @@ -220,14 +220,14 @@ main_set_default_status_route@15: // smart_contracts/base_d_asa/contract.py:28 // class BaseDAsa(ARC4Contract): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:873 + // smart_contracts/base_d_asa/contract.py:871 // @arc4.abimethod callsub set_default_status intc_1 // 1 return main_set_account_suspension_route@14: - // smart_contracts/base_d_asa/contract.py:850 + // smart_contracts/base_d_asa/contract.py:848 // @arc4.abimethod txn OnCompletion ! @@ -238,7 +238,7 @@ main_set_account_suspension_route@14: // class BaseDAsa(ARC4Contract): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:850 + // smart_contracts/base_d_asa/contract.py:848 // @arc4.abimethod callsub set_account_suspension bytec_0 // 0x151f7c75 @@ -249,7 +249,7 @@ main_set_account_suspension_route@14: return main_set_asset_suspension_route@13: - // smart_contracts/base_d_asa/contract.py:832 + // smart_contracts/base_d_asa/contract.py:830 // @arc4.abimethod txn OnCompletion ! @@ -259,7 +259,7 @@ main_set_asset_suspension_route@13: // smart_contracts/base_d_asa/contract.py:28 // class BaseDAsa(ARC4Contract): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:832 + // smart_contracts/base_d_asa/contract.py:830 // @arc4.abimethod callsub set_asset_suspension bytec_0 // 0x151f7c75 @@ -270,7 +270,7 @@ main_set_asset_suspension_route@13: return main_primary_distribution_route@12: - // smart_contracts/base_d_asa/contract.py:790 + // smart_contracts/base_d_asa/contract.py:788 // @arc4.abimethod txn OnCompletion ! @@ -281,7 +281,7 @@ main_primary_distribution_route@12: // class BaseDAsa(ARC4Contract): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:790 + // smart_contracts/base_d_asa/contract.py:788 // @arc4.abimethod callsub primary_distribution bytec_0 // 0x151f7c75 @@ -292,7 +292,7 @@ main_primary_distribution_route@12: return main_close_account_route@11: - // smart_contracts/base_d_asa/contract.py:760 + // smart_contracts/base_d_asa/contract.py:758 // @arc4.abimethod txn OnCompletion ! @@ -302,7 +302,7 @@ main_close_account_route@11: // smart_contracts/base_d_asa/contract.py:28 // class BaseDAsa(ARC4Contract): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:760 + // smart_contracts/base_d_asa/contract.py:758 // @arc4.abimethod callsub close_account bytec_0 // 0x151f7c75 @@ -313,7 +313,7 @@ main_close_account_route@11: return main_open_account_route@10: - // smart_contracts/base_d_asa/contract.py:725 + // smart_contracts/base_d_asa/contract.py:723 // @arc4.abimethod txn OnCompletion ! @@ -324,7 +324,7 @@ main_open_account_route@10: // class BaseDAsa(ARC4Contract): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:725 + // smart_contracts/base_d_asa/contract.py:723 // @arc4.abimethod callsub open_account bytec_0 // 0x151f7c75 @@ -335,7 +335,7 @@ main_open_account_route@10: return main_revoke_role_route@9: - // smart_contracts/base_d_asa/contract.py:677 + // smart_contracts/base_d_asa/contract.py:675 // @arc4.abimethod txn OnCompletion ! @@ -346,7 +346,7 @@ main_revoke_role_route@9: // class BaseDAsa(ARC4Contract): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:677 + // smart_contracts/base_d_asa/contract.py:675 // @arc4.abimethod callsub revoke_role bytec_0 // 0x151f7c75 @@ -357,7 +357,7 @@ main_revoke_role_route@9: return main_assign_role_route@8: - // smart_contracts/base_d_asa/contract.py:614 + // smart_contracts/base_d_asa/contract.py:612 // @arc4.abimethod txn OnCompletion ! @@ -369,7 +369,7 @@ main_assign_role_route@8: txna ApplicationArgs 1 txna ApplicationArgs 2 txna ApplicationArgs 3 - // smart_contracts/base_d_asa/contract.py:614 + // smart_contracts/base_d_asa/contract.py:612 // @arc4.abimethod callsub assign_role bytec_0 // 0x151f7c75 @@ -380,7 +380,7 @@ main_assign_role_route@8: return main_set_secondary_time_events_route@7: - // smart_contracts/base_d_asa/contract.py:558 + // smart_contracts/base_d_asa/contract.py:556 // @arc4.abimethod txn OnCompletion ! @@ -390,7 +390,7 @@ main_set_secondary_time_events_route@7: // smart_contracts/base_d_asa/contract.py:28 // class BaseDAsa(ARC4Contract): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:558 + // smart_contracts/base_d_asa/contract.py:556 // @arc4.abimethod callsub set_secondary_time_events bytec_0 // 0x151f7c75 @@ -401,7 +401,7 @@ main_set_secondary_time_events_route@7: return main_asset_config_route@6: - // smart_contracts/base_d_asa/contract.py:476 + // smart_contracts/base_d_asa/contract.py:474 // @arc4.abimethod txn OnCompletion ! @@ -419,14 +419,14 @@ main_asset_config_route@6: txna ApplicationArgs 7 txna ApplicationArgs 8 txna ApplicationArgs 9 - // smart_contracts/base_d_asa/contract.py:476 + // smart_contracts/base_d_asa/contract.py:474 // @arc4.abimethod callsub asset_config intc_1 // 1 return main_asset_create_route@5: - // smart_contracts/base_d_asa/contract.py:454 + // smart_contracts/base_d_asa/contract.py:452 // @arc4.abimethod(create="require") txn OnCompletion ! @@ -438,7 +438,7 @@ main_asset_create_route@5: // class BaseDAsa(ARC4Contract): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:454 + // smart_contracts/base_d_asa/contract.py:452 // @arc4.abimethod(create="require") callsub asset_create intc_1 // 1 @@ -453,11 +453,11 @@ main_bare_routing@21: b main_after_if_else@23 main_asset_update@22: - // smart_contracts/base_d_asa/contract.py:466 + // smart_contracts/base_d_asa/contract.py:464 // @arc4.baremethod(allow_actions=["UpdateApplication"]) txn ApplicationID assert // can only call when not creating - // smart_contracts/base_d_asa/contract.py:466-467 + // smart_contracts/base_d_asa/contract.py:464-465 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def asset_update(self) -> None: callsub asset_update @@ -467,16 +467,16 @@ main_asset_update@22: // smart_contracts.base_d_asa.contract.BaseDAsa.asset_create(arranger: bytes, metadata: bytes) -> void: asset_create: - // smart_contracts/base_d_asa/contract.py:454-455 + // smart_contracts/base_d_asa/contract.py:452-453 // @arc4.abimethod(create="require") // def asset_create(self, arranger: arc4.Address, metadata: typ.AssetMetadata) -> None: proto 2 0 - // smart_contracts/base_d_asa/contract.py:463 + // smart_contracts/base_d_asa/contract.py:461 // self.arranger.value = arranger.native bytec 8 // 0x52323023 frame_dig -2 app_global_put - // smart_contracts/base_d_asa/contract.py:464 + // smart_contracts/base_d_asa/contract.py:462 // self.metadata = metadata.native frame_dig -1 extract 2 0 @@ -488,7 +488,7 @@ asset_create: // smart_contracts.base_d_asa.contract.BaseDAsa.asset_config(denomination_asset_id: bytes, settlement_asset_id: bytes, principal: bytes, minimum_denomination: bytes, day_count_convention: bytes, interest_rate: bytes, coupon_rates: bytes, time_events: bytes, time_periods: bytes) -> void: asset_config: - // smart_contracts/base_d_asa/contract.py:476-488 + // smart_contracts/base_d_asa/contract.py:474-486 // @arc4.abimethod // def asset_config( // self, @@ -506,10 +506,10 @@ asset_config: intc_0 // 0 pushbytes "" dup - // smart_contracts/base_d_asa/contract.py:517 + // smart_contracts/base_d_asa/contract.py:515 // self.assert_caller_is_arranger() callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:518 + // smart_contracts/base_d_asa/contract.py:516 // assert self.status == cfg.STATUS_EMPTY, err.ALREADY_CONFIGURED intc_0 // 0 bytec_2 // "status" @@ -517,7 +517,7 @@ asset_config: assert // check self.status exists ! assert // D-ASA already configured - // smart_contracts/base_d_asa/contract.py:520-521 + // smart_contracts/base_d_asa/contract.py:518-519 // # Set Denomination Asset // self.assert_denomination_asset(denomination_asset_id.native) frame_dig -9 @@ -546,7 +546,7 @@ asset_config_bool_merge@5: bytec 9 // "denomination_asset_id" frame_dig 3 app_global_put - // smart_contracts/base_d_asa/contract.py:524-525 + // smart_contracts/base_d_asa/contract.py:522-523 // # Set Denomination Asset // self.assert_settlement_asset(settlement_asset_id.native) frame_dig -8 @@ -567,7 +567,7 @@ asset_config_bool_merge@5: assert // Different settlement asset not supported, must be equal to denomination asset // smart_contracts/base_d_asa/contract.py:193 // self.settlement_asset_id = settlement_asset_id - bytec 18 // "settlement_asset_id" + bytec 10 // "settlement_asset_id" swap app_global_put // smart_contracts/base_d_asa/contract.py:194-200 @@ -585,7 +585,7 @@ asset_config_bool_merge@5: // smart_contracts/base_d_asa/contract.py:196 // xfer_asset=self.settlement_asset_id, intc_0 // 0 - bytec 18 // "settlement_asset_id" + bytec 10 // "settlement_asset_id" app_global_get_ex assert // check self.settlement_asset_id exists // smart_contracts/base_d_asa/contract.py:197 @@ -612,7 +612,7 @@ asset_config_bool_merge@5: // fee=Global.min_txn_fee, // ).submit() itxn_submit - // smart_contracts/base_d_asa/contract.py:530 + // smart_contracts/base_d_asa/contract.py:528 // principal.native % minimum_denomination.native == 0 frame_dig -7 btoi @@ -621,24 +621,24 @@ asset_config_bool_merge@5: dup2 % ! - // smart_contracts/base_d_asa/contract.py:528-531 + // smart_contracts/base_d_asa/contract.py:526-529 // # Set Principal and Minimum Denomination // assert ( // principal.native % minimum_denomination.native == 0 // ), err.INVALID_MINIMUM_DENOMINATION assert // Minimum denomination is not a divisor of principal - // smart_contracts/base_d_asa/contract.py:532 + // smart_contracts/base_d_asa/contract.py:530 // self.unit_value = minimum_denomination.native bytec_3 // "unit_value" dig 1 app_global_put - // smart_contracts/base_d_asa/contract.py:533 + // smart_contracts/base_d_asa/contract.py:531 // self.total_units = principal.native // minimum_denomination.native / bytec 4 // "total_units" swap app_global_put - // smart_contracts/base_d_asa/contract.py:535-536 + // smart_contracts/base_d_asa/contract.py:533-534 // # Set Day-Count Convention // self.assert_day_count_convention(day_count_convention.native) frame_dig -5 @@ -682,10 +682,10 @@ asset_config_bool_merge@18: assert // Invalid day-count convention ID // smart_contracts/base_d_asa/contract.py:212 // self.day_count_convention = day_count_convention - bytec 10 // "day_count_convention" + bytec 11 // "day_count_convention" frame_dig 1 app_global_put - // smart_contracts/base_d_asa/contract.py:539-540 + // smart_contracts/base_d_asa/contract.py:537-538 // # Set Interest Rate // self.assert_interest_rate(interest_rate.native) frame_dig -4 @@ -746,7 +746,7 @@ asset_config_after_if_else@30: // time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS // ), err.INVALID_TIME_EVENTS_LENGTH assert // Time events length is invalid - // smart_contracts/base_d_asa/contract.py:549 + // smart_contracts/base_d_asa/contract.py:547 // self.assert_time_events_sorted(time_events) frame_dig -2 callsub assert_time_events_sorted @@ -772,7 +772,7 @@ asset_config_after_if_else@30: btoi // smart_contracts/base_d_asa/contract.py:261 // self.primary_distribution_opening_date = time_events[ - bytec 11 // "primary_distribution_opening_date" + bytec 12 // "primary_distribution_opening_date" // smart_contracts/base_d_asa/contract.py:261-263 // self.primary_distribution_opening_date = time_events[ // cfg.PRIMARY_DISTRIBUTION_OPENING_DATE_IDX @@ -788,7 +788,7 @@ asset_config_after_if_else@30: btoi // smart_contracts/base_d_asa/contract.py:264 // self.primary_distribution_closure_date = time_events[ - bytec 12 // "primary_distribution_closure_date" + bytec 13 // "primary_distribution_closure_date" // smart_contracts/base_d_asa/contract.py:264-266 // self.primary_distribution_closure_date = time_events[ // cfg.PRIMARY_DISTRIBUTION_CLOSURE_DATE_IDX @@ -799,7 +799,7 @@ asset_config_after_if_else@30: // self.issuance_date = time_events[cfg.ISSUANCE_DATE_IDX].native extract 16 8 // on error: Index access is out of bounds btoi - bytec 13 // "issuance_date" + bytec 14 // "issuance_date" swap app_global_put // smart_contracts/base_d_asa/contract.py:269-270 @@ -842,7 +842,7 @@ asset_config_after_if_else@36: extract_uint16 ! assert // Time periods are not properly defined - // smart_contracts/base_d_asa/contract.py:556 + // smart_contracts/base_d_asa/contract.py:554 // self.status = UInt64(cfg.STATUS_ACTIVE) bytec_2 // "status" pushint 100 // 100 @@ -977,7 +977,7 @@ assert_time_events_sorted_after_while@14: // smart_contracts/base_d_asa/contract.py:252 // if self.day_count_convention != UInt64(cst.DCC_CONT): intc_0 // 0 - bytec 10 // "day_count_convention" + bytec 11 // "day_count_convention" app_global_get_ex assert // check self.day_count_convention exists pushint 255 // 255 @@ -1008,14 +1008,14 @@ assert_time_events_sorted_after_for@6: // smart_contracts.base_d_asa.contract.BaseDAsa.set_secondary_time_events(secondary_market_time_events: bytes) -> bytes: set_secondary_time_events: - // smart_contracts/base_d_asa/contract.py:558-561 + // smart_contracts/base_d_asa/contract.py:556-559 // @arc4.abimethod // def set_secondary_time_events( // self, secondary_market_time_events: typ.TimeEvents // ) -> typ.SecondaryMarketSchedule: proto 1 1 intc_0 // 0 - // smart_contracts/base_d_asa/contract.py:579 + // smart_contracts/base_d_asa/contract.py:577 // self.assert_caller_is_arranger() callsub assert_caller_is_arranger // smart_contracts/base_d_asa/contract.py:105 @@ -1026,28 +1026,28 @@ set_secondary_time_events: assert // check self.status exists intc 4 // 200 == - // smart_contracts/base_d_asa/contract.py:580 + // smart_contracts/base_d_asa/contract.py:578 // assert not self.status_is_ended(), err.UNAUTHORIZED ! assert // Not authorized - // smart_contracts/base_d_asa/contract.py:581 + // smart_contracts/base_d_asa/contract.py:579 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:583 + // smart_contracts/base_d_asa/contract.py:581 // assert secondary_market_time_events.length >= 1, err.INVALID_TIME_EVENTS_LENGTH frame_dig -1 intc_0 // 0 extract_uint16 dup assert // Time events length is invalid - // smart_contracts/base_d_asa/contract.py:584 + // smart_contracts/base_d_asa/contract.py:582 // if secondary_market_time_events.length > 1: intc_1 // 1 > frame_dig -1 swap bz set_secondary_time_events_after_if_else@2 - // smart_contracts/base_d_asa/contract.py:585 + // smart_contracts/base_d_asa/contract.py:583 // self.assert_time_events_sorted(secondary_market_time_events) frame_dig -1 callsub assert_time_events_sorted @@ -1058,13 +1058,13 @@ set_secondary_time_events: set_secondary_time_events_after_if_else@2: frame_dig 1 frame_bury -1 - // smart_contracts/base_d_asa/contract.py:587 + // smart_contracts/base_d_asa/contract.py:585 // self.issuance_date intc_0 // 0 - bytec 13 // "issuance_date" + bytec 14 // "issuance_date" app_global_get_ex assert // check self.issuance_date exists - // smart_contracts/base_d_asa/contract.py:588-590 + // smart_contracts/base_d_asa/contract.py:586-588 // <= secondary_market_time_events[ // cfg.SECONDARY_MARKET_OPENING_DATE_IDX // ].native @@ -1074,7 +1074,7 @@ set_secondary_time_events_after_if_else@2: frame_bury 0 extract 0 8 // on error: Index access is out of bounds btoi - // smart_contracts/base_d_asa/contract.py:587-590 + // smart_contracts/base_d_asa/contract.py:585-588 // self.issuance_date // <= secondary_market_time_events[ // cfg.SECONDARY_MARKET_OPENING_DATE_IDX @@ -1082,7 +1082,7 @@ set_secondary_time_events_after_if_else@2: swap dig 1 <= - // smart_contracts/base_d_asa/contract.py:586-591 + // smart_contracts/base_d_asa/contract.py:584-589 // assert ( // self.issuance_date // <= secondary_market_time_events[ @@ -1090,34 +1090,34 @@ set_secondary_time_events_after_if_else@2: // ].native // ), err.INVALID_SECONDARY_OPENING_DATE assert // Invalid secondary market opening date - // smart_contracts/base_d_asa/contract.py:592 + // smart_contracts/base_d_asa/contract.py:590 // self.secondary_market_opening_date = secondary_market_time_events[ - bytec 14 // "secondary_market_opening_date" - // smart_contracts/base_d_asa/contract.py:592-594 + bytec 15 // "secondary_market_opening_date" + // smart_contracts/base_d_asa/contract.py:590-592 // self.secondary_market_opening_date = secondary_market_time_events[ // cfg.SECONDARY_MARKET_OPENING_DATE_IDX // ].native swap app_global_put - // smart_contracts/base_d_asa/contract.py:595 + // smart_contracts/base_d_asa/contract.py:593 // if self.maturity_date: intc_0 // 0 bytec 6 // "maturity_date" app_global_get_ex assert // check self.maturity_date exists bz set_secondary_time_events_after_if_else@4 - // smart_contracts/base_d_asa/contract.py:597 + // smart_contracts/base_d_asa/contract.py:595 // self.maturity_date intc_0 // 0 bytec 6 // "maturity_date" app_global_get_ex assert // check self.maturity_date exists - // smart_contracts/base_d_asa/contract.py:599 + // smart_contracts/base_d_asa/contract.py:597 // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX frame_dig -1 intc_0 // 0 extract_uint16 - // smart_contracts/base_d_asa/contract.py:598-600 + // smart_contracts/base_d_asa/contract.py:596-598 // >= secondary_market_time_events[ // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX // ].native @@ -1130,7 +1130,7 @@ set_secondary_time_events_after_if_else@2: intc_2 // 8 extract3 // on error: Index access is out of bounds btoi - // smart_contracts/base_d_asa/contract.py:597-600 + // smart_contracts/base_d_asa/contract.py:595-598 // self.maturity_date // >= secondary_market_time_events[ // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX @@ -1138,7 +1138,7 @@ set_secondary_time_events_after_if_else@2: swap dig 1 >= - // smart_contracts/base_d_asa/contract.py:596-601 + // smart_contracts/base_d_asa/contract.py:594-599 // assert ( // self.maturity_date // >= secondary_market_time_events[ @@ -1146,10 +1146,10 @@ set_secondary_time_events_after_if_else@2: // ].native // ), err.INVALID_SECONDARY_CLOSURE_DATE assert // Invalid secondary market closure date - // smart_contracts/base_d_asa/contract.py:602 + // smart_contracts/base_d_asa/contract.py:600 // self.secondary_market_closure_date = secondary_market_time_events[ - bytec 15 // "secondary_market_closure_date" - // smart_contracts/base_d_asa/contract.py:602-604 + bytec 16 // "secondary_market_closure_date" + // smart_contracts/base_d_asa/contract.py:600-602 // self.secondary_market_closure_date = secondary_market_time_events[ // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX // ].native @@ -1157,29 +1157,29 @@ set_secondary_time_events_after_if_else@2: app_global_put set_secondary_time_events_after_if_else@4: - // smart_contracts/base_d_asa/contract.py:607 + // smart_contracts/base_d_asa/contract.py:605 // self.secondary_market_opening_date intc_0 // 0 - bytec 14 // "secondary_market_opening_date" + bytec 15 // "secondary_market_opening_date" app_global_get_ex assert // check self.secondary_market_opening_date exists - // smart_contracts/base_d_asa/contract.py:606-608 + // smart_contracts/base_d_asa/contract.py:604-606 // secondary_market_opening_date=arc4.UInt64( // self.secondary_market_opening_date // ), itob - // smart_contracts/base_d_asa/contract.py:610 + // smart_contracts/base_d_asa/contract.py:608 // self.secondary_market_closure_date intc_0 // 0 - bytec 15 // "secondary_market_closure_date" + bytec 16 // "secondary_market_closure_date" app_global_get_ex assert // check self.secondary_market_closure_date exists - // smart_contracts/base_d_asa/contract.py:609-611 + // smart_contracts/base_d_asa/contract.py:607-609 // secondary_market_closure_date=arc4.UInt64( // self.secondary_market_closure_date // ), itob - // smart_contracts/base_d_asa/contract.py:605-612 + // smart_contracts/base_d_asa/contract.py:603-610 // return typ.SecondaryMarketSchedule( // secondary_market_opening_date=arc4.UInt64( // self.secondary_market_opening_date @@ -1202,7 +1202,7 @@ assert_is_not_defaulted: // smart_contracts/base_d_asa/contract.py:109 // assert not self.defaulted, err.DEFAULTED intc_0 // 0 - bytec 17 // "defaulted" + bytec 18 // "defaulted" app_global_get_ex assert // check self.defaulted exists ! @@ -1212,27 +1212,27 @@ assert_is_not_defaulted: // smart_contracts.base_d_asa.contract.BaseDAsa.assign_role(role_address: bytes, role: bytes, config: bytes) -> bytes: assign_role: - // smart_contracts/base_d_asa/contract.py:614-617 + // smart_contracts/base_d_asa/contract.py:612-615 // @arc4.abimethod // def assign_role( // self, role_address: arc4.Address, role: arc4.UInt8, config: arc4.DynamicBytes // ) -> arc4.UInt64: proto 3 1 - // smart_contracts/base_d_asa/contract.py:635 + // smart_contracts/base_d_asa/contract.py:633 // self.assert_caller_is_arranger() callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:636 + // smart_contracts/base_d_asa/contract.py:634 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:637 + // smart_contracts/base_d_asa/contract.py:635 // assert role.native in ( frame_dig -2 btoi dup - // smart_contracts/base_d_asa/contract.py:638 + // smart_contracts/base_d_asa/contract.py:636 // UInt64(cst.ROLE_ARRANGER), pushint 20 // 20 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -1244,10 +1244,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:639 + // smart_contracts/base_d_asa/contract.py:637 // UInt64(cst.ROLE_ACCOUNT_MANAGER), pushint 40 // 40 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -1259,10 +1259,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:640 + // smart_contracts/base_d_asa/contract.py:638 // UInt64(cst.ROLE_PRIMARY_DEALER), pushint 50 // 50 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -1274,10 +1274,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:641 + // smart_contracts/base_d_asa/contract.py:639 // UInt64(cst.ROLE_TRUSTEE), pushint 60 // 60 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -1289,10 +1289,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:642 + // smart_contracts/base_d_asa/contract.py:640 // UInt64(cst.ROLE_AUTHORITY), pushint 70 // 70 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -1304,10 +1304,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:643 + // smart_contracts/base_d_asa/contract.py:641 // UInt64(cst.ROLE_INTEREST_ORACLE), pushint 80 // 80 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -1323,7 +1323,7 @@ assign_role_bool_true@6: intc_1 // 1 assign_role_bool_merge@8: - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -1333,10 +1333,10 @@ assign_role_bool_merge@8: // UInt64(cst.ROLE_INTEREST_ORACLE), // ), err.INVALID_ROLE assert // Invalid role identifier - // smart_contracts/base_d_asa/contract.py:646 + // smart_contracts/base_d_asa/contract.py:644 // case UInt64(cst.ROLE_ARRANGER): pushints 20 40 50 60 70 80 // 20, 40, 50, 60, 70, 80 - // smart_contracts/base_d_asa/contract.py:645-674 + // smart_contracts/base_d_asa/contract.py:643-672 // match role.native: // case UInt64(cst.ROLE_ARRANGER): // self.arranger.value = role_address.native @@ -1369,12 +1369,12 @@ assign_role_bool_merge@8: // op.err() frame_dig 0 match assign_role_switch_case_0@9 assign_role_switch_case_1@10 assign_role_switch_case_2@11 assign_role_switch_case_3@12 assign_role_switch_case_4@13 assign_role_switch_case_5@14 - // smart_contracts/base_d_asa/contract.py:674 + // smart_contracts/base_d_asa/contract.py:672 // op.err() err assign_role_switch_case_5@14: - // smart_contracts/base_d_asa/contract.py:668 + // smart_contracts/base_d_asa/contract.py:666 // role_address not in self.interest_oracle bytec 30 // 0x52383023 frame_dig -3 @@ -1383,23 +1383,23 @@ assign_role_switch_case_5@14: box_len bury 1 ! - // smart_contracts/base_d_asa/contract.py:667-669 + // smart_contracts/base_d_asa/contract.py:665-667 // assert ( // role_address not in self.interest_oracle // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:671 + // smart_contracts/base_d_asa/contract.py:669 // config.native frame_dig -1 extract 2 0 - // smart_contracts/base_d_asa/contract.py:670-672 + // smart_contracts/base_d_asa/contract.py:668-670 // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes( // config.native // ) box_put assign_role_switch_case_next@16: - // smart_contracts/base_d_asa/contract.py:675 + // smart_contracts/base_d_asa/contract.py:673 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -1407,7 +1407,7 @@ assign_role_switch_case_next@16: retsub assign_role_switch_case_4@13: - // smart_contracts/base_d_asa/contract.py:664 + // smart_contracts/base_d_asa/contract.py:662 // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS bytec 22 // 0x52373023 frame_dig -3 @@ -1417,7 +1417,7 @@ assign_role_switch_case_4@13: bury 1 ! assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:665 + // smart_contracts/base_d_asa/contract.py:663 // self.authority[role_address] = typ.RoleConfig.from_bytes(config.native) frame_dig -1 extract 2 0 @@ -1425,7 +1425,7 @@ assign_role_switch_case_4@13: b assign_role_switch_case_next@16 assign_role_switch_case_3@12: - // smart_contracts/base_d_asa/contract.py:661 + // smart_contracts/base_d_asa/contract.py:659 // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS bytec 23 // 0x52363023 frame_dig -3 @@ -1435,7 +1435,7 @@ assign_role_switch_case_3@12: bury 1 ! assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:662 + // smart_contracts/base_d_asa/contract.py:660 // self.trustee[role_address] = typ.RoleConfig.from_bytes(config.native) frame_dig -1 extract 2 0 @@ -1443,7 +1443,7 @@ assign_role_switch_case_3@12: b assign_role_switch_case_next@16 assign_role_switch_case_2@11: - // smart_contracts/base_d_asa/contract.py:656 + // smart_contracts/base_d_asa/contract.py:654 // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS bytec 24 // 0x52353023 frame_dig -3 @@ -1453,11 +1453,11 @@ assign_role_switch_case_2@11: bury 1 ! assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:658 + // smart_contracts/base_d_asa/contract.py:656 // config.native frame_dig -1 extract 2 0 - // smart_contracts/base_d_asa/contract.py:657-659 + // smart_contracts/base_d_asa/contract.py:655-657 // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes( // config.native // ) @@ -1465,7 +1465,7 @@ assign_role_switch_case_2@11: b assign_role_switch_case_next@16 assign_role_switch_case_1@10: - // smart_contracts/base_d_asa/contract.py:650 + // smart_contracts/base_d_asa/contract.py:648 // role_address not in self.account_manager bytec 25 // 0x52343023 frame_dig -3 @@ -1474,16 +1474,16 @@ assign_role_switch_case_1@10: box_len bury 1 ! - // smart_contracts/base_d_asa/contract.py:649-651 + // smart_contracts/base_d_asa/contract.py:647-649 // assert ( // role_address not in self.account_manager // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:653 + // smart_contracts/base_d_asa/contract.py:651 // config.native frame_dig -1 extract 2 0 - // smart_contracts/base_d_asa/contract.py:652-654 + // smart_contracts/base_d_asa/contract.py:650-652 // self.account_manager[role_address] = typ.RoleConfig.from_bytes( // config.native // ) @@ -1491,7 +1491,7 @@ assign_role_switch_case_1@10: b assign_role_switch_case_next@16 assign_role_switch_case_0@9: - // smart_contracts/base_d_asa/contract.py:647 + // smart_contracts/base_d_asa/contract.py:645 // self.arranger.value = role_address.native bytec 8 // 0x52323023 frame_dig -3 @@ -1505,25 +1505,25 @@ assign_role_bool_false@7: // smart_contracts.base_d_asa.contract.BaseDAsa.revoke_role(role_address: bytes, role: bytes) -> bytes: revoke_role: - // smart_contracts/base_d_asa/contract.py:677-678 + // smart_contracts/base_d_asa/contract.py:675-676 // @arc4.abimethod // def revoke_role(self, role_address: arc4.Address, role: arc4.UInt8) -> arc4.UInt64: proto 2 1 - // smart_contracts/base_d_asa/contract.py:695 + // smart_contracts/base_d_asa/contract.py:693 // self.assert_caller_is_arranger() callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:696 + // smart_contracts/base_d_asa/contract.py:694 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:697 + // smart_contracts/base_d_asa/contract.py:695 // assert role.native in ( frame_dig -1 btoi dup - // smart_contracts/base_d_asa/contract.py:698 + // smart_contracts/base_d_asa/contract.py:696 // UInt64(cst.ROLE_ACCOUNT_MANAGER), pushint 40 // 40 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -1534,10 +1534,10 @@ revoke_role: == bnz revoke_role_bool_true@5 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:699 + // smart_contracts/base_d_asa/contract.py:697 // UInt64(cst.ROLE_PRIMARY_DEALER), pushint 50 // 50 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -1548,10 +1548,10 @@ revoke_role: == bnz revoke_role_bool_true@5 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:700 + // smart_contracts/base_d_asa/contract.py:698 // UInt64(cst.ROLE_TRUSTEE), pushint 60 // 60 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -1562,10 +1562,10 @@ revoke_role: == bnz revoke_role_bool_true@5 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:701 + // smart_contracts/base_d_asa/contract.py:699 // UInt64(cst.ROLE_AUTHORITY), pushint 70 // 70 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -1576,10 +1576,10 @@ revoke_role: == bnz revoke_role_bool_true@5 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:702 + // smart_contracts/base_d_asa/contract.py:700 // UInt64(cst.ROLE_INTEREST_ORACLE), pushint 80 // 80 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -1594,7 +1594,7 @@ revoke_role_bool_true@5: intc_1 // 1 revoke_role_bool_merge@7: - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -1603,11 +1603,11 @@ revoke_role_bool_merge@7: // UInt64(cst.ROLE_INTEREST_ORACLE), // ), err.INVALID_ROLE assert // Invalid role identifier - // smart_contracts/base_d_asa/contract.py:705-706 + // smart_contracts/base_d_asa/contract.py:703-704 // # Arranger role can not be revoked (just rotated) // case UInt64(cst.ROLE_ACCOUNT_MANAGER): pushints 40 50 60 70 80 // 40, 50, 60, 70, 80 - // smart_contracts/base_d_asa/contract.py:704-722 + // smart_contracts/base_d_asa/contract.py:702-720 // match role.native: // # Arranger role can not be revoked (just rotated) // case UInt64(cst.ROLE_ACCOUNT_MANAGER): @@ -1629,12 +1629,12 @@ revoke_role_bool_merge@7: // op.err() frame_dig 0 match revoke_role_switch_case_0@8 revoke_role_switch_case_1@9 revoke_role_switch_case_2@10 revoke_role_switch_case_3@11 revoke_role_switch_case_4@12 - // smart_contracts/base_d_asa/contract.py:722 + // smart_contracts/base_d_asa/contract.py:720 // op.err() err revoke_role_switch_case_4@12: - // smart_contracts/base_d_asa/contract.py:719 + // smart_contracts/base_d_asa/contract.py:717 // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS bytec 30 // 0x52383023 frame_dig -2 @@ -1643,13 +1643,13 @@ revoke_role_switch_case_4@12: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:720 + // smart_contracts/base_d_asa/contract.py:718 // op.Box.delete(cst.PREFIX_ID_INTEREST_ORACLE + role_address.bytes) box_del pop revoke_role_switch_case_next@14: - // smart_contracts/base_d_asa/contract.py:723 + // smart_contracts/base_d_asa/contract.py:721 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -1657,7 +1657,7 @@ revoke_role_switch_case_next@14: retsub revoke_role_switch_case_3@11: - // smart_contracts/base_d_asa/contract.py:716 + // smart_contracts/base_d_asa/contract.py:714 // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS bytec 22 // 0x52373023 frame_dig -2 @@ -1666,14 +1666,14 @@ revoke_role_switch_case_3@11: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:717 + // smart_contracts/base_d_asa/contract.py:715 // op.Box.delete(cst.PREFIX_ID_AUTHORITY + role_address.bytes) box_del pop b revoke_role_switch_case_next@14 revoke_role_switch_case_2@10: - // smart_contracts/base_d_asa/contract.py:713 + // smart_contracts/base_d_asa/contract.py:711 // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS bytec 23 // 0x52363023 frame_dig -2 @@ -1682,14 +1682,14 @@ revoke_role_switch_case_2@10: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:714 + // smart_contracts/base_d_asa/contract.py:712 // op.Box.delete(cst.PREFIX_ID_TRUSTEE + role_address.bytes) box_del pop b revoke_role_switch_case_next@14 revoke_role_switch_case_1@9: - // smart_contracts/base_d_asa/contract.py:710 + // smart_contracts/base_d_asa/contract.py:708 // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS bytec 24 // 0x52353023 frame_dig -2 @@ -1698,14 +1698,14 @@ revoke_role_switch_case_1@9: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:711 + // smart_contracts/base_d_asa/contract.py:709 // op.Box.delete(cst.PREFIX_ID_PRIMARY_DEALER + role_address.bytes) box_del pop b revoke_role_switch_case_next@14 revoke_role_switch_case_0@8: - // smart_contracts/base_d_asa/contract.py:707 + // smart_contracts/base_d_asa/contract.py:705 // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS bytec 25 // 0x52343023 frame_dig -2 @@ -1714,7 +1714,7 @@ revoke_role_switch_case_0@8: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:708 + // smart_contracts/base_d_asa/contract.py:706 // op.Box.delete(cst.PREFIX_ID_ACCOUNT_MANAGER + role_address.bytes) box_del pop @@ -1727,13 +1727,13 @@ revoke_role_bool_false@6: // smart_contracts.base_d_asa.contract.BaseDAsa.open_account(holding_address: bytes, payment_address: bytes) -> bytes: open_account: - // smart_contracts/base_d_asa/contract.py:725-728 + // smart_contracts/base_d_asa/contract.py:723-726 // @arc4.abimethod // def open_account( // self, holding_address: arc4.Address, payment_address: arc4.Address // ) -> arc4.UInt64: proto 2 1 - // smart_contracts/base_d_asa/contract.py:745 + // smart_contracts/base_d_asa/contract.py:743 // self.assert_caller_is_account_manager() callsub assert_caller_is_account_manager // smart_contracts/base_d_asa/contract.py:105 @@ -1744,17 +1744,17 @@ open_account: assert // check self.status exists intc 4 // 200 == - // smart_contracts/base_d_asa/contract.py:746 + // smart_contracts/base_d_asa/contract.py:744 // assert not self.status_is_ended(), err.UNAUTHORIZED ! assert // Not authorized - // smart_contracts/base_d_asa/contract.py:747 + // smart_contracts/base_d_asa/contract.py:745 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:748 + // smart_contracts/base_d_asa/contract.py:746 // self.assert_is_not_suspended() callsub assert_is_not_suspended - // smart_contracts/base_d_asa/contract.py:749 + // smart_contracts/base_d_asa/contract.py:747 // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS bytec 7 // 0x52333023 frame_dig -2 @@ -1764,7 +1764,7 @@ open_account: bury 1 ! assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:751-757 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -1773,10 +1773,10 @@ open_account: // suspended=arc4.Bool(), // ) frame_dig -1 - // smart_contracts/base_d_asa/contract.py:753 + // smart_contracts/base_d_asa/contract.py:751 // units=arc4.UInt64(), bytec 26 // 0x0000000000000000 - // smart_contracts/base_d_asa/contract.py:751-757 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -1785,10 +1785,10 @@ open_account: // suspended=arc4.Bool(), // ) concat - // smart_contracts/base_d_asa/contract.py:754 + // smart_contracts/base_d_asa/contract.py:752 // unit_value=arc4.UInt64(), bytec 26 // 0x0000000000000000 - // smart_contracts/base_d_asa/contract.py:751-757 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -1797,10 +1797,10 @@ open_account: // suspended=arc4.Bool(), // ) concat - // smart_contracts/base_d_asa/contract.py:755 + // smart_contracts/base_d_asa/contract.py:753 // paid_coupons=arc4.UInt64(), bytec 26 // 0x0000000000000000 - // smart_contracts/base_d_asa/contract.py:751-757 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -1809,10 +1809,10 @@ open_account: // suspended=arc4.Bool(), // ) concat - // smart_contracts/base_d_asa/contract.py:756 + // smart_contracts/base_d_asa/contract.py:754 // suspended=arc4.Bool(), bytec 27 // 0x00 - // smart_contracts/base_d_asa/contract.py:751-757 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -1822,7 +1822,7 @@ open_account: // ) concat box_put - // smart_contracts/base_d_asa/contract.py:758 + // smart_contracts/base_d_asa/contract.py:756 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -1918,7 +1918,7 @@ assert_is_not_suspended: // smart_contracts/base_d_asa/contract.py:113 // assert not self.suspended, err.SUSPENDED intc_0 // 0 - bytec 16 // "suspended" + bytec 17 // "suspended" app_global_get_ex assert // check self.suspended exists ! @@ -1928,16 +1928,16 @@ assert_is_not_suspended: // smart_contracts.base_d_asa.contract.BaseDAsa.close_account(holding_address: bytes) -> bytes: close_account: - // smart_contracts/base_d_asa/contract.py:760-763 + // smart_contracts/base_d_asa/contract.py:758-761 // @arc4.abimethod // def close_account( // self, holding_address: arc4.Address // ) -> arc4.Tuple[arc4.UInt64, arc4.UInt64]: proto 1 1 - // smart_contracts/base_d_asa/contract.py:778 + // smart_contracts/base_d_asa/contract.py:776 // self.assert_caller_is_account_manager() callsub assert_caller_is_account_manager - // smart_contracts/base_d_asa/contract.py:779 + // smart_contracts/base_d_asa/contract.py:777 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted // smart_contracts/base_d_asa/contract.py:171 @@ -1949,7 +1949,7 @@ close_account: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:782 + // smart_contracts/base_d_asa/contract.py:780 // closed_units = self.account[holding_address].units.native dup box_get @@ -1958,11 +1958,11 @@ close_account: btoi dup uncover 2 - // smart_contracts/base_d_asa/contract.py:783 + // smart_contracts/base_d_asa/contract.py:781 // op.Box.delete(cst.PREFIX_ID_ACCOUNT + holding_address.bytes) box_del pop - // smart_contracts/base_d_asa/contract.py:784 + // smart_contracts/base_d_asa/contract.py:782 // self.circulating_units -= closed_units intc_0 // 0 bytec_1 // "circulating_units" @@ -1973,27 +1973,27 @@ close_account: bytec_1 // "circulating_units" swap app_global_put - // smart_contracts/base_d_asa/contract.py:359 + // smart_contracts/base_d_asa/contract.py:357 // if self.circulating_units == 0: intc_0 // 0 bytec_1 // "circulating_units" app_global_get_ex assert // check self.circulating_units exists bnz close_account_after_if_else@3 - // smart_contracts/base_d_asa/contract.py:360 + // smart_contracts/base_d_asa/contract.py:358 // self.status = UInt64(cfg.STATUS_ENDED) bytec_2 // "status" intc 4 // 200 app_global_put close_account_after_if_else@3: - // smart_contracts/base_d_asa/contract.py:787 + // smart_contracts/base_d_asa/contract.py:785 // (arc4.UInt64(closed_units), arc4.UInt64(Global.latest_timestamp)) frame_dig 0 itob global LatestTimestamp itob - // smart_contracts/base_d_asa/contract.py:786-788 + // smart_contracts/base_d_asa/contract.py:784-786 // return arc4.Tuple( // (arc4.UInt64(closed_units), arc4.UInt64(Global.latest_timestamp)) // ) @@ -2004,7 +2004,7 @@ close_account_after_if_else@3: // smart_contracts.base_d_asa.contract.BaseDAsa.primary_distribution(holding_address: bytes, units: bytes) -> bytes: primary_distribution: - // smart_contracts/base_d_asa/contract.py:790-793 + // smart_contracts/base_d_asa/contract.py:788-791 // @arc4.abimethod // def primary_distribution( // self, holding_address: arc4.Address, units: arc4.UInt64 @@ -2030,7 +2030,7 @@ primary_distribution: // smart_contracts/base_d_asa/contract.py:285 // and self.primary_distribution_opening_date intc_0 // 0 - bytec 11 // "primary_distribution_opening_date" + bytec 12 // "primary_distribution_opening_date" app_global_get_ex assert // check self.primary_distribution_opening_date exists // smart_contracts/base_d_asa/contract.py:286 @@ -2050,7 +2050,7 @@ primary_distribution: // smart_contracts/base_d_asa/contract.py:287 // < self.primary_distribution_closure_date intc_0 // 0 - bytec 12 // "primary_distribution_closure_date" + bytec 13 // "primary_distribution_closure_date" app_global_get_ex assert // check self.primary_distribution_closure_date exists // smart_contracts/base_d_asa/contract.py:286-287 @@ -2150,19 +2150,19 @@ primary_distribution_bool_merge@13: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:818 + // smart_contracts/base_d_asa/contract.py:816 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:819 + // smart_contracts/base_d_asa/contract.py:817 // self.assert_is_not_suspended() callsub assert_is_not_suspended - // smart_contracts/base_d_asa/contract.py:820 + // smart_contracts/base_d_asa/contract.py:818 // assert units.native > 0, err.ZERO_UNITS frame_dig -1 btoi dup assert // Can not distribute zero units - // smart_contracts/base_d_asa/contract.py:822 + // smart_contracts/base_d_asa/contract.py:820 // self.circulating_units + units.native <= self.total_units intc_0 // 0 bytec_1 // "circulating_units" @@ -2175,12 +2175,12 @@ primary_distribution_bool_merge@13: app_global_get_ex assert // check self.total_units exists <= - // smart_contracts/base_d_asa/contract.py:821-823 + // smart_contracts/base_d_asa/contract.py:819-821 // assert ( // self.circulating_units + units.native <= self.total_units // ), err.OVER_DISTRIBUTION assert // Insufficient remaining D-ASA units - // smart_contracts/base_d_asa/contract.py:825 + // smart_contracts/base_d_asa/contract.py:823 // self.circulating_units += units.native intc_0 // 0 bytec_1 // "circulating_units" @@ -2191,7 +2191,7 @@ primary_distribution_bool_merge@13: bytec_1 // "circulating_units" swap app_global_put - // smart_contracts/base_d_asa/contract.py:827 + // smart_contracts/base_d_asa/contract.py:825 // self.account[holding_address].units.native + units.native dig 1 box_get @@ -2199,17 +2199,17 @@ primary_distribution_bool_merge@13: extract 32 8 // on error: Index access is out of bounds btoi + - // smart_contracts/base_d_asa/contract.py:826-828 + // smart_contracts/base_d_asa/contract.py:824-826 // self.account[holding_address].units = arc4.UInt64( // self.account[holding_address].units.native + units.native // ) itob - // smart_contracts/base_d_asa/contract.py:826 + // smart_contracts/base_d_asa/contract.py:824 // self.account[holding_address].units = arc4.UInt64( dig 1 box_get assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:826-828 + // smart_contracts/base_d_asa/contract.py:824-826 // self.account[holding_address].units = arc4.UInt64( // self.account[holding_address].units.native + units.native // ) @@ -2218,7 +2218,7 @@ primary_distribution_bool_merge@13: dig 1 swap box_put - // smart_contracts/base_d_asa/contract.py:829 + // smart_contracts/base_d_asa/contract.py:827 // self.account[holding_address].unit_value = arc4.UInt64(self.unit_value) intc_0 // 0 bytec_3 // "unit_value" @@ -2231,7 +2231,7 @@ primary_distribution_bool_merge@13: swap replace2 40 box_put - // smart_contracts/base_d_asa/contract.py:830 + // smart_contracts/base_d_asa/contract.py:828 // return arc4.UInt64(self.total_units - self.circulating_units) intc_0 // 0 bytec 4 // "total_units" @@ -2257,22 +2257,22 @@ primary_distribution_bool_false@5: // smart_contracts.base_d_asa.contract.BaseDAsa.set_asset_suspension(suspended: bytes) -> bytes: set_asset_suspension: - // smart_contracts/base_d_asa/contract.py:832-833 + // smart_contracts/base_d_asa/contract.py:830-831 // @arc4.abimethod // def set_asset_suspension(self, suspended: arc4.Bool) -> arc4.UInt64: proto 1 1 - // smart_contracts/base_d_asa/contract.py:846 + // smart_contracts/base_d_asa/contract.py:844 // self.assert_caller_is_authority() callsub assert_caller_is_authority - // smart_contracts/base_d_asa/contract.py:847 + // smart_contracts/base_d_asa/contract.py:845 // self.suspended = UInt64(suspended.native) frame_dig -1 intc_0 // 0 getbit - bytec 16 // "suspended" + bytec 17 // "suspended" swap app_global_put - // smart_contracts/base_d_asa/contract.py:848 + // smart_contracts/base_d_asa/contract.py:846 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -2361,13 +2361,13 @@ assert_caller_is_authority_bool_false@4: // smart_contracts.base_d_asa.contract.BaseDAsa.set_account_suspension(holding_address: bytes, suspended: bytes) -> bytes: set_account_suspension: - // smart_contracts/base_d_asa/contract.py:850-853 + // smart_contracts/base_d_asa/contract.py:848-851 // @arc4.abimethod // def set_account_suspension( // self, holding_address: arc4.Address, suspended: arc4.Bool // ) -> arc4.UInt64: proto 2 1 - // smart_contracts/base_d_asa/contract.py:868 + // smart_contracts/base_d_asa/contract.py:866 // self.assert_caller_is_authority() callsub assert_caller_is_authority // smart_contracts/base_d_asa/contract.py:171 @@ -2379,7 +2379,7 @@ set_account_suspension: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:870 + // smart_contracts/base_d_asa/contract.py:868 // self.account[holding_address].suspended = suspended dup box_get @@ -2391,7 +2391,7 @@ set_account_suspension: swap setbit box_put - // smart_contracts/base_d_asa/contract.py:871 + // smart_contracts/base_d_asa/contract.py:869 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -2400,7 +2400,7 @@ set_account_suspension: // smart_contracts.base_d_asa.contract.BaseDAsa.set_default_status(defaulted: bytes) -> void: set_default_status: - // smart_contracts/base_d_asa/contract.py:873-874 + // smart_contracts/base_d_asa/contract.py:871-872 // @arc4.abimethod // def set_default_status(self, defaulted: arc4.Bool) -> None: proto 1 0 @@ -2471,12 +2471,12 @@ set_default_status_bool_merge@6: // <= self.trustee[caller].role_validity_end // ), err.UNAUTHORIZED assert // Not authorized - // smart_contracts/base_d_asa/contract.py:885 + // smart_contracts/base_d_asa/contract.py:883 // self.defaulted = UInt64(defaulted.native) frame_dig -1 intc_0 // 0 getbit - bytec 17 // "defaulted" + bytec 18 // "defaulted" swap app_global_put retsub @@ -2488,18 +2488,25 @@ set_default_status_bool_false@5: // smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_info() -> bytes: get_asset_info: - // smart_contracts/base_d_asa/contract.py:887-888 + // smart_contracts/base_d_asa/contract.py:885-886 // @arc4.abimethod(readonly=True) // def get_asset_info(self) -> typ.AssetInfo: proto 0 1 - // smart_contracts/base_d_asa/contract.py:898 + // smart_contracts/base_d_asa/contract.py:896 // denomination_asset_id=arc4.UInt64(self.denomination_asset_id), intc_0 // 0 bytec 9 // "denomination_asset_id" app_global_get_ex assert // check self.denomination_asset_id exists itob - // smart_contracts/base_d_asa/contract.py:899 + // smart_contracts/base_d_asa/contract.py:897 + // settlement_asset_id=arc4.UInt64(self.settlement_asset_id), + intc_0 // 0 + bytec 10 // "settlement_asset_id" + app_global_get_ex + assert // check self.settlement_asset_id exists + itob + // smart_contracts/base_d_asa/contract.py:898 // outstanding_principal=arc4.UInt64(self.circulating_units * self.unit_value), intc_0 // 0 bytec_1 // "circulating_units" @@ -2511,22 +2518,22 @@ get_asset_info: assert // check self.unit_value exists * itob - // smart_contracts/base_d_asa/contract.py:900 + // smart_contracts/base_d_asa/contract.py:899 // unit_value=arc4.UInt64(self.unit_value), intc_0 // 0 bytec_3 // "unit_value" app_global_get_ex assert // check self.unit_value exists itob - // smart_contracts/base_d_asa/contract.py:901 + // smart_contracts/base_d_asa/contract.py:900 // day_count_convention=arc4.UInt8(self.day_count_convention), intc_0 // 0 - bytec 10 // "day_count_convention" + bytec 11 // "day_count_convention" app_global_get_ex assert // check self.day_count_convention exists itob extract 7 1 - // smart_contracts/base_d_asa/contract.py:902 + // smart_contracts/base_d_asa/contract.py:901 // interest_rate=arc4.UInt16(self.interest_rate), intc_0 // 0 bytec 20 // "interest_rate" @@ -2534,79 +2541,80 @@ get_asset_info: assert // check self.interest_rate exists itob extract 6 2 - // smart_contracts/base_d_asa/contract.py:903 + // smart_contracts/base_d_asa/contract.py:902 // total_supply=arc4.UInt64(self.total_units), intc_0 // 0 bytec 4 // "total_units" app_global_get_ex assert // check self.total_units exists itob - // smart_contracts/base_d_asa/contract.py:904 + // smart_contracts/base_d_asa/contract.py:903 // circulating_supply=arc4.UInt64(self.circulating_units), intc_0 // 0 bytec_1 // "circulating_units" app_global_get_ex assert // check self.circulating_units exists itob - // smart_contracts/base_d_asa/contract.py:906 + // smart_contracts/base_d_asa/contract.py:905 // self.primary_distribution_opening_date intc_0 // 0 - bytec 11 // "primary_distribution_opening_date" + bytec 12 // "primary_distribution_opening_date" app_global_get_ex assert // check self.primary_distribution_opening_date exists - // smart_contracts/base_d_asa/contract.py:905-907 + // smart_contracts/base_d_asa/contract.py:904-906 // primary_distribution_opening_date=arc4.UInt64( // self.primary_distribution_opening_date // ), itob - // smart_contracts/base_d_asa/contract.py:909 + // smart_contracts/base_d_asa/contract.py:908 // self.primary_distribution_closure_date intc_0 // 0 - bytec 12 // "primary_distribution_closure_date" + bytec 13 // "primary_distribution_closure_date" app_global_get_ex assert // check self.primary_distribution_closure_date exists - // smart_contracts/base_d_asa/contract.py:908-910 + // smart_contracts/base_d_asa/contract.py:907-909 // primary_distribution_closure_date=arc4.UInt64( // self.primary_distribution_closure_date // ), itob - // smart_contracts/base_d_asa/contract.py:911 + // smart_contracts/base_d_asa/contract.py:910 // issuance_date=arc4.UInt64(self.issuance_date), intc_0 // 0 - bytec 13 // "issuance_date" + bytec 14 // "issuance_date" app_global_get_ex assert // check self.issuance_date exists itob - // smart_contracts/base_d_asa/contract.py:912 + // smart_contracts/base_d_asa/contract.py:911 // maturity_date=arc4.UInt64(self.maturity_date), intc_0 // 0 bytec 6 // "maturity_date" app_global_get_ex assert // check self.maturity_date exists itob - // smart_contracts/base_d_asa/contract.py:913 + // smart_contracts/base_d_asa/contract.py:912 // suspended=arc4.Bool(bool(self.suspended)), intc_0 // 0 - bytec 16 // "suspended" + bytec 17 // "suspended" app_global_get_ex assert // check self.suspended exists bytec 27 // 0x00 intc_0 // 0 uncover 2 setbit - // smart_contracts/base_d_asa/contract.py:914 + // smart_contracts/base_d_asa/contract.py:913 // defaulted=arc4.Bool(bool(self.defaulted)), intc_0 // 0 - bytec 17 // "defaulted" + bytec 18 // "defaulted" app_global_get_ex assert // check self.defaulted exists bytec 27 // 0x00 intc_0 // 0 uncover 2 setbit - // smart_contracts/base_d_asa/contract.py:897-915 + // smart_contracts/base_d_asa/contract.py:895-914 // return typ.AssetInfo( // denomination_asset_id=arc4.UInt64(self.denomination_asset_id), + // settlement_asset_id=arc4.UInt64(self.settlement_asset_id), // outstanding_principal=arc4.UInt64(self.circulating_units * self.unit_value), // unit_value=arc4.UInt64(self.unit_value), // day_count_convention=arc4.UInt8(self.day_count_convention), @@ -2624,7 +2632,9 @@ get_asset_info: // suspended=arc4.Bool(bool(self.suspended)), // defaulted=arc4.Bool(bool(self.defaulted)), // ) - uncover 12 + uncover 13 + uncover 13 + concat uncover 12 concat uncover 11 @@ -2650,7 +2660,7 @@ get_asset_info: swap intc_0 // 0 getbit - pushint 601 // 601 + pushint 665 // 665 swap setbit retsub @@ -2658,7 +2668,7 @@ get_asset_info: // smart_contracts.base_d_asa.contract.BaseDAsa.get_account_info(holding_address: bytes) -> bytes: get_account_info: - // smart_contracts/base_d_asa/contract.py:917-918 + // smart_contracts/base_d_asa/contract.py:916-917 // @arc4.abimethod(readonly=True) // def get_account_info(self, holding_address: arc4.Address) -> typ.AccountInfo: proto 1 1 @@ -2671,7 +2681,7 @@ get_account_info: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:932 + // smart_contracts/base_d_asa/contract.py:931 // return self.account[holding_address] box_get assert // check self.account entry exists @@ -2680,11 +2690,11 @@ get_account_info: // smart_contracts.base_d_asa.contract.BaseDAsa.get_time_events() -> bytes: get_time_events: - // smart_contracts/base_d_asa/contract.py:934-935 + // smart_contracts/base_d_asa/contract.py:933-934 // @arc4.abimethod(readonly=True) // def get_time_events(self) -> typ.TimeEvents: proto 0 1 - // smart_contracts/base_d_asa/contract.py:942 + // smart_contracts/base_d_asa/contract.py:941 // time_events = typ.TimeEvents() pushbytes 0x0000 // smart_contracts/base_d_asa/contract.py:101 @@ -2695,10 +2705,10 @@ get_time_events: assert // check self.status exists pushint 100 // 100 == - // smart_contracts/base_d_asa/contract.py:943 + // smart_contracts/base_d_asa/contract.py:942 // if self.status_is_active(): bz get_time_events_after_if_else@2 - // smart_contracts/base_d_asa/contract.py:944 + // smart_contracts/base_d_asa/contract.py:943 // time_events = self.time_events.value.copy() bytec 21 // 0x74696d654576656e7473 box_get @@ -2707,7 +2717,7 @@ get_time_events: assert // check self.time_events exists get_time_events_after_if_else@2: - // smart_contracts/base_d_asa/contract.py:945 + // smart_contracts/base_d_asa/contract.py:944 // return time_events frame_dig 0 swap @@ -2716,25 +2726,25 @@ get_time_events_after_if_else@2: // smart_contracts.base_d_asa.contract.BaseDAsa.get_secondary_market_schedule() -> bytes: get_secondary_market_schedule: - // smart_contracts/base_d_asa/contract.py:947-948 + // smart_contracts/base_d_asa/contract.py:946-947 // @arc4.abimethod(readonly=True) // def get_secondary_market_schedule(self) -> typ.TimeEvents: proto 0 1 - // smart_contracts/base_d_asa/contract.py:950 + // smart_contracts/base_d_asa/contract.py:955 // arc4.UInt64(self.secondary_market_opening_date), intc_0 // 0 - bytec 14 // "secondary_market_opening_date" + bytec 15 // "secondary_market_opening_date" app_global_get_ex assert // check self.secondary_market_opening_date exists itob - // smart_contracts/base_d_asa/contract.py:951 + // smart_contracts/base_d_asa/contract.py:956 // arc4.UInt64(self.secondary_market_closure_date), intc_0 // 0 - bytec 15 // "secondary_market_closure_date" + bytec 16 // "secondary_market_closure_date" app_global_get_ex assert // check self.secondary_market_closure_date exists itob - // smart_contracts/base_d_asa/contract.py:949-952 + // smart_contracts/base_d_asa/contract.py:954-957 // return typ.TimeEvents( // arc4.UInt64(self.secondary_market_opening_date), // arc4.UInt64(self.secondary_market_closure_date), @@ -2748,11 +2758,11 @@ get_secondary_market_schedule: // smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_metadata() -> bytes: get_asset_metadata: - // smart_contracts/base_d_asa/contract.py:954-955 + // smart_contracts/base_d_asa/contract.py:959-960 // @arc4.abimethod(readonly=True) // def get_asset_metadata(self) -> typ.AssetMetadata: proto 0 1 - // smart_contracts/base_d_asa/contract.py:956 + // smart_contracts/base_d_asa/contract.py:967 // return typ.AssetMetadata(self.metadata) intc_0 // 0 bytec 19 // "metadata" @@ -2769,11 +2779,11 @@ get_asset_metadata: // smart_contracts.base_d_asa.contract.BaseDAsa.asset_update() -> void: asset_update: - // smart_contracts/base_d_asa/contract.py:466-467 + // smart_contracts/base_d_asa/contract.py:464-465 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def asset_update(self) -> None: proto 0 0 - // smart_contracts/base_d_asa/contract.py:471-474 + // smart_contracts/base_d_asa/contract.py:469-472 // # The reference implementation grants the update permissions to the Arranger. // # Other implementations may disable D-ASA application updatability or change its authorizations. // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they might introduce breaking changes. diff --git a/smart_contracts/artifacts/base_d_asa/BaseDAsa.arc32.json b/smart_contracts/artifacts/base_d_asa/BaseDAsa.arc32.json index fcb8492..5fda655 100644 --- a/smart_contracts/artifacts/base_d_asa/BaseDAsa.arc32.json +++ b/smart_contracts/artifacts/base_d_asa/BaseDAsa.arc32.json @@ -70,7 +70,7 @@ "no_op": "CALL" } }, - "get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)": { + "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)": { "read_only": true, "call_config": { "no_op": "CALL" @@ -83,6 +83,10 @@ "denomination_asset_id", "uint64" ], + [ + "settlement_asset_id", + "uint64" + ], [ "outstanding_principal", "uint64" @@ -188,7 +192,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCA0IDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjaXJjdWxhdGluZ191bml0cyIgInN0YXR1cyIgInVuaXRfdmFsdWUiICJ0b3RhbF91bml0cyIgInRvdGFsX2NvdXBvbnMiICJtYXR1cml0eV9kYXRlIiAweDUyMzMzMDIzIDB4NTIzMjMwMjMgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgImRheV9jb3VudF9jb252ZW50aW9uIiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAiaXNzdWFuY2VfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiICJzdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJzZXR0bGVtZW50X2Fzc2V0X2lkIiAibWV0YWRhdGEiICJpbnRlcmVzdF9yYXRlIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAgMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczIDB4MDY4MTAxIDB4NTIzODMwMjMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyAjIFJvbGUgQmFzZWQgQWNjZXNzIENvbnRyb2wKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OS02MAogICAgLy8gIyBBc3NldCBDb25maWd1cmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMTggLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NS02NgogICAgLy8gIyBNZXRhZGF0YQogICAgLy8gc2VsZi5tZXRhZGF0YSA9IEJ5dGVzKCkKICAgIGJ5dGVjIDE5IC8vICJtZXRhZGF0YSIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4LTY5CiAgICAvLyAjIFN1cHBseQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMiAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NAogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OS05MAogICAgLy8gIyBTdGF0dXMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU1QVFkpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MgogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMTcgLy8gImRlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyMQogICAgcHVzaGJ5dGVzcyAweDYzZjk5NTg5IDB4ZDNhNGQ2YWIgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHgzMDFkZDkxOSAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGRkY2VjMDdiIC8vIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNltdLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhc3NpZ25fcm9sZShhZGRyZXNzLHVpbnQ4LGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInJldm9rZV9yb2xlKGFkZHJlc3MsdWludDgpdWludDY0IiwgbWV0aG9kICJvcGVuX2FjY291bnQoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiY2xvc2VfYWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicHJpbWFyeV9kaXN0cmlidXRpb24oYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJzZXRfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2FjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfaW5mbygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wpIiwgbWV0aG9kICJnZXRfYWNjb3VudF9pbmZvKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCkiLCBtZXRob2QgImdldF90aW1lX2V2ZW50cygpdWludDY0W10iLCBtZXRob2QgImdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21ldGFkYXRhKClieXRlW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2Fzc2V0X2NyZWF0ZV9yb3V0ZUA1IG1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDYgbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDcgbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUA4IG1haW5fcmV2b2tlX3JvbGVfcm91dGVAOSBtYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxMCBtYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTEgbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxMiBtYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDEzIG1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAxNCBtYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxNSBtYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDE2IG1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAxNyBtYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAxOCBtYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDE5IG1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDIwCgptYWluX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfbWV0YWRhdGEKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2RlZmF1bHRfc3RhdHVzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hY2NvdW50X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbG9zZV9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHJldm9rZV9yb2xlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2lnbl9yb2xlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jb25maWdfcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfY29uZmlnCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X2NyZWF0ZV9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGFzc2V0X2NyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIGludGNfMyAvLyA0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBtYWluX2Fzc2V0X3VwZGF0ZUAyMgogICAgYiBtYWluX2FmdGVyX2lmX2Vsc2VAMjMKCm1haW5fYXNzZXRfdXBkYXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY2CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjYtNDY3CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgY2FsbHN1YiBhc3NldF91cGRhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jcmVhdGUoYXJyYW5nZXI6IGJ5dGVzLCBtZXRhZGF0YTogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1NC00NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGFzc2V0X2NyZWF0ZShzZWxmLCBhcnJhbmdlcjogYXJjNC5BZGRyZXNzLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyLm5hdGl2ZQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjQKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDE5IC8vICJtZXRhZGF0YSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jb25maWcoZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBieXRlcywgc2V0dGxlbWVudF9hc3NldF9pZDogYnl0ZXMsIHByaW5jaXBhbDogYnl0ZXMsIG1pbmltdW1fZGVub21pbmF0aW9uOiBieXRlcywgZGF5X2NvdW50X2NvbnZlbnRpb246IGJ5dGVzLCBpbnRlcmVzdF9yYXRlOiBieXRlcywgY291cG9uX3JhdGVzOiBieXRlcywgdGltZV9ldmVudHM6IGJ5dGVzLCB0aW1lX3BlcmlvZHM6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzYtNDg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF9jb25maWcoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHByaW5jaXBhbDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgbWluaW11bV9kZW5vbWluYXRpb246IGFyYzQuVUludDY0LAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uOiBhcmM0LlVJbnQ4LAogICAgLy8gICAgIGludGVyZXN0X3JhdGU6IGFyYzQuVUludDE2LAogICAgLy8gICAgIGNvdXBvbl9yYXRlczogdHlwLkNvdXBvblJhdGVzLAogICAgLy8gICAgIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cywKICAgIC8vICAgICB0aW1lX3BlcmlvZHM6IHR5cC5UaW1lUGVyaW9kcywKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDkgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MTcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUxOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU1QVFksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTIwLTUyMQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9kZW5vbWluYXRpb25fYXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtOQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzcKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgZnJhbWVfZGlnIDMKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NS0xNzgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgLy8gKSwgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGZyYW1lX2RpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI0LTUyNQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHNldHRsZW1lbnRfYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC04CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODgKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODYtMTg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTkzCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOCAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTQtMjAwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTkKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTYKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTcKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk4CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTQtMTk1CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMyAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0yMDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzAKICAgIC8vIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgZnJhbWVfZGlnIC03CiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTYKICAgIGJ0b2kKICAgIGR1cDIKICAgICUKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyOC01MzEKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJpbmNpcGFsLm5hdGl2ZSAlIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZSA9PSAwCiAgICAvLyApLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIE1pbmltdW0gZGVub21pbmF0aW9uIGlzIG5vdCBhIGRpdmlzb3Igb2YgcHJpbmNpcGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgYnl0ZWNfMyAvLyAidW5pdF92YWx1ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gcHJpbmNpcGFsLm5hdGl2ZSAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIC8KICAgIGJ5dGVjIDQgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzNS01MzYKICAgIC8vICMgU2V0IERheS1Db3VudCBDb252ZW50aW9uCiAgICAvLyBzZWxmLmFzc2VydF9kYXlfY291bnRfY29udmVudGlvbihkYXlfY291bnRfY29udmVudGlvbi5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTUKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDYKICAgIC8vIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBibnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICBwdXNoaW50IDI1NSAvLyAyNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNwoKYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTIKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBkYXlfY291bnRfY29udmVudGlvbgogICAgYnl0ZWMgMTAgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzktNTQwCiAgICAvLyAjIFNldCBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLmFzc2VydF9pbnRlcmVzdF9yYXRlKGludGVyZXN0X3JhdGUubmF0aXZlKQogICAgZnJhbWVfZGlnIC00CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTYKICAgIC8vIGFzc2VydCBpbnRlcmVzdF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9JTlRFUkVTVF9SQVRFCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjAKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDIwIC8vICJpbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjgKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDUgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI5CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAyOCAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjggLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9wdXQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM1CiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGludGNfMyAvLyA0CiAgICArCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM0LTIzNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ5CiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjYwCiAgICAvLyBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlID0gdGltZV9ldmVudHMuY29weSgpCiAgICBieXRlYyAyMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDIxIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjYxLTI2MwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjYxCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTEgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MS0yNjMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0LTI2NgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjQKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxMiAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0LTI2NgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjcKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5JU1NVQU5DRV9EQVRFX0lEWF0ubmF0aXZlCiAgICBleHRyYWN0IDE2IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieXRlYyAxMyAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjktMjcwCiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzEKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gYXNzZXJ0IG5vdCB0aW1lX3BlcmlvZHMubGVuZ3RoLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU2CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUAxOAoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNS0xMTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTcKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzOC0yMzkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWxmLCB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDEKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDIKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MS0yNDIKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MC0yNDMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gICAgID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUUKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDQKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANgoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF93aGlsZV90b3BAODoKICAgIHB1c2hpbnQgNzUgLy8gNzUKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTQKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAyOSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDI5IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF93aGlsZV90b3BAOAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdGltZV9pID0gdGltZV9ldmVudHNbX3RdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTAKICAgIC8vIHRpbWVfZiA9IHRpbWVfZXZlbnRzW190ICsgMV0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUxCiAgICAvLyBhc3NlcnQgdGltZV9mID4gdGltZV9pLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTIKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gIT0gVUludDY0KGNzdC5EQ0NfQ09OVCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAhPQogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1My0yNTQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1My0yNTYKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICAvLyAgICAgY3N0LkRBWV8yX1NFQwogICAgLy8gKSA9PSAwLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRAogICAgcHVzaGludCA4NjQwMCAvLyA4NjQwMAogICAgJQogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBpbiBBY3R1YWwvQWN0dWFsIGRheSBjb3VudCBjb252ZW50aW9uIG11c3QgYmUgbXVsdGlwbGVzIG9mIGEgZGF5IChpbiBzZWNvbmRzKQogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANjoKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1OC01NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMoCiAgICAvLyAgICAgc2VsZiwgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMKICAgIC8vICkgLT4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTc5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNCAvLyAyMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgzCiAgICAvLyBhc3NlcnQgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPj0gMSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NAogICAgLy8gaWYgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPiAxOgogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NQogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0xCiAgICBmcmFtZV9idXJ5IDEKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NwogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4OC01OTAKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4Ny01OTAKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODYtNTkxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTItNTk0CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NQogICAgLy8gaWYgc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OQogICAgLy8gY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OC02MDAKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5Ny02MDAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYtNjAxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDItNjA0CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA3CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA2LTYwOAogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOS02MTEKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDUtNjEyCiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2RlZmF1bHRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNy0xMDgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NpZ25fcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcywgY29uZmlnOiBieXRlcykgLT4gYnl0ZXM6CmFzc2lnbl9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE0LTYxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzaWduX3JvbGUoCiAgICAvLyAgICAgc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgsIGNvbmZpZzogYXJjNC5EeW5hbWljQnl0ZXMKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM2CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNwogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzgKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDMKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IGFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANwoKYXNzaWduX3JvbGVfYm9vbF90cnVlQDY6CiAgICBpbnRjXzEgLy8gMQoKYXNzaWduX3JvbGVfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDYKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwIC8vIDIwLCA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NS02NzQKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcy5uYXRpdmUKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgKAogICAgLy8gICAgICAgICAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgICAgICBjb25maWcubmF0aXZlCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgKAogICAgLy8gICAgICAgICAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgICAgICBjb25maWcubmF0aXZlCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5IGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTAgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8zQDEyIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzRAMTMgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc0CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV81QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4CiAgICAvLyByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICBieXRlYyAzMCAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2Ny02NjkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjcxCiAgICAvLyBjb25maWcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzAtNjcyCiAgICAvLyBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICBzd2FwCiAgICByZXRzdWIKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzRAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2NQogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2MQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzNjMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2MgogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjQgLy8gMHg1MjM1MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU4CiAgICAvLyBjb25maWcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTctNjU5CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgYnl0ZWMgMjUgLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDktNjUxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MwogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUyLTY1NAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8wQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDcKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICBieXRlYyA4IC8vIDB4NTIzMjMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzaWduX3JvbGVfYm9vbF9tZXJnZUA4CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EucmV2b2tlX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMpIC0+IGJ5dGVzOgpyZXZva2Vfcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3Ny02NzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHJldm9rZV9yb2xlKHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4KSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTYKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk3CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5OAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5OQogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMQogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMgogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IHJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANgoKcmV2b2tlX3JvbGVfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk3LTcwMwogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA1LTcwNgogICAgLy8gIyBBcnJhbmdlciByb2xlIGNhbiBub3QgYmUgcmV2b2tlZCAoanVzdCByb3RhdGVkKQogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwIC8vIDQwLCA1MCwgNjAsIDcwLCA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA0LTcyMgogICAgLy8gbWF0Y2ggcm9sZS5uYXRpdmU6CiAgICAvLyAgICAgIyBBcnJhbmdlciByb2xlIGNhbiBub3QgYmUgcmV2b2tlZCAoanVzdCByb3RhdGVkKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQVVUSE9SSVRZICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfSU5URVJFU1RfT1JBQ0xFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKCkKICAgIGZyYW1lX2RpZyAwCiAgICBtYXRjaCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMUA5IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzJAMTAgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzAgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIwCiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfSU5URVJFU1RfT1JBQ0xFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICBzd2FwCiAgICByZXRzdWIKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjM3MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE3CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQVVUSE9SSVRZICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzJAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzNjMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjQgLy8gMHg1MjM1MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzExCiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYiByZXZva2Vfcm9sZV9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5vcGVuX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6Cm9wZW5fYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNS03MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wZW5fYWNjb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNCAvLyAyMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDcKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ4CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDcgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUxLTc1NwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MwogICAgLy8gdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDI2IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUxLTc1NwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NAogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgMjYgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU1CiAgICAvLyBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDI2IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUxLTc1NwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NgogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgYnl0ZWMgMjcgLy8gMHgwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUxLTc1NwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOS0xMjAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICBieXRlYyAyNSAvLyAweDUyMzQzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMy0xMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9tYW5hZ2VyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQtMTI1CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9tYW5hZ2VyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjUtMTI2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMi0xMjcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTEtMTEyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5jbG9zZV9hY2NvdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpjbG9zZV9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwLTc2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xvc2VfYWNjb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlR1cGxlW2FyYzQuVUludDY0LCBhcmM0LlVJbnQ2NF06CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3OAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MgogICAgLy8gY2xvc2VkX3VuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzgzCiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVCArIGhvbGRpbmdfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg0CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IGNsb3NlZF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU5CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IDA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBibnogY2xvc2VfYWNjb3VudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM2MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGludGMgNCAvLyAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbG9zZV9hY2NvdW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4NwogICAgLy8gKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODYtNzg4CiAgICAvLyByZXR1cm4gYXJjNC5UdXBsZSgKICAgIC8vICAgICAoYXJjNC5VSW50NjQoY2xvc2VkX3VuaXRzKSwgYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApKQogICAgLy8gKQogICAgY29uY2F0CiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5wcmltYXJ5X2Rpc3RyaWJ1dGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5MC03OTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHByaW1hcnlfZGlzdHJpYnV0aW9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg0LTI4NwogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1LTI4NwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODcKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4Ni0yODcKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBmcmFtZV9kaWcgMgogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1LTI4NwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgzLTI4OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgYnl0ZWMgMjQgLy8gMHg1MjM1MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzLTEzNgogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2RlYWxlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0LTEzNQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0LTEzNgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUtMTM2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMyLTEzNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gICAgIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgNyAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MTgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODE5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyMAogICAgLy8gYXNzZXJ0IHVuaXRzLm5hdGl2ZSA+IDAsIGVyci5aRVJPX1VOSVRTCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjIKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjEtODIzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI1CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICs9IHVuaXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNi04MjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNi04MjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IGFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDQwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5jaXJjdWxhdGluZ191bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIC0KICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyOgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMwoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2Fzc2V0X3N1c3BlbnNpb24oc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMyLTgzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2Fzc2V0X3N1c3BlbnNpb24oc2VsZiwgc3VzcGVuZGVkOiBhcmM0LkJvb2wpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ3CiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NChzdXNwZW5kZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAxNiAvLyAic3VzcGVuZGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0OAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OS0xNTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICBieXRlYyAyMiAvLyAweDUyMzczMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1My0xNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0LTE1NgogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTUtMTU2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0LTE1NgogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Mi0xNTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyAgICAgYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9hY2NvdW50X3N1c3BlbnNpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hY2NvdW50X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTAtODUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODY4CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgNyAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBwdXNoaW50IDQ0OCAvLyA0NDgKICAgIHN3YXAKICAgIHNldGJpdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfZGVmYXVsdF9zdGF0dXMoZGVmYXVsdGVkOiBieXRlcykgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODczLTg3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2RlZmF1bHRfc3RhdHVzKHNlbGYsIGRlZmF1bHRlZDogYXJjNC5Cb29sKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBieXRlYyAyMyAvLyAweDUyMzYzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDMtMTQ2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1LTE0NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Mi0xNDcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gICAgIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODUKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KGRlZmF1bHRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDE3IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9pbmZvKCkgLT4gYnl0ZXM6CmdldF9hc3NldF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg3LTg4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2luZm8oc2VsZikgLT4gdHlwLkFzc2V0SW5mbzoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk4CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTkKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDAKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDEKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMgogICAgLy8gaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAzCiAgICAvLyB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDQKICAgIC8vIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNS05MDcKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOC05MTAKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMQogICAgLy8gaXNzdWFuY2VfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLmlzc3VhbmNlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTIKICAgIC8vIG1hdHVyaXR5X2RhdGU9YXJjNC5VSW50NjQoc2VsZi5tYXR1cml0eV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTMKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgYnl0ZWMgMjcgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTQKICAgIC8vIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgYnl0ZWMgMjcgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTctOTE1CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgLy8gKQogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBwdXNoaW50IDYwMSAvLyA2MDEKICAgIHN3YXAKICAgIHNldGJpdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNy05MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNC05MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQyCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIHB1c2hieXRlcyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0MwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDQKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDIxIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ1CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0Ny05NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTAKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1MQogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ5LTk1MgogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQtOTU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NgogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X3VwZGF0ZSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2Ni00NjcKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgYXNzZXRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MS00NzQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCA0IDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjaXJjdWxhdGluZ191bml0cyIgInN0YXR1cyIgInVuaXRfdmFsdWUiICJ0b3RhbF91bml0cyIgInRvdGFsX2NvdXBvbnMiICJtYXR1cml0eV9kYXRlIiAweDUyMzMzMDIzIDB4NTIzMjMwMjMgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgInNldHRsZW1lbnRfYXNzZXRfaWQiICJkYXlfY291bnRfY29udmVudGlvbiIgInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIgInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIgImlzc3VhbmNlX2RhdGUiICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIiAic3VzcGVuZGVkIiAiZGVmYXVsdGVkIiAibWV0YWRhdGEiICJpbnRlcmVzdF9yYXRlIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAgMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczIDB4MDY4MTAxIDB4NTIzODMwMjMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyAjIFJvbGUgQmFzZWQgQWNjZXNzIENvbnRyb2wKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OS02MAogICAgLy8gIyBBc3NldCBDb25maWd1cmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NS02NgogICAgLy8gIyBNZXRhZGF0YQogICAgLy8gc2VsZi5tZXRhZGF0YSA9IEJ5dGVzKCkKICAgIGJ5dGVjIDE5IC8vICJtZXRhZGF0YSIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4LTY5CiAgICAvLyAjIFN1cHBseQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NAogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OS05MAogICAgLy8gIyBTdGF0dXMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU1QVFkpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAic3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MgogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMTggLy8gImRlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyMQogICAgcHVzaGJ5dGVzcyAweDYzZjk5NTg5IDB4ZDNhNGQ2YWIgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHg4MGJmY2RkMSAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGRkY2VjMDdiIC8vIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNltdLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhc3NpZ25fcm9sZShhZGRyZXNzLHVpbnQ4LGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInJldm9rZV9yb2xlKGFkZHJlc3MsdWludDgpdWludDY0IiwgbWV0aG9kICJvcGVuX2FjY291bnQoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiY2xvc2VfYWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicHJpbWFyeV9kaXN0cmlidXRpb24oYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJzZXRfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2FjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfaW5mbygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sKSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9ldmVudHMoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpdWludDY0W10iLCBtZXRob2QgImdldF9hc3NldF9tZXRhZGF0YSgpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF9jcmVhdGVfcm91dGVANSBtYWluX2Fzc2V0X2NvbmZpZ19yb3V0ZUA2IG1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUA3IG1haW5fYXNzaWduX3JvbGVfcm91dGVAOCBtYWluX3Jldm9rZV9yb2xlX3JvdXRlQDkgbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTAgbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDExIG1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMTIgbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAxMyBtYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMTQgbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMTUgbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAxNiBtYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMTcgbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMTggbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAxOSBtYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyMAoKbWFpbl9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21ldGFkYXRhCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF9pbmZvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYWNjb3VudF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfaW5mbwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9kZWZhdWx0X3N0YXR1cwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYXNzZXRfc3VzcGVuc2lvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcHJpbWFyeV9kaXN0cmlidXRpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY2xvc2VfYWNjb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG9wZW5fYWNjb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiByZXZva2Vfcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NpZ25fcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2V0X2NvbmZpZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jcmVhdGVfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgY2FsbHN1YiBhc3NldF9jcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzMgLy8gNAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgbWF0Y2ggbWFpbl9hc3NldF91cGRhdGVAMjIKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDIzCgptYWluX2Fzc2V0X3VwZGF0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY0LTQ2NQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiBhc3NldF91cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIGNhbGxzdWIgYXNzZXRfdXBkYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfY3JlYXRlKGFycmFuZ2VyOiBieXRlcywgbWV0YWRhdGE6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jcmVhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTItNDUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBhc3NldF9jcmVhdGUoc2VsZiwgYXJyYW5nZXI6IGFyYzQuQWRkcmVzcywgbWV0YWRhdGE6IHR5cC5Bc3NldE1ldGFkYXRhKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjEKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlci5uYXRpdmUKICAgIGJ5dGVjIDggLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYyCiAgICAvLyBzZWxmLm1ldGFkYXRhID0gbWV0YWRhdGEubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlYyAxOSAvLyAibWV0YWRhdGEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfY29uZmlnKGRlbm9taW5hdGlvbl9hc3NldF9pZDogYnl0ZXMsIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGJ5dGVzLCBwcmluY2lwYWw6IGJ5dGVzLCBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYnl0ZXMsIGRheV9jb3VudF9jb252ZW50aW9uOiBieXRlcywgaW50ZXJlc3RfcmF0ZTogYnl0ZXMsIGNvdXBvbl9yYXRlczogYnl0ZXMsIHRpbWVfZXZlbnRzOiBieXRlcywgdGltZV9wZXJpb2RzOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDc0LTQ4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzZXRfY29uZmlnKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwcmluY2lwYWw6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG1pbmltdW1fZGVub21pbmF0aW9uOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbjogYXJjNC5VSW50OCwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlOiBhcmM0LlVJbnQxNiwKICAgIC8vICAgICBjb3Vwb25fcmF0ZXM6IHR5cC5Db3Vwb25SYXRlcywKICAgIC8vICAgICB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMsCiAgICAvLyAgICAgdGltZV9wZXJpb2RzOiB0eXAuVGltZVBlcmlvZHMsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA5IDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTE1CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MTYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VNUFRZLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUxOC01MTkKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5hc3NlcnRfZGVub21pbmF0aW9uX2Fzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTkKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc3CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGZyYW1lX2RpZyAzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzUtMTc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIC8vICksIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODIKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBmcmFtZV9kaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyMi01MjMKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5hc3NlcnRfc2V0dGxlbWVudF9hc3NldChzZXR0bGVtZW50X2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtOAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTg4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIGRpZyAxCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTg2LTE4OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHNldHRsZW1lbnQgYXNzZXQgaXMgdGhlIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRVRUTEVNRU5UX0FTU0VUCiAgICBhc3NlcnQgLy8gRGlmZmVyZW50IHNldHRsZW1lbnQgYXNzZXQgbm90IHN1cHBvcnRlZCwgbXVzdCBiZSBlcXVhbCB0byBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gc2V0dGxlbWVudF9hc3NldF9pZAogICAgYnl0ZWMgMTAgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk0LTIwMAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk5CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk3CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk0LTE5NQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTQtMjAwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI4CiAgICAvLyBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIGZyYW1lX2RpZyAtNwogICAgYnRvaQogICAgZnJhbWVfZGlnIC02CiAgICBidG9pCiAgICBkdXAyCiAgICAlCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjYtNTI5CiAgICAvLyAjIFNldCBQcmluY2lwYWwgYW5kIE1pbmltdW0gRGVub21pbmF0aW9uCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgLy8gKSwgZXJyLklOVkFMSURfTUlOSU1VTV9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBNaW5pbXVtIGRlbm9taW5hdGlvbiBpcyBub3QgYSBkaXZpc29yIG9mIHByaW5jaXBhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMwCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIGJ5dGVjXzMgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbC5uYXRpdmUgLy8gbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlCiAgICAvCiAgICBieXRlYyA0IC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzMtNTM0CiAgICAvLyAjIFNldCBEYXktQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5hc3NlcnRfZGF5X2NvdW50X2NvbnZlbnRpb24oZGF5X2NvdW50X2NvbnZlbnRpb24ubmF0aXZlKQogICAgZnJhbWVfZGlnIC01CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA2CiAgICAvLyBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDQtMjA4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYm56IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDcKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDQtMjA4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDQtMjA4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjEyCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGZyYW1lX2RpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTM3LTUzOAogICAgLy8gIyBTZXQgSW50ZXJlc3QgUmF0ZQogICAgLy8gc2VsZi5hc3NlcnRfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjE2CiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfSU5URVJFU1RfUkFURQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW50ZXJlc3QgcmF0ZSBpcyBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjIwCiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlCiAgICBieXRlYyAyMCAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjQKICAgIC8vIGFzc2VydCBub3QgY291cG9uX3JhdGVzLmxlbmd0aCwgZXJyLklOVkFMSURfQ09VUE9OX1JBVEVTCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICAhCiAgICBhc3NlcnQgLy8gQ291cG9uIHJhdGVzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI4CiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBjb3Vwb25fcmF0ZXMubGVuZ3RoCiAgICBieXRlYyA1IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gaWYgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzAKICAgIC8vIHNlbGYuY291cG9uX3JhdGVzLnZhbHVlID0gY291cG9uX3JhdGVzLmNvcHkoKQogICAgYnl0ZWMgMjggLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDI4IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgZnJhbWVfZGlnIC0zCiAgICBib3hfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNC0yMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUwogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0NwogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gc2VsZi50aW1lX2V2ZW50cy52YWx1ZSA9IHRpbWVfZXZlbnRzLmNvcHkoKQogICAgYnl0ZWMgMjEgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAyMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MS0yNjMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDEyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEtMjYzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTMgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY3CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuSVNTVUFOQ0VfREFURV9JRFhdLm5hdGl2ZQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgMTQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5LTI3MAogICAgLy8gIyBTb21lIEQtQVNBIG1heSBub3QgaGF2ZSBhIG1hdHVyaXR5IGRhdGUgKGUuZy4sIHBlcnBldHVhbHMpCiAgICAvLyBpZiB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgaW50Y18zIC8vIDQKICAgICsKICAgID09CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjcxCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzUKICAgIC8vIGFzc2VydCBub3QgdGltZV9wZXJpb2RzLmxlbmd0aCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1NAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTUtMTE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzgtMjM5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2VsZiwgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzKSAtPiBOb25lOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQxCiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQyCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDEtMjQyCiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDAtMjQzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vICAgICA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ0CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDQKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDYKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDg6CiAgICBwdXNoaW50IDc1IC8vIDc1CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDE0CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMjkgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAyOSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDgKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW190XS5uYXRpdmUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUwCiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tfdCArIDFdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUyCiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIHB1c2hpbnQgMjU1IC8vIDI1NQogICAgIT0KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTMtMjU0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTMtMjU2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgLy8gICAgIGNzdC5EQVlfMl9TRUMKICAgIC8vICkgPT0gMCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0QKICAgIHB1c2hpbnQgODY0MDAgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTYtNTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU3NwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTc4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTc5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4MQogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODIKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODMKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODUKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODYtNTg4CiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODUtNTg4CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTg0LTU4OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9PUEVOSU5HX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgb3BlbmluZyBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTAKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkwLTU5MgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTMKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk1CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTcKICAgIC8vIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYtNTk4CiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTUtNTk4CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk0LTU5OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vICAgICA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9DTE9TVVJFX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgY2xvc3VyZSBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDAKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAwLTYwMgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNC02MDYKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDgKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDctNjA5CiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAzLTYxMAogICAgLy8gcmV0dXJuIHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZSgKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDctMTA4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMi02MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM2CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNwogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM4CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzOQogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ0CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDMtNjcyCiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3MgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2NgogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzAgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjUtNjY3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4LTY3MAogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3MwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYyCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjMKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjAKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU1LTY1NwogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI1IC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ3LTY0OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTEKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MC02NTIKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ1CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnJldm9rZV9yb2xlKHJvbGVfYWRkcmVzczogYnl0ZXMsIHJvbGU6IGJ5dGVzKSAtPiBieXRlczoKcmV2b2tlX3JvbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzUtNjc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiByZXZva2Vfcm9sZShzZWxmLCByb2xlX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcm9sZTogYXJjNC5VSW50OCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5MwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTYKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MCAvLyA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTcKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUtNzAxCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5OAogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTkKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MCAvLyA3MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiByZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDYKCnJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCnJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NS03MDEKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMy03MDQKICAgIC8vICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MCAvLyA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMi03MjAKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTEgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIwCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMwIC8vIDB4NTIzODMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzExCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTIKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNSAvLyAweDUyMzQzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDYKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Eub3Blbl9hY2NvdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpvcGVuX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjMtNzI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcGVuX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ1CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDcKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEKICAgIC8vIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICBieXRlYyAyNiAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTIKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDI2IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MwogICAgLy8gcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICBieXRlYyAyNiAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTQKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIGJ5dGVjIDI3IC8vIDB4MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTYKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTktMTIwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgYnl0ZWMgMjUgLy8gMHg1MjM0MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjMtMTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfbWFuYWdlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNQogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNC0xMjYKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfbWFuYWdlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEyNgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNC0xMjYKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgphc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjItMTI3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gICAgIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgphc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTExLTExMgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAic3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuY2xvc2VfYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKY2xvc2VfYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OC03NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5UdXBsZVthcmM0LlVJbnQ2NCwgYXJjNC5VSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzc3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgNyAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODAKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlQgKyBob2xkaW5nX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MgogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBjbG9zZWRfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1NwogICAgLy8gaWYgc2VsZi5jaXJjdWxhdGluZ191bml0cyA9PSAwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgYm56IGNsb3NlX2FjY291bnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNTgKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjIDQgLy8gMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xvc2VfYWNjb3VudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODUKICAgIC8vIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg0LTc4NgogICAgLy8gcmV0dXJuIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIC8vICkKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EucHJpbWFyeV9kaXN0cmlidXRpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODgtNzkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NC0yODcKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1LTI4NgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NS0yODcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg3CiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODYtMjg3CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgZnJhbWVfZGlnIDIKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NS0yODcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4My0yODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIGJ5dGVjIDI0IC8vIDB4NTIzNTMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzMKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMy0xMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNC0xMzUKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNC0xMzYKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM2CiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2RlYWxlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM1LTEzNgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0LTEzNgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMi0xMzcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDcgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODE2CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgxNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MTgKICAgIC8vIGFzc2VydCB1bml0cy5uYXRpdmUgPiAwLCBlcnIuWkVST19VTklUUwogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMubmF0aXZlIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODE5LTgyMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMubmF0aXZlIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyMwogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArPSB1bml0cy5uYXRpdmUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjQtODI2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjQtODI2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBhcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBzd2FwCiAgICByZXBsYWNlMiA0MAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI4CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyAtIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICAtCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMjoKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTMKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9hc3NldF9zdXNwZW5zaW9uKHN1c3BlbmRlZDogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfYXNzZXRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMC04MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hc3NldF9zdXNwZW5zaW9uKHNlbGYsIHN1c3BlbmRlZDogYXJjNC5Cb29sKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ0CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0NQogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoc3VzcGVuZGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMTcgLy8gInN1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDYKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDktMTUwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgYnl0ZWMgMjIgLy8gMHg1MjM3MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTMtMTU2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmF1dGhvcml0eSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0LTE1NQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NC0xNTYKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmF1dGhvcml0eSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU1LTE1NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NC0xNTYKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTItMTU3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgLy8gICAgIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYWNjb3VudF9zdXNwZW5zaW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHN1c3BlbmRlZDogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfYWNjb3VudF9zdXNwZW5zaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4LTg1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2FjY291bnRfc3VzcGVuc2lvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgc3VzcGVuZGVkOiBhcmM0LkJvb2wKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2NgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDcgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgcHVzaGludCA0NDggLy8gNDQ4CiAgICBzd2FwCiAgICBzZXRiaXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2RlZmF1bHRfc3RhdHVzKGRlZmF1bHRlZDogYnl0ZXMpIC0+IHZvaWQ6CnNldF9kZWZhdWx0X3N0YXR1czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MS04NzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9kZWZhdWx0X3N0YXR1cyhzZWxmLCBkZWZhdWx0ZWQ6IGFyYzQuQm9vbCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgYnl0ZWMgMjMgLy8gMHg1MjM2MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzLTE0NgogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NgogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ2CiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NS0xNDYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NgogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDItMTQ3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vICAgICBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgzCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IFVJbnQ2NChkZWZhdWx0ZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAxOCAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfaW5mbygpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NS04ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9pbmZvKHNlbGYpIC0+IHR5cC5Bc3NldEluZm86CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NgogICAgLy8gZGVub21pbmF0aW9uX2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk3CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5OAogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgICoKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5OQogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMAogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAxCiAgICAvLyBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDIKICAgIC8vIHRvdGFsX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX3VuaXRzKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMwogICAgLy8gY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA1CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA0LTkwNgogICAgLy8gcHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA4CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA3LTkwOQogICAgLy8gcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEwCiAgICAvLyBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMQogICAgLy8gbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMgogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICBieXRlYyAyNyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMwogICAgLy8gZGVmYXVsdGVkPWFyYzQuQm9vbChib29sKHNlbGYuZGVmYXVsdGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICBieXRlYyAyNyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NS05MTQKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgLy8gKQogICAgdW5jb3ZlciAxMwogICAgdW5jb3ZlciAxMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgNjY1IC8vIDY2NQogICAgc3dhcAogICAgc2V0Yml0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYWNjb3VudF9pbmZvKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYWNjb3VudF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE2LTkxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FjY291bnRfaW5mbyhzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLkFjY291bnRJbmZvOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDcgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMxCiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfdGltZV9ldmVudHMoKSAtPiBieXRlczoKZ2V0X3RpbWVfZXZlbnRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMzLTkzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3RpbWVfZXZlbnRzKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDEKICAgIC8vIHRpbWVfZXZlbnRzID0gdHlwLlRpbWVFdmVudHMoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQyCiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0MwogICAgLy8gdGltZV9ldmVudHMgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMjEgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKCmdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDQKICAgIC8vIHJldHVybiB0aW1lX2V2ZW50cwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKCkgLT4gYnl0ZXM6CmdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ2LTk0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoc2VsZikgLT4gdHlwLlRpbWVFdmVudHM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NQogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU2CiAgICAvLyBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQtOTU3CiAgICAvLyByZXR1cm4gdHlwLlRpbWVFdmVudHMoCiAgICAvLyAgICAgYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICAvLyApCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2Fzc2V0X21ldGFkYXRhKCkgLT4gYnl0ZXM6CmdldF9hc3NldF9tZXRhZGF0YToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1OS05NjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9tZXRhZGF0YShzZWxmKSAtPiB0eXAuQXNzZXRNZXRhZGF0YToKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY3CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0TWV0YWRhdGEoc2VsZi5tZXRhZGF0YSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAibWV0YWRhdGEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGEgZXhpc3RzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKCkgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY0LTQ2NQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiBhc3NldF91cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY5LTQ3MgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMgT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSBkaXNhYmxlIEQtQVNBIGFwcGxpY2F0aW9uIHVwZGF0YWJpbGl0eSBvciBjaGFuZ2UgaXRzIGF1dGhvcml6YXRpb25zLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5IG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { @@ -545,8 +549,8 @@ "args": [], "readonly": true, "returns": { - "type": "(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", - "desc": "Denomination Asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary Distribution Opening Date, Primary Distribution Closure Date, Issuance Date, Maturity Date, Suspended, Defaulted" + "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", + "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Defaulted" }, "desc": "Get D-ASA info" }, @@ -562,7 +566,7 @@ "readonly": true, "returns": { "type": "(address,uint64,uint64,uint64,bool)", - "desc": "Payment Address, D-ASA units, Unit value, Paid coupons, Suspended" + "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" }, "desc": "Get account info" }, @@ -581,16 +585,20 @@ "args": [], "readonly": true, "returns": { - "type": "uint64[]" - } + "type": "uint64[]", + "desc": "Secondary market schedule" + }, + "desc": "Get secondary market schedule" }, { "name": "get_asset_metadata", "args": [], "readonly": true, "returns": { - "type": "byte[]" - } + "type": "byte[]", + "desc": "Asset metadata" + }, + "desc": "Get D-ASA metadata" } ], "networks": {} diff --git a/smart_contracts/artifacts/base_d_asa/base_d_asa_client.py b/smart_contracts/artifacts/base_d_asa/base_d_asa_client.py index 93a0e86..f080406 100644 --- a/smart_contracts/artifacts/base_d_asa/base_d_asa_client.py +++ b/smart_contracts/artifacts/base_d_asa/base_d_asa_client.py @@ -93,7 +93,7 @@ "no_op": "CALL" } }, - "get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)": { + "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)": { "read_only": true, "structs": { "output": { @@ -103,6 +103,10 @@ "denomination_asset_id", "uint64" ], + [ + "settlement_asset_id", + "uint64" + ], [ "outstanding_principal", "uint64" @@ -211,7 +215,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCA0IDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjaXJjdWxhdGluZ191bml0cyIgInN0YXR1cyIgInVuaXRfdmFsdWUiICJ0b3RhbF91bml0cyIgInRvdGFsX2NvdXBvbnMiICJtYXR1cml0eV9kYXRlIiAweDUyMzMzMDIzIDB4NTIzMjMwMjMgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgImRheV9jb3VudF9jb252ZW50aW9uIiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAiaXNzdWFuY2VfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiICJzdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJzZXR0bGVtZW50X2Fzc2V0X2lkIiAibWV0YWRhdGEiICJpbnRlcmVzdF9yYXRlIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAgMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczIDB4MDY4MTAxIDB4NTIzODMwMjMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyAjIFJvbGUgQmFzZWQgQWNjZXNzIENvbnRyb2wKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OS02MAogICAgLy8gIyBBc3NldCBDb25maWd1cmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMTggLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NS02NgogICAgLy8gIyBNZXRhZGF0YQogICAgLy8gc2VsZi5tZXRhZGF0YSA9IEJ5dGVzKCkKICAgIGJ5dGVjIDE5IC8vICJtZXRhZGF0YSIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4LTY5CiAgICAvLyAjIFN1cHBseQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMiAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NAogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OS05MAogICAgLy8gIyBTdGF0dXMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU1QVFkpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MgogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMTcgLy8gImRlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyMQogICAgcHVzaGJ5dGVzcyAweDYzZjk5NTg5IDB4ZDNhNGQ2YWIgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHgzMDFkZDkxOSAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGRkY2VjMDdiIC8vIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNltdLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhc3NpZ25fcm9sZShhZGRyZXNzLHVpbnQ4LGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInJldm9rZV9yb2xlKGFkZHJlc3MsdWludDgpdWludDY0IiwgbWV0aG9kICJvcGVuX2FjY291bnQoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiY2xvc2VfYWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicHJpbWFyeV9kaXN0cmlidXRpb24oYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJzZXRfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2FjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfaW5mbygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wpIiwgbWV0aG9kICJnZXRfYWNjb3VudF9pbmZvKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCkiLCBtZXRob2QgImdldF90aW1lX2V2ZW50cygpdWludDY0W10iLCBtZXRob2QgImdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21ldGFkYXRhKClieXRlW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2Fzc2V0X2NyZWF0ZV9yb3V0ZUA1IG1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDYgbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDcgbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUA4IG1haW5fcmV2b2tlX3JvbGVfcm91dGVAOSBtYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxMCBtYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTEgbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxMiBtYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDEzIG1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAxNCBtYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxNSBtYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDE2IG1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAxNyBtYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAxOCBtYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDE5IG1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDIwCgptYWluX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfbWV0YWRhdGEKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2RlZmF1bHRfc3RhdHVzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hY2NvdW50X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbG9zZV9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHJldm9rZV9yb2xlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2lnbl9yb2xlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jb25maWdfcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfY29uZmlnCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X2NyZWF0ZV9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGFzc2V0X2NyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIGludGNfMyAvLyA0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBtYWluX2Fzc2V0X3VwZGF0ZUAyMgogICAgYiBtYWluX2FmdGVyX2lmX2Vsc2VAMjMKCm1haW5fYXNzZXRfdXBkYXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY2CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjYtNDY3CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgY2FsbHN1YiBhc3NldF91cGRhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jcmVhdGUoYXJyYW5nZXI6IGJ5dGVzLCBtZXRhZGF0YTogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1NC00NTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGFzc2V0X2NyZWF0ZShzZWxmLCBhcnJhbmdlcjogYXJjNC5BZGRyZXNzLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyLm5hdGl2ZQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjQKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDE5IC8vICJtZXRhZGF0YSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jb25maWcoZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBieXRlcywgc2V0dGxlbWVudF9hc3NldF9pZDogYnl0ZXMsIHByaW5jaXBhbDogYnl0ZXMsIG1pbmltdW1fZGVub21pbmF0aW9uOiBieXRlcywgZGF5X2NvdW50X2NvbnZlbnRpb246IGJ5dGVzLCBpbnRlcmVzdF9yYXRlOiBieXRlcywgY291cG9uX3JhdGVzOiBieXRlcywgdGltZV9ldmVudHM6IGJ5dGVzLCB0aW1lX3BlcmlvZHM6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzYtNDg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF9jb25maWcoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHByaW5jaXBhbDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgbWluaW11bV9kZW5vbWluYXRpb246IGFyYzQuVUludDY0LAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uOiBhcmM0LlVJbnQ4LAogICAgLy8gICAgIGludGVyZXN0X3JhdGU6IGFyYzQuVUludDE2LAogICAgLy8gICAgIGNvdXBvbl9yYXRlczogdHlwLkNvdXBvblJhdGVzLAogICAgLy8gICAgIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cywKICAgIC8vICAgICB0aW1lX3BlcmlvZHM6IHR5cC5UaW1lUGVyaW9kcywKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDkgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MTcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUxOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU1QVFksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTIwLTUyMQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9kZW5vbWluYXRpb25fYXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtOQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzcKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgZnJhbWVfZGlnIDMKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NS0xNzgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgLy8gKSwgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGZyYW1lX2RpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI0LTUyNQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHNldHRsZW1lbnRfYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC04CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODgKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODYtMTg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTkzCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOCAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTQtMjAwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTkKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTYKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTcKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk4CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTQtMTk1CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMyAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0yMDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzAKICAgIC8vIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgZnJhbWVfZGlnIC03CiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTYKICAgIGJ0b2kKICAgIGR1cDIKICAgICUKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyOC01MzEKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJpbmNpcGFsLm5hdGl2ZSAlIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZSA9PSAwCiAgICAvLyApLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIE1pbmltdW0gZGVub21pbmF0aW9uIGlzIG5vdCBhIGRpdmlzb3Igb2YgcHJpbmNpcGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgYnl0ZWNfMyAvLyAidW5pdF92YWx1ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gcHJpbmNpcGFsLm5hdGl2ZSAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIC8KICAgIGJ5dGVjIDQgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzNS01MzYKICAgIC8vICMgU2V0IERheS1Db3VudCBDb252ZW50aW9uCiAgICAvLyBzZWxmLmFzc2VydF9kYXlfY291bnRfY29udmVudGlvbihkYXlfY291bnRfY29udmVudGlvbi5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTUKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDYKICAgIC8vIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBibnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICBwdXNoaW50IDI1NSAvLyAyNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNwoKYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTIKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBkYXlfY291bnRfY29udmVudGlvbgogICAgYnl0ZWMgMTAgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzktNTQwCiAgICAvLyAjIFNldCBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLmFzc2VydF9pbnRlcmVzdF9yYXRlKGludGVyZXN0X3JhdGUubmF0aXZlKQogICAgZnJhbWVfZGlnIC00CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTYKICAgIC8vIGFzc2VydCBpbnRlcmVzdF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9JTlRFUkVTVF9SQVRFCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjAKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDIwIC8vICJpbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjgKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDUgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI5CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAyOCAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjggLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9wdXQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM1CiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGludGNfMyAvLyA0CiAgICArCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM0LTIzNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ5CiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjYwCiAgICAvLyBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlID0gdGltZV9ldmVudHMuY29weSgpCiAgICBieXRlYyAyMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDIxIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjYxLTI2MwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjYxCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTEgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MS0yNjMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0LTI2NgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjQKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxMiAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0LTI2NgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjcKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5JU1NVQU5DRV9EQVRFX0lEWF0ubmF0aXZlCiAgICBleHRyYWN0IDE2IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieXRlYyAxMyAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjktMjcwCiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzEKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gYXNzZXJ0IG5vdCB0aW1lX3BlcmlvZHMubGVuZ3RoLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU2CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUAxOAoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNS0xMTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTcKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzOC0yMzkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWxmLCB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDEKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDIKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MS0yNDIKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MC0yNDMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gICAgID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUUKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDQKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANgoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF93aGlsZV90b3BAODoKICAgIHB1c2hpbnQgNzUgLy8gNzUKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTQKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAyOSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDI5IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF93aGlsZV90b3BAOAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdGltZV9pID0gdGltZV9ldmVudHNbX3RdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTAKICAgIC8vIHRpbWVfZiA9IHRpbWVfZXZlbnRzW190ICsgMV0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUxCiAgICAvLyBhc3NlcnQgdGltZV9mID4gdGltZV9pLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTIKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gIT0gVUludDY0KGNzdC5EQ0NfQ09OVCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAhPQogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1My0yNTQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1My0yNTYKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICAvLyAgICAgY3N0LkRBWV8yX1NFQwogICAgLy8gKSA9PSAwLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRAogICAgcHVzaGludCA4NjQwMCAvLyA4NjQwMAogICAgJQogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBpbiBBY3R1YWwvQWN0dWFsIGRheSBjb3VudCBjb252ZW50aW9uIG11c3QgYmUgbXVsdGlwbGVzIG9mIGEgZGF5IChpbiBzZWNvbmRzKQogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANjoKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1OC01NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMoCiAgICAvLyAgICAgc2VsZiwgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMKICAgIC8vICkgLT4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTc5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNCAvLyAyMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgzCiAgICAvLyBhc3NlcnQgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPj0gMSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NAogICAgLy8gaWYgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPiAxOgogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NQogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0xCiAgICBmcmFtZV9idXJ5IDEKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NwogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4OC01OTAKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4Ny01OTAKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODYtNTkxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTItNTk0CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NQogICAgLy8gaWYgc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OQogICAgLy8gY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OC02MDAKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5Ny02MDAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYtNjAxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDItNjA0CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA3CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA2LTYwOAogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOS02MTEKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDUtNjEyCiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2RlZmF1bHRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNy0xMDgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NpZ25fcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcywgY29uZmlnOiBieXRlcykgLT4gYnl0ZXM6CmFzc2lnbl9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE0LTYxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzaWduX3JvbGUoCiAgICAvLyAgICAgc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgsIGNvbmZpZzogYXJjNC5EeW5hbWljQnl0ZXMKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM2CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNwogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzgKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDMKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IGFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANwoKYXNzaWduX3JvbGVfYm9vbF90cnVlQDY6CiAgICBpbnRjXzEgLy8gMQoKYXNzaWduX3JvbGVfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDYKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwIC8vIDIwLCA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NS02NzQKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcy5uYXRpdmUKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgKAogICAgLy8gICAgICAgICAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgICAgICBjb25maWcubmF0aXZlCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgKAogICAgLy8gICAgICAgICAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgICAgICBjb25maWcubmF0aXZlCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5IGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTAgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8zQDEyIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzRAMTMgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc0CiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV81QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4CiAgICAvLyByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICBieXRlYyAzMCAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2Ny02NjkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjcxCiAgICAvLyBjb25maWcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzAtNjcyCiAgICAvLyBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICBzd2FwCiAgICByZXRzdWIKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzRAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2NQogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2MQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzNjMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2MgogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjQgLy8gMHg1MjM1MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU4CiAgICAvLyBjb25maWcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTctNjU5CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MAogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgYnl0ZWMgMjUgLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDktNjUxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MwogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUyLTY1NAogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8wQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDcKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICBieXRlYyA4IC8vIDB4NTIzMjMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzaWduX3JvbGVfYm9vbF9tZXJnZUA4CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EucmV2b2tlX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMpIC0+IGJ5dGVzOgpyZXZva2Vfcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3Ny02NzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHJldm9rZV9yb2xlKHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4KSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTYKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk3CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5OAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5OQogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMQogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMgogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IHJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANgoKcmV2b2tlX3JvbGVfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk3LTcwMwogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA1LTcwNgogICAgLy8gIyBBcnJhbmdlciByb2xlIGNhbiBub3QgYmUgcmV2b2tlZCAoanVzdCByb3RhdGVkKQogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwIC8vIDQwLCA1MCwgNjAsIDcwLCA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA0LTcyMgogICAgLy8gbWF0Y2ggcm9sZS5uYXRpdmU6CiAgICAvLyAgICAgIyBBcnJhbmdlciByb2xlIGNhbiBub3QgYmUgcmV2b2tlZCAoanVzdCByb3RhdGVkKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQVVUSE9SSVRZICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfSU5URVJFU1RfT1JBQ0xFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKCkKICAgIGZyYW1lX2RpZyAwCiAgICBtYXRjaCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMUA5IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzJAMTAgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzAgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIwCiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfSU5URVJFU1RfT1JBQ0xFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICBzd2FwCiAgICByZXRzdWIKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjIgLy8gMHg1MjM3MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE3CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQVVUSE9SSVRZICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzJAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIzIC8vIDB4NTIzNjMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjQgLy8gMHg1MjM1MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzExCiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYiByZXZva2Vfcm9sZV9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5vcGVuX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6Cm9wZW5fYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNS03MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wZW5fYWNjb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNCAvLyAyMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDcKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ4CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDcgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUxLTc1NwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MwogICAgLy8gdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDI2IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUxLTc1NwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NAogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgMjYgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU1CiAgICAvLyBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDI2IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUxLTc1NwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NgogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgYnl0ZWMgMjcgLy8gMHgwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUxLTc1NwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOS0xMjAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICBieXRlYyAyNSAvLyAweDUyMzQzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMy0xMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9tYW5hZ2VyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQtMTI1CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9tYW5hZ2VyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjUtMTI2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMi0xMjcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTEtMTEyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5jbG9zZV9hY2NvdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpjbG9zZV9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwLTc2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xvc2VfYWNjb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlR1cGxlW2FyYzQuVUludDY0LCBhcmM0LlVJbnQ2NF06CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3OAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MgogICAgLy8gY2xvc2VkX3VuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzgzCiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVCArIGhvbGRpbmdfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg0CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IGNsb3NlZF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgc3dhcAogICAgLQogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU5CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IDA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBibnogY2xvc2VfYWNjb3VudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM2MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGludGMgNCAvLyAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbG9zZV9hY2NvdW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4NwogICAgLy8gKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODYtNzg4CiAgICAvLyByZXR1cm4gYXJjNC5UdXBsZSgKICAgIC8vICAgICAoYXJjNC5VSW50NjQoY2xvc2VkX3VuaXRzKSwgYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApKQogICAgLy8gKQogICAgY29uY2F0CiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5wcmltYXJ5X2Rpc3RyaWJ1dGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5MC03OTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHByaW1hcnlfZGlzdHJpYnV0aW9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg0LTI4NwogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1LTI4NwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODcKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4Ni0yODcKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBmcmFtZV9kaWcgMgogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1LTI4NwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgzLTI4OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgYnl0ZWMgMjQgLy8gMHg1MjM1MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzLTEzNgogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2RlYWxlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0LTEzNQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0LTEzNgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUtMTM2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMyLTEzNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gICAgIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgNyAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MTgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODE5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyMAogICAgLy8gYXNzZXJ0IHVuaXRzLm5hdGl2ZSA+IDAsIGVyci5aRVJPX1VOSVRTCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjIKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjEtODIzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI1CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICs9IHVuaXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNi04MjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNi04MjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IGFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDQwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5jaXJjdWxhdGluZ191bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIC0KICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyOgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMwoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2Fzc2V0X3N1c3BlbnNpb24oc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMyLTgzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2Fzc2V0X3N1c3BlbnNpb24oc2VsZiwgc3VzcGVuZGVkOiBhcmM0LkJvb2wpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ3CiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NChzdXNwZW5kZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAxNiAvLyAic3VzcGVuZGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0OAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OS0xNTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICBieXRlYyAyMiAvLyAweDUyMzczMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1My0xNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0LTE1NgogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTUtMTU2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0LTE1NgogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Mi0xNTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyAgICAgYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9hY2NvdW50X3N1c3BlbnNpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hY2NvdW50X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTAtODUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODY4CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgNyAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzAKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBwdXNoaW50IDQ0OCAvLyA0NDgKICAgIHN3YXAKICAgIHNldGJpdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfZGVmYXVsdF9zdGF0dXMoZGVmYXVsdGVkOiBieXRlcykgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODczLTg3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2RlZmF1bHRfc3RhdHVzKHNlbGYsIGRlZmF1bHRlZDogYXJjNC5Cb29sKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBieXRlYyAyMyAvLyAweDUyMzYzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDMtMTQ2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1LTE0NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Mi0xNDcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gICAgIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODUKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KGRlZmF1bHRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDE3IC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9pbmZvKCkgLT4gYnl0ZXM6CmdldF9hc3NldF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg3LTg4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2luZm8oc2VsZikgLT4gdHlwLkFzc2V0SW5mbzoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk4CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTkKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDAKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDEKICAgIC8vIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMgogICAgLy8gaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAzCiAgICAvLyB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDQKICAgIC8vIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNS05MDcKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOC05MTAKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMQogICAgLy8gaXNzdWFuY2VfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLmlzc3VhbmNlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTIKICAgIC8vIG1hdHVyaXR5X2RhdGU9YXJjNC5VSW50NjQoc2VsZi5tYXR1cml0eV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTMKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgYnl0ZWMgMjcgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTQKICAgIC8vIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgYnl0ZWMgMjcgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTctOTE1CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgLy8gKQogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBwdXNoaW50IDYwMSAvLyA2MDEKICAgIHN3YXAKICAgIHNldGJpdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNy05MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNC05MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQyCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIHB1c2hieXRlcyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0MwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDQKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDIxIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ1CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0Ny05NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTAKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1MQogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ5LTk1MgogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQtOTU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NgogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X3VwZGF0ZSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2Ni00NjcKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgYXNzZXRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MS00NzQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCA0IDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjaXJjdWxhdGluZ191bml0cyIgInN0YXR1cyIgInVuaXRfdmFsdWUiICJ0b3RhbF91bml0cyIgInRvdGFsX2NvdXBvbnMiICJtYXR1cml0eV9kYXRlIiAweDUyMzMzMDIzIDB4NTIzMjMwMjMgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgInNldHRsZW1lbnRfYXNzZXRfaWQiICJkYXlfY291bnRfY29udmVudGlvbiIgInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIgInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIgImlzc3VhbmNlX2RhdGUiICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIiAic3VzcGVuZGVkIiAiZGVmYXVsdGVkIiAibWV0YWRhdGEiICJpbnRlcmVzdF9yYXRlIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAgMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczIDB4MDY4MTAxIDB4NTIzODMwMjMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyAjIFJvbGUgQmFzZWQgQWNjZXNzIENvbnRyb2wKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OS02MAogICAgLy8gIyBBc3NldCBDb25maWd1cmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMTAgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWNfMyAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NS02NgogICAgLy8gIyBNZXRhZGF0YQogICAgLy8gc2VsZi5tZXRhZGF0YSA9IEJ5dGVzKCkKICAgIGJ5dGVjIDE5IC8vICJtZXRhZGF0YSIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4LTY5CiAgICAvLyAjIFN1cHBseQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gImludGVyZXN0X3JhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMyAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NAogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OS05MAogICAgLy8gIyBTdGF0dXMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU1QVFkpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAic3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MgogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMTggLy8gImRlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyMQogICAgcHVzaGJ5dGVzcyAweDYzZjk5NTg5IDB4ZDNhNGQ2YWIgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHg4MGJmY2RkMSAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGRkY2VjMDdiIC8vIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNltdLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhc3NpZ25fcm9sZShhZGRyZXNzLHVpbnQ4LGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInJldm9rZV9yb2xlKGFkZHJlc3MsdWludDgpdWludDY0IiwgbWV0aG9kICJvcGVuX2FjY291bnQoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiY2xvc2VfYWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicHJpbWFyeV9kaXN0cmlidXRpb24oYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJzZXRfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2FjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfaW5mbygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sKSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9ldmVudHMoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpdWludDY0W10iLCBtZXRob2QgImdldF9hc3NldF9tZXRhZGF0YSgpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF9jcmVhdGVfcm91dGVANSBtYWluX2Fzc2V0X2NvbmZpZ19yb3V0ZUA2IG1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUA3IG1haW5fYXNzaWduX3JvbGVfcm91dGVAOCBtYWluX3Jldm9rZV9yb2xlX3JvdXRlQDkgbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTAgbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDExIG1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMTIgbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAxMyBtYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMTQgbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMTUgbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAxNiBtYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMTcgbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMTggbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAxOSBtYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyMAoKbWFpbl9hZnRlcl9pZl9lbHNlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21ldGFkYXRhCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF9pbmZvX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYWNjb3VudF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfaW5mbwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9kZWZhdWx0X3N0YXR1cwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYXNzZXRfc3VzcGVuc2lvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcHJpbWFyeV9kaXN0cmlidXRpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBjbGFzcyBCYXNlREFzYShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY2xvc2VfYWNjb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG9wZW5fYWNjb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiByZXZva2Vfcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NpZ25fcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOAogICAgLy8gY2xhc3MgQmFzZURBc2EoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2V0X2NvbmZpZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jcmVhdGVfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgY2FsbHN1YiBhc3NldF9jcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgKICAgIC8vIGNsYXNzIEJhc2VEQXNhKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzMgLy8gNAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgbWF0Y2ggbWFpbl9hc3NldF91cGRhdGVAMjIKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDIzCgptYWluX2Fzc2V0X3VwZGF0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY0LTQ2NQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiBhc3NldF91cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIGNhbGxzdWIgYXNzZXRfdXBkYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfY3JlYXRlKGFycmFuZ2VyOiBieXRlcywgbWV0YWRhdGE6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jcmVhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTItNDUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBhc3NldF9jcmVhdGUoc2VsZiwgYXJyYW5nZXI6IGFyYzQuQWRkcmVzcywgbWV0YWRhdGE6IHR5cC5Bc3NldE1ldGFkYXRhKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjEKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlci5uYXRpdmUKICAgIGJ5dGVjIDggLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYyCiAgICAvLyBzZWxmLm1ldGFkYXRhID0gbWV0YWRhdGEubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlYyAxOSAvLyAibWV0YWRhdGEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfY29uZmlnKGRlbm9taW5hdGlvbl9hc3NldF9pZDogYnl0ZXMsIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGJ5dGVzLCBwcmluY2lwYWw6IGJ5dGVzLCBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYnl0ZXMsIGRheV9jb3VudF9jb252ZW50aW9uOiBieXRlcywgaW50ZXJlc3RfcmF0ZTogYnl0ZXMsIGNvdXBvbl9yYXRlczogYnl0ZXMsIHRpbWVfZXZlbnRzOiBieXRlcywgdGltZV9wZXJpb2RzOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDc0LTQ4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzZXRfY29uZmlnKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwcmluY2lwYWw6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG1pbmltdW1fZGVub21pbmF0aW9uOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbjogYXJjNC5VSW50OCwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlOiBhcmM0LlVJbnQxNiwKICAgIC8vICAgICBjb3Vwb25fcmF0ZXM6IHR5cC5Db3Vwb25SYXRlcywKICAgIC8vICAgICB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMsCiAgICAvLyAgICAgdGltZV9wZXJpb2RzOiB0eXAuVGltZVBlcmlvZHMsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA5IDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTE1CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MTYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VNUFRZLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUxOC01MTkKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5hc3NlcnRfZGVub21pbmF0aW9uX2Fzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTkKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc3CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGZyYW1lX2RpZyAzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzUtMTc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIC8vICksIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODIKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBmcmFtZV9kaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyMi01MjMKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5hc3NlcnRfc2V0dGxlbWVudF9hc3NldChzZXR0bGVtZW50X2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtOAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTg4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIGRpZyAxCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTg2LTE4OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHNldHRsZW1lbnQgYXNzZXQgaXMgdGhlIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRVRUTEVNRU5UX0FTU0VUCiAgICBhc3NlcnQgLy8gRGlmZmVyZW50IHNldHRsZW1lbnQgYXNzZXQgbm90IHN1cHBvcnRlZCwgbXVzdCBiZSBlcXVhbCB0byBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gc2V0dGxlbWVudF9hc3NldF9pZAogICAgYnl0ZWMgMTAgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk0LTIwMAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk5CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk3CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk0LTE5NQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTQtMjAwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI4CiAgICAvLyBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIGZyYW1lX2RpZyAtNwogICAgYnRvaQogICAgZnJhbWVfZGlnIC02CiAgICBidG9pCiAgICBkdXAyCiAgICAlCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjYtNTI5CiAgICAvLyAjIFNldCBQcmluY2lwYWwgYW5kIE1pbmltdW0gRGVub21pbmF0aW9uCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgLy8gKSwgZXJyLklOVkFMSURfTUlOSU1VTV9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBNaW5pbXVtIGRlbm9taW5hdGlvbiBpcyBub3QgYSBkaXZpc29yIG9mIHByaW5jaXBhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMwCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIGJ5dGVjXzMgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbC5uYXRpdmUgLy8gbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlCiAgICAvCiAgICBieXRlYyA0IC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzMtNTM0CiAgICAvLyAjIFNldCBEYXktQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5hc3NlcnRfZGF5X2NvdW50X2NvbnZlbnRpb24oZGF5X2NvdW50X2NvbnZlbnRpb24ubmF0aXZlKQogICAgZnJhbWVfZGlnIC01CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA2CiAgICAvLyBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDQtMjA4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYm56IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDcKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDQtMjA4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDQtMjA4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjEyCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGZyYW1lX2RpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTM3LTUzOAogICAgLy8gIyBTZXQgSW50ZXJlc3QgUmF0ZQogICAgLy8gc2VsZi5hc3NlcnRfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjE2CiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfSU5URVJFU1RfUkFURQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW50ZXJlc3QgcmF0ZSBpcyBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjIwCiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlCiAgICBieXRlYyAyMCAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjQKICAgIC8vIGFzc2VydCBub3QgY291cG9uX3JhdGVzLmxlbmd0aCwgZXJyLklOVkFMSURfQ09VUE9OX1JBVEVTCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICAhCiAgICBhc3NlcnQgLy8gQ291cG9uIHJhdGVzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI4CiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBjb3Vwb25fcmF0ZXMubGVuZ3RoCiAgICBieXRlYyA1IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gaWYgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzAKICAgIC8vIHNlbGYuY291cG9uX3JhdGVzLnZhbHVlID0gY291cG9uX3JhdGVzLmNvcHkoKQogICAgYnl0ZWMgMjggLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDI4IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgZnJhbWVfZGlnIC0zCiAgICBib3hfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNC0yMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUwogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0NwogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gc2VsZi50aW1lX2V2ZW50cy52YWx1ZSA9IHRpbWVfZXZlbnRzLmNvcHkoKQogICAgYnl0ZWMgMjEgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAyMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MS0yNjMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDEyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEtMjYzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTMgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY3CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuSVNTVUFOQ0VfREFURV9JRFhdLm5hdGl2ZQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgMTQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5LTI3MAogICAgLy8gIyBTb21lIEQtQVNBIG1heSBub3QgaGF2ZSBhIG1hdHVyaXR5IGRhdGUgKGUuZy4sIHBlcnBldHVhbHMpCiAgICAvLyBpZiB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgaW50Y18zIC8vIDQKICAgICsKICAgID09CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjcxCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzUKICAgIC8vIGFzc2VydCBub3QgdGltZV9wZXJpb2RzLmxlbmd0aCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1NAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBwdXNoaW50IDEwMCAvLyAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTUtMTE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzgtMjM5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2VsZiwgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzKSAtPiBOb25lOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQxCiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQyCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDEtMjQyCiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDAtMjQzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vICAgICA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ0CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDQKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDYKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDg6CiAgICBwdXNoaW50IDc1IC8vIDc1CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDE0CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMjkgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAyOSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDgKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW190XS5uYXRpdmUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUwCiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tfdCArIDFdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUyCiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIHB1c2hpbnQgMjU1IC8vIDI1NQogICAgIT0KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTMtMjU0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTMtMjU2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgLy8gICAgIGNzdC5EQVlfMl9TRUMKICAgIC8vICkgPT0gMCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0QKICAgIHB1c2hpbnQgODY0MDAgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTYtNTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU3NwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTc4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTc5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4MQogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODIKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODMKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODUKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODYtNTg4CiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODUtNTg4CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTg0LTU4OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9PUEVOSU5HX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgb3BlbmluZyBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTAKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkwLTU5MgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTMKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk1CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTcKICAgIC8vIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYtNTk4CiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTUtNTk4CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk0LTU5OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vICAgICA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9DTE9TVVJFX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgY2xvc3VyZSBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDAKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAwLTYwMgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNC02MDYKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDgKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDctNjA5CiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAzLTYxMAogICAgLy8gcmV0dXJuIHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZSgKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDctMTA4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMi02MTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM2CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNwogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM4CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzOQogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0MAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ0CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDMtNjcyCiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3MgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2NgogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzAgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjUtNjY3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY4LTY3MAogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3MwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYyCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMiAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjMKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjAKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU1LTY1NwogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDgKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI1IC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ3LTY0OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTEKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MC02NTIKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ1CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnJldm9rZV9yb2xlKHJvbGVfYWRkcmVzczogYnl0ZXMsIHJvbGU6IGJ5dGVzKSAtPiBieXRlczoKcmV2b2tlX3JvbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzUtNjc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiByZXZva2Vfcm9sZShzZWxmLCByb2xlX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcm9sZTogYXJjNC5VSW50OCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5MwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTYKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MCAvLyA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTcKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUtNzAxCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5OAogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTkKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MCAvLyA3MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiByZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDYKCnJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCnJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NS03MDEKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMy03MDQKICAgIC8vICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MCAvLyA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMi03MjAKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTEgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIwCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMwIC8vIDB4NTIzODMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDIyIC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzExCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyMyAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTIKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI0IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNSAvLyAweDUyMzQzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDYKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Eub3Blbl9hY2NvdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpvcGVuX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjMtNzI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcGVuX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDQgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ1CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDcKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlYyA3IC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEKICAgIC8vIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICBieXRlYyAyNiAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTIKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDI2IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MwogICAgLy8gcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICBieXRlYyAyNiAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTQKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIGJ5dGVjIDI3IC8vIDB4MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTYKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTktMTIwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgYnl0ZWMgMjUgLy8gMHg1MjM0MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjMtMTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfbWFuYWdlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNQogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNC0xMjYKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfbWFuYWdlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEyNgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNC0xMjYKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgphc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjItMTI3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gICAgIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgphc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTExLTExMgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAic3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuY2xvc2VfYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKY2xvc2VfYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OC03NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5UdXBsZVthcmM0LlVJbnQ2NCwgYXJjNC5VSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzYKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzc3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWMgNyAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODAKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlQgKyBob2xkaW5nX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MgogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBjbG9zZWRfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1NwogICAgLy8gaWYgc2VsZi5jaXJjdWxhdGluZ191bml0cyA9PSAwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgYm56IGNsb3NlX2FjY291bnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNTgKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjIDQgLy8gMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xvc2VfYWNjb3VudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODUKICAgIC8vIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg0LTc4NgogICAgLy8gcmV0dXJuIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIC8vICkKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EucHJpbWFyeV9kaXN0cmlidXRpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODgtNzkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NC0yODcKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1LTI4NgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NS0yODcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg3CiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODYtMjg3CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgZnJhbWVfZGlnIDIKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NS0yODcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4My0yODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIGJ5dGVjIDI0IC8vIDB4NTIzNTMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzMKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMy0xMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNC0xMzUKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNC0xMzYKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM2CiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2RlYWxlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM1LTEzNgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0LTEzNgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMi0xMzcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDcgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODE2CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgxNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MTgKICAgIC8vIGFzc2VydCB1bml0cy5uYXRpdmUgPiAwLCBlcnIuWkVST19VTklUUwogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMubmF0aXZlIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODE5LTgyMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMubmF0aXZlIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyMwogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArPSB1bml0cy5uYXRpdmUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjQtODI2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjQtODI2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBhcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBzd2FwCiAgICByZXBsYWNlMiA0MAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI4CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyAtIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICAtCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMjoKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTMKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9hc3NldF9zdXNwZW5zaW9uKHN1c3BlbmRlZDogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfYXNzZXRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMC04MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hc3NldF9zdXNwZW5zaW9uKHNlbGYsIHN1c3BlbmRlZDogYXJjNC5Cb29sKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ0CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0NQogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoc3VzcGVuZGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMTcgLy8gInN1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDYKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDktMTUwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgYnl0ZWMgMjIgLy8gMHg1MjM3MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTMtMTU2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmF1dGhvcml0eSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0LTE1NQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NC0xNTYKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmF1dGhvcml0eSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU1LTE1NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NC0xNTYKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTItMTU3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgLy8gICAgIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYWNjb3VudF9zdXNwZW5zaW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHN1c3BlbmRlZDogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfYWNjb3VudF9zdXNwZW5zaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4LTg1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2FjY291bnRfc3VzcGVuc2lvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgc3VzcGVuZGVkOiBhcmM0LkJvb2wKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2NgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDcgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgcHVzaGludCA0NDggLy8gNDQ4CiAgICBzd2FwCiAgICBzZXRiaXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2RlZmF1bHRfc3RhdHVzKGRlZmF1bHRlZDogYnl0ZXMpIC0+IHZvaWQ6CnNldF9kZWZhdWx0X3N0YXR1czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MS04NzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9kZWZhdWx0X3N0YXR1cyhzZWxmLCBkZWZhdWx0ZWQ6IGFyYzQuQm9vbCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgYnl0ZWMgMjMgLy8gMHg1MjM2MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzLTE0NgogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NgogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ2CiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NS0xNDYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NgogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDItMTQ3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vICAgICBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgzCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IFVJbnQ2NChkZWZhdWx0ZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAxOCAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfaW5mbygpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NS04ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9pbmZvKHNlbGYpIC0+IHR5cC5Bc3NldEluZm86CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NgogICAgLy8gZGVub21pbmF0aW9uX2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk3CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5OAogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgICoKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5OQogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMAogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAxCiAgICAvLyBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDIKICAgIC8vIHRvdGFsX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX3VuaXRzKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMwogICAgLy8gY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA1CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA0LTkwNgogICAgLy8gcHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA4CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA3LTkwOQogICAgLy8gcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEwCiAgICAvLyBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMQogICAgLy8gbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMgogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICBieXRlYyAyNyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMwogICAgLy8gZGVmYXVsdGVkPWFyYzQuQm9vbChib29sKHNlbGYuZGVmYXVsdGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICBieXRlYyAyNyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NS05MTQKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgLy8gKQogICAgdW5jb3ZlciAxMwogICAgdW5jb3ZlciAxMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgNjY1IC8vIDY2NQogICAgc3dhcAogICAgc2V0Yml0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYWNjb3VudF9pbmZvKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYWNjb3VudF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE2LTkxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FjY291bnRfaW5mbyhzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLkFjY291bnRJbmZvOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjIDcgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMxCiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfdGltZV9ldmVudHMoKSAtPiBieXRlczoKZ2V0X3RpbWVfZXZlbnRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMzLTkzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3RpbWVfZXZlbnRzKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDEKICAgIC8vIHRpbWVfZXZlbnRzID0gdHlwLlRpbWVFdmVudHMoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQyCiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0MwogICAgLy8gdGltZV9ldmVudHMgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMjEgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKCmdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDQKICAgIC8vIHJldHVybiB0aW1lX2V2ZW50cwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKCkgLT4gYnl0ZXM6CmdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ2LTk0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoc2VsZikgLT4gdHlwLlRpbWVFdmVudHM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NQogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU2CiAgICAvLyBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQtOTU3CiAgICAvLyByZXR1cm4gdHlwLlRpbWVFdmVudHMoCiAgICAvLyAgICAgYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICAvLyApCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2Fzc2V0X21ldGFkYXRhKCkgLT4gYnl0ZXM6CmdldF9hc3NldF9tZXRhZGF0YToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1OS05NjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9tZXRhZGF0YShzZWxmKSAtPiB0eXAuQXNzZXRNZXRhZGF0YToKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY3CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0TWV0YWRhdGEoc2VsZi5tZXRhZGF0YSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAibWV0YWRhdGEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGEgZXhpc3RzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKCkgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY0LTQ2NQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiBhc3NldF91cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY5LTQ3MgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMgT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSBkaXNhYmxlIEQtQVNBIGFwcGxpY2F0aW9uIHVwZGF0YWJpbGl0eSBvciBjaGFuZ2UgaXRzIGF1dGhvcml6YXRpb25zLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5IG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { @@ -555,8 +559,8 @@ "name": "get_asset_info", "args": [], "returns": { - "type": "(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", - "desc": "Denomination Asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary Distribution Opening Date, Primary Distribution Closure Date, Issuance Date, Maturity Date, Suspended, Defaulted" + "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", + "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Defaulted" }, "desc": "Get D-ASA info" }, @@ -571,7 +575,7 @@ ], "returns": { "type": "(address,uint64,uint64,uint64,bool)", - "desc": "Payment Address, D-ASA units, Unit value, Paid coupons, Suspended" + "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" }, "desc": "Get account info" }, @@ -588,15 +592,19 @@ "name": "get_secondary_market_schedule", "args": [], "returns": { - "type": "uint64[]" - } + "type": "uint64[]", + "desc": "Secondary market schedule" + }, + "desc": "Get secondary market schedule" }, { "name": "get_asset_metadata", "args": [], "returns": { - "type": "byte[]" - } + "type": "byte[]", + "desc": "Asset metadata" + }, + "desc": "Get D-ASA metadata" } ], "networks": {}, @@ -841,6 +849,7 @@ def method() -> str: @dataclasses.dataclass(kw_only=True) class AssetInfo: denomination_asset_id: int + settlement_asset_id: int outstanding_principal: int unit_value: int day_count_convention: int @@ -861,7 +870,7 @@ class GetAssetInfoArgs(_ArgsBase[AssetInfo]): @staticmethod def method() -> str: - return "get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)" + return "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)" @dataclasses.dataclass(kw_only=True) @@ -896,6 +905,8 @@ def method() -> str: @dataclasses.dataclass(kw_only=True) class GetSecondaryMarketScheduleArgs(_ArgsBase[list[int]]): + """Get secondary market schedule""" + @staticmethod def method() -> str: return "get_secondary_market_schedule()uint64[]" @@ -903,6 +914,8 @@ def method() -> str: @dataclasses.dataclass(kw_only=True) class GetAssetMetadataArgs(_ArgsBase[bytes | bytearray]): + """Get D-ASA metadata""" + @staticmethod def method() -> str: return "get_asset_metadata()byte[]" @@ -1296,7 +1309,7 @@ def get_asset_info( ) -> "Composer": """Get D-ASA info - Adds a call to `get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)` ABI method + Adds a call to `get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters :returns Composer: This Composer instance""" @@ -1361,7 +1374,9 @@ def get_secondary_market_schedule( *, transaction_parameters: algokit_utils.TransactionParameters | None = None, ) -> "Composer": - """Adds a call to `get_secondary_market_schedule()uint64[]` ABI method + """Get secondary market schedule + + Adds a call to `get_secondary_market_schedule()uint64[]` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters :returns Composer: This Composer instance""" @@ -1380,7 +1395,9 @@ def get_asset_metadata( *, transaction_parameters: algokit_utils.TransactionParameters | None = None, ) -> "Composer": - """Adds a call to `get_asset_metadata()byte[]` ABI method + """Get D-ASA metadata + + Adds a call to `get_asset_metadata()byte[]` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters :returns Composer: This Composer instance""" @@ -1890,10 +1907,10 @@ def get_asset_info( ) -> algokit_utils.ABITransactionResponse[AssetInfo]: """Get D-ASA info - Calls `get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)` ABI method + Calls `get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[AssetInfo]: Denomination Asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary Distribution Opening Date, Primary Distribution Closure Date, Issuance Date, Maturity Date, Suspended, Defaulted""" + :returns algokit_utils.ABITransactionResponse[AssetInfo]: Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Defaulted""" args = GetAssetInfoArgs() result = self.app_client.call( @@ -1918,7 +1935,7 @@ def get_account_info( :param str holding_address: Account Holding Address :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[AccountInfo]: Payment Address, D-ASA units, Unit value, Paid coupons, Suspended""" + :returns algokit_utils.ABITransactionResponse[AccountInfo]: Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended""" args = GetAccountInfoArgs( holding_address=holding_address, @@ -1958,10 +1975,12 @@ def get_secondary_market_schedule( *, transaction_parameters: algokit_utils.TransactionParameters | None = None, ) -> algokit_utils.ABITransactionResponse[list[int]]: - """Calls `get_secondary_market_schedule()uint64[]` ABI method + """Get secondary market schedule + + Calls `get_secondary_market_schedule()uint64[]` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[list[int]]: The result of the transaction""" + :returns algokit_utils.ABITransactionResponse[list[int]]: Secondary market schedule""" args = GetSecondaryMarketScheduleArgs() result = self.app_client.call( @@ -1976,10 +1995,12 @@ def get_asset_metadata( *, transaction_parameters: algokit_utils.TransactionParameters | None = None, ) -> algokit_utils.ABITransactionResponse[bytes | bytearray]: - """Calls `get_asset_metadata()byte[]` ABI method + """Get D-ASA metadata + + Calls `get_asset_metadata()byte[]` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[bytes | bytearray]: The result of the transaction""" + :returns algokit_utils.ABITransactionResponse[bytes | bytearray]: Asset metadata""" args = GetAssetMetadataArgs() result = self.app_client.call( diff --git a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.puya.map b/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.puya.map index d2d3263..329acb7 100644 --- a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.puya.map +++ b/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.puya.map @@ -4,7 +4,7 @@ "../../base_d_asa/contract.py", "../../fixed_coupon_bond/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCmD;;AAAf;;AAA5B;AAkBA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AACA;;AAAkB;AAAlB;AACA;;AAA4B;AAA5B;AAGA;;AAAgB;;AAAhB;AAGA;;AAAmB;AAAnB;AACA;AAAyB;AAAzB;AAGA;;AAAqB;AAArB;AAIA;;AAAqB;AAArB;AAKA;;AAAyC;AAAzC;AACA;;AAAyC;AAAzC;AACA;;AAAqB;AAArB;AACA;;AAAqC;AAArC;AACA;;AAAqC;AAArC;AACA;;AAAqB;AAArB;AAGA;AAAc;AAAd;AACA;;AAAiB;AAAjB;AACA;;AAAiB;AAAjB;ACvDO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAGA;;AAA6B;AAA7B;AACA;;AAAyB;AAAzB;AAxBR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;ADs6BK;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAPA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjBA;;AAAA;AAAA;AAAA;;AAAA;ACj4BL;;;ADi4BK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9BA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAdA;;AAAA;AAAA;AAAA;;AAAA;ACr1BL;;;ADq1BK;;;AAAA;;AAvBA;;AAAA;AAAA;AAAA;;AAAA;AC9zBL;;;AAAA;;;AD8zBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlBA;;AAAA;AAAA;AAAA;;AAAA;AC5yBL;;;AD4yBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA1CA;;AAAA;AAAA;AAAA;;AAAA;AClwBL;;;AAAA;;;ADkwBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9BA;;AAAA;AAAA;AAAA;;AAAA;ACpuBL;;;ADouBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAnCA;;AAAA;AAAA;AAAA;;AAAA;ACjsBL;;;AAAA;;;ADisBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhDA;;AAAA;AAAA;AAAA;;AAAA;ACjpBL;;;AAAA;;;ADipBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/DA;;AAAA;AAAA;AAAA;;AAAA;ACllBL;;;AAAA;;;AAAA;;;ADklBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAxDA;;AAAA;AAAA;AAAA;;AAAA;AC1hBL;;;AD0hBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlFA;;AAAA;AAAA;AAAA;;AAAA;ACxcL;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;ADwcK;;;AAAA;;AAtBA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AClbL;;;AAAA;;;ADkbK;;;AAAA;;ACvCA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjCA;;AAAA;AAAA;AAAA;;AAAA;AA1WL;;;AA0WK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAzDA;;AAAA;AAAA;AAAA;;AAAA;AApSL;;;AAAA;;;AAoSK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhDA;;AAAA;AAAA;AAAA;;AAAA;AApPL;;;AAAA;;;AAoPK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9DA;;AAAA;AAAA;AAAA;;AAAA;AAtLL;;;AAAA;;;AAsLK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjDA;;AAAA;AAAA;AAAA;;AAAA;AArIL;;;AAAA;;;AAAA;;;AAqIK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AArIL;;AAAA;;AAAA;;;;AAAA;;;AD8bK;;AAAA;AAAL;;;AAAA;;ACzTA;;;;;;;;;AA+BY;;AAAA;ADnFG;AAAA;AAAA;AAAA;AAAe;AAAf;AAgMH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AA+EO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AA1M0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AA6MW;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;AAAP;AACW;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;AAAP;AAIa;;AAAA;AAAA;AAAA;;;AAAA;AAAT;;AAAA;AADJ;AAUoB;AAAA;AAAA;AAAA;;;AAApB;;AACG;AAAA;AAAA;;;AAAA;AAAX;;;AAvFY;;AAAA;AAAA;AAAA;;;AAAmC;;AAAA;AAAA;AAAA;;;AAAnC;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AAAqC;;AAAA;AAAA;AAAA;;;AAArC;AADJ;;;;AADJ;ACnHc;;;AACd;;AAAA;;AAAA;;;AAGoB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAApB;;AACA;;AAAA;;AAAA;AAAA;;AAAA;;AAAmB;;;AAAnB;;AD0OI;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AADyC;AAA7C;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAII;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAD2C;AAA/C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AA5EG;AAAA;AAAA;;;AAAA;AAAX;;;AACY;;AAAA;AAAA;AAAA;AAA2C;;AAA3C;;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAA6C;;AAA7C;;AAAA;AC3J8B;;AAAA;AAAf;;AAAA;AAAA;;AAAA;AAAZ;AAAP;;AAAA;;;;;ADoMI;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AACsD;;AAAA;AAAA;AAAtD;;AAAA;AAAA;AAAA;AAAsD;;;AAAtD;;AAAA;;;;;;;;AAlSZ;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAER;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AC/DR;;;;;AAEqB;;AAAb;AACc;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACG;AAAA;;AAAA;AAAA;AAAd;AAAX;;;AAC0B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAYlB;;AAAA;;AAAA;AAAA;;AAAA;AACA;;AAAA;AAZkB;AAAA;;AAAA;AAAA;AAAb;;AAAA;AAAb;;;AAC6D;AAAA;;AAAA;AAAA;AAApC;;AAAA;AAAb;AAAA;;AACkB;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACZ;;AAAA;AAAlB;;;AAEoC;;AACL;AAFf;;;AAIA;;AAAc;AAAd;AAAA;AAAA;;AACkB;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AACtB;;AAA2B;;AAAb;AAAd;;;;;AA0BZ;;;AAKY;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AADJ;;AAoCR;;;AAKQ;;AAAA;;AAAA;;;AACA;;AAAmB;;;AACK;AAAA;;;AAAA;AACR;AAAA;;;AAAA;AACO;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAInB;;AAAA;;AAAA;;;AAAA;AAAA;;AAAA;AAII;;;AAAA;;AAAA;AAJJ;AADJ;AArCR;;;;;;;AAGA;;AAAA;;;AACkC;AAAA;;AAAA;AAAA;AAGF;;AAAxB;;AAAwB;AAAxB;AAAA;;AAAA;;AACgB;;AAAA;;;AAAhB;AAAgB;AAAhB;AAAA;;AACG;AAAA;;AAAA;AAAA;AAA6B;AAA7B;;;;;;;AAAX;;;ADyOe;;AAAe;;AAAf;AAAA;;AAAe;;AAAf;;;;;;;;;ACrOO;AACE;AAAA;AAFT;AAAP;;AAAA;AA3CkB;AAAlB;;AACR;;AAAA;;;AACY;;AAAkB;;;AAAlB;;;;;;;AARZ;;;AAEsC;;AAAA;;AAAA;AAAqC;AAArC;AAAvB;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;AASR;;;AAE0B;AACD;AAAA;;AAAA;AAAA;AAAd;;AAAA;AAAX;;;AACmD;;AAAc;AAAd;AAArB;;;AAAlB;;AACJ;;AAAA;AAAA;ADyPR;;;AAIuB;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAR;;AAAA;AAAP;ACzIR;;;ADrGe;AAAA;AAAA;AAAA;AAAe;AAAf;AC6HP;AACA;;;AACA;;;ADzD0B;AAAnB;;AAAA;AAAA;;AAAA;AAAA;;AAAP;AC2DQ;AAAA;AAAA;AAAA;;;AAAA;AAAR;AAAA;;AACA;AACc;;;AACS;AAAA;AAAA;AAAA;;;AAAA;AAAvB;AAAA;;AACO;;AAAA;AAAP;AAEO;;;AAAP;AAKG;;AAAA;;;AAAX;;;AAEgB;;AAAA;;;AACA;;AAAuB;AAAvB;AAFa;;;AAAjB;;AAKA;;;AAES;;AAAA;AAAA;AAAA;;;AAAT;AAAA;;;AAMA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAoD;AAApD;AADyC;AAA7C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAEW;AACe;;AAAZ;AAFP;AAAA;;AAAA;AAAA;;AAAA;AAAP;;AAAA;AANqB;;;;AApK7B;;;AAEe;AAAA;;AAAA;AAAA;AAA0B;AAAA;AAAA;AAAA;AAAA;;AAAA;AAA1B;AAAP;AD0NR;;;AAGY;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AACU;AAAA;;AAAA;AAAA;AADV;;AAAA;;AAAA;;;AAGQ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;;;;AAJR;AAAA;;;;;AA+BR;;;AAG6B;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AADd;;AAAA;AAAA;;;AAAP;ACnPR;;;AAIkD;;AAAS;AAAT;AAAxB;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACX;;AAAA;AAAsC;;;AAAtC;AAAP;ADoNR;;;AAIgB;;AADE;AAAA;;AAAA;AAAA;AAAN;;AAAA;AAAA;;AAAA;AADJ;;AAOR;;;AAEQ;AAIQ;;AAHO;AAAA;;AAAA;AAAA;;;;;;;;;;;AADf;;;;;;AAAA;;AChER;;;ADnKe;AAAA;AAAA;AAAA;AAAe;AAAf;AAgVP;AACA;;;AACA;;;AA5Q0B;AAAnB;;AAAA;AAAA;;AAAA;AAAA;;AAAP;AA8QQ;AAAA;AAAA;;;AAAA;AACR;AACO;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AAAP;ACxJI;;;AADG;;;AAAP;AAKG;;AAAA;;;AAAX;;;AACY;;AAAiB;;;AAAjB;;AAEA;;;AAES;;AAAA;AAAA;AAAA;;;AAAT;AAAA;;;ADsJJ;AAAA;AAAA;AAAA;AAA0B;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAA1B;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAsC;;AAAtC;;AAAA;AACA;;;ACjJW;AACe;;AAAZ;AAFP;AAAA;;AAAA;AAAA;;AAAA;AAAP;AAAA;AAHqB;;;;ADsD7B;;;AAEW;AAAA;AAAA;AAAA;AAAX;;;AACY;AAAc;;AAAd;;AChDZ;;;;;;;;AAqBY;AAAA;;AAAA;AAAA;AAAA;;;AACI;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;;;;AADJ;ADjK0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;ACuKI;;AAAA;;AAAA;AAAA;;;AAAa;;AAAA;AAAA;AAAA;;;AAAA;AAAT;AAAA;;AAAA;AAAJ;;;;AADJ;AAMqB;;AAAA;AAAA;AAAA;;AADrB;;AAAA;AAA8B;;;AAA9B;;AAImB;AAAnB;;AACY;AAAZ;;AACc;AAAd;;AAGc;;;AAAd;AAAA;;AACA;;AAAA;;AAAA;;;AACG;;;AAAX;;;AACY;;AAAA;AAAmB;;;AACnB;;AAAA;;AAAA;;AAAmB;;;AAAnB;;AAGY;AAAA;;;AAAA;AAAZ;;AACc;;;AAAA;AAAd;;AAEY;;AAAA;AACK;;AAAA;AAEH;;AAAA;AACE;;AAAA;AAFC;AAHd;;AAAA;AAAA;AAAA;AAAP;;AAAA;;;;;;;;;AA5OR;;;AAGY;AAAA;;AAAA;AAAA;AAAA;;;AACI;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;;;AAEkB;AAAA;;AAAA;AAAA;AAAd;;AAAA;AAFJ;;;;AADJ;;AAAA;AAmPR;;;AAQuB;;ADpRR;AAAA;AAAA;AAAA;AAAe;AAAf;ACqRf;;;AAC2B;;AAAA;AAAA;AAAA;;AAAA;AACnB;;AAAA;AAAA;AAER;;;;;ADnNkC;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;ACkOkB;AAAlB;;ADxSO;AAAA;AAAA;AAAe;AAAf;;;;AC0Sf;;;AAC2B;;AAAA;AAAA;AAAA;;;AAAA;AAAf;AAAA;;AACkB;AAAA;;AAAA;AAAA;AAAf;AAAf;;;AAGoB;;AAAA;;;AACA;;AAAe;AAAf;AAFc;;;AAAlB;;;;;;;;;;;;;;AAQK;AACC;AAAA;AAFP;AAAP;;AAAA;AADQ;;AAAmB;;;AAAnB;;;;;AAMhB;;;AASsB;;;AAAd;;AACuB;;;AAAvB;AACA;AAAuB;;;AAAvB;AACY;AAAZ;AACc;AAAd;AACG;;;AAAX;;;AACY;;AAAmB;;;AACP;AAAA;;;AAAA;AAAZ;;AACc;;;AAAA;AAAd;;AAE0B;AAAA;;AAAA;AAAA;AAAZ;AACF;;AAAA;AACS;;AAAA;AAEP;;AAAA;AACE;;AAAA;AAFC;AAII;;AAAA;AAAA;;AAAA;AARlB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAP;;AAAA;ADqBR;;;AASQ;;AAAA;;AAAA;AACgB;;AAAA;;;AAAhB;;AAAA;AAAA;;AAYR;;;;;;;AAyCQ;;;AACO;AAAA;AAAA;AAAA;AAAA;AAAP;AAG+B;;AAAA;AAAA;AAxV3B;;;AAAuC;;AAAA;;AAAA;AAAA;;AAAA;AAAvC;;;;AADJ;AAMA;;AAAA;;AAAA;AAuV6B;;AAAA;AAjVF;AAAA;;AAAA;AAAA;AAAvB;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAEA;AAIQ;;AAHO;AAAA;;AAAA;AAAA;AACI;;AACF;;;;;;;AAHjB;;;;;;AAAA;AA+UI;;AAAA;AAAmB;;AAAA;AAAnB;AAAA;AAAA;AADJ;AAGA;;AAAA;;AAAA;AACmB;AAAnB;;AAAA;AAAA;AAGiC;;AAAA;AAAA;AAAA;;AA1U7B;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;;AAAP;AAOA;;AAAA;;AAAA;AAwU0B;;AAAA;AApU1B;AAAA;AAIA;;AAAA;AAAA;AC5KO;;AAAA;AAAA;AAAP;AAAA;ADoLA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AAAX;;;AACY;;AAAA;;AAAA;;AAAA;;AAAA;AAKA;;AAAA;AAAA;AAAsB;AAAA;;AAAA;AAAA;AAAqB;;AAArB;AAAtB;AADJ;AA2TA;;AAAA;;;AAAA;;AAjSA;;AAAA;;AAAA;;AAAA;;AAAA;AACyC;;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGyC;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGqB;;;AAAA;AAArB;;AAAA;AAAA;AAGG;;AAAA;AAAA;AAAA;AAAA;;AAAsB;AAAA;;AAAA;AAAA;AAAqB;;AAArB;AAAtB;AAAX;;;AACiC;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAArB;;AAAA;AAAA;AAIO;;AAAA;AAAA;AAAJ;AAAP;AAyRA;AAAc;AAAd;;;;;;;;;;AAzbR;;;AAEe;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAP;;AAyHR;;;;;;AAGY;;AAAA;;;AAAA;AAAA;;;AAAA;AACE;;AADF;AADJ;AAIiB;;AAAA;AAAA;AAAqB;AAArB;AAAP;AAAA;;AAAA;;AAAA;AAAlB;;;AAEgC;;AACL;AAFf;;;AAIS;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AAAA;;AAC0B;AAAL;AAAA;AAAA;;AAAZ;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AACO;AAAP;AACG;AAAA;;AAAA;AAAA;AAA6B;;AAA7B;AAAf;;;AAEwB;;AAAA;;AAAA;AAAmB;;AAApB;AAAA;AAAP;;;;;;;;;AAgThB;;;;AAqBQ;;;AA1dO;AAAA;AAAA;AAAA;AAAe;;AAAf;AA2dA;AAAP;AACA;;;AAEO;;AAAA;AAAA;AAAP;AAAA;AACyC;AAAtC;;;;AAAX;;;AACY;;AAAA;;;;AAAA;;;;;;;;AAEA;AAAA;;AAAA;AAAA;AACG;;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAEI;;AAAA;AAAA;AADD;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAKI;AAAA;;AAAA;AAAA;AAD0B;AAI1B;AAAA;;AAAA;AAAA;AAD0B;AAJ3B;AAAP;;AAAA;AASR;;;AAqBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;AASS;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA6BQ;AANwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;AAKW;;AAAZ;AAAP;AAAA;AAXmC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACyD;;AAAA;;;AAAzD;;;;AAJ2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACuD;;AAAA;;;AAAvD;;;;AAN2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEI;;AAAA;;;AADJ;;;;AAPwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;;;;AALA;;AAAA;;AAAA;;;;;;;;AA8BhB;;;AAkBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAAP;AASS;;;;;;;AAFT;;AAAA;;;;;;;;;;;;AAkBQ;AAHuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAGW;;AAAZ;AAAP;AAAA;AAP+B;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;;;;;AAiBhB;;;AAoBQ;;;AAhoBO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAioBA;AAAP;AACA;;;AACA;;;AAC8B;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEgC;;AAEtB;;AAFsB;AAGjB;;AAHiB;AAIf;;AAJe;AAKlB;;AALkB;AAAhC;AAOmB;;AAAZ;AAAP;AA/nBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AA8nBR;;;AAkBQ;;;AACA;;;AAhmB0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAmmBe;AAAA;AAAA;AAAA;;;AAAA;AACf;AAAA;;AACA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AACA;;;AAEK;AAAuC;;AAAZ;AADzB;AAAP;AAIR;;;;;;;AAjrBe;AAAA;AAAA;AAAA;AAAe;AAAf;AAuLH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AAtJc;;AAFQ;;AAElB;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAuC0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAuoBA;;;AACA;;;AACO;;AAAA;AAAP;AAAA;AAEI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAyC;AAAA;;AAAA;AAAA;AAAzC;AADJ;AAIA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAEI;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AADkC;AAAtC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAGuD;AAAA;;AAAA;AAAA;AAAZ;AAA3C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AACmB;AAAA;;AAAA;AAAA;AAAmB;AAAA;AAAA;AAAA;AAAnB;AAAZ;AAAP;;AAAA;;;;;;;;;AAER;;;AAcQ;;;AACiB;;;AAAO;AAAxB;;AAAA;AAAA;AACmB;;AAAZ;AAAP;AA3rBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AA0rBR;;;AAkBQ;;;AAzrB0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2rBA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AACmB;;AAAZ;AAAP;AAER;;;;AA1tBsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAuuBiB;;;AAAO;AAAxB;;AAAA;AAAA;;;;;;AAER;;;AAW8C;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AAAZ;AACC;AAAA;;AAAA;AAAA;AAAZ;AACqB;AAAA;;AAAA;AAAA;AAAX;AAAA;;;AACK;AAAA;;AAAA;AAAA;AAAZ;AAAA;;;AACW;AAAA;;AAAA;AAAA;AAAZ;AACkB;AAAA;AAAA;AAAA;AAAZ;AAEf;AAAA;;AAAA;AAAA;AAD8B;AAI9B;AAAA;;AAAA;AAAA;AAD8B;AAGR;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AACW;AAAA;;AAAA;AAAA;AAAf;;AAAA;AAAA;;AAAA;AACe;AAAA;;AAAA;AAAA;AAAf;;AAAA;AAAA;;AAAA;AAjBP;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAP;AAoBR;;;AA1uBkC;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAyvBO;AAAA;AAAP;AAER;;;AAQsB;;AAz0BP;AAAA;AAAA;AAAA;AAAe;AAAf;AA00Bf;;;AAC0B;;AAAA;AAAA;AAAA;;AAAA;AAClB;;AAAA;AAAA;AAER;;;AAGwB;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AAFG;AAAA;;;;AAAA;AAAA;AAAP;AAKR;;;AAEiC;AAAA;;AAAA;AAAA;AAAlB;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAP;AA1eR;;;AAQQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCmD;;AAAf;;AAA5B;AAkBA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AACA;;AAAkB;AAAlB;AACA;;AAA4B;AAA5B;AAGA;;AAAgB;;AAAhB;AAGA;;AAAmB;AAAnB;AACA;AAAyB;AAAzB;AAGA;;AAAqB;AAArB;AAIA;;AAAqB;AAArB;AAKA;;AAAyC;AAAzC;AACA;;AAAyC;AAAzC;AACA;;AAAqB;AAArB;AACA;;AAAqC;AAArC;AACA;;AAAqC;AAArC;AACA;;AAAqB;AAArB;AAGA;AAAc;AAAd;AACA;;AAAiB;AAAjB;AACA;;AAAiB;AAAjB;ACvDO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAGA;;AAA6B;AAA7B;AACA;;AAAyB;AAAzB;AAxBR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AD26BK;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjBA;;AAAA;AAAA;AAAA;;AAAA;ACh4BL;;;ADg4BK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAdA;;AAAA;AAAA;AAAA;;AAAA;ACn1BL;;;ADm1BK;;;AAAA;;AAvBA;;AAAA;AAAA;AAAA;;AAAA;AC5zBL;;;AAAA;;;AD4zBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlBA;;AAAA;AAAA;AAAA;;AAAA;AC1yBL;;;AD0yBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA1CA;;AAAA;AAAA;AAAA;;AAAA;AChwBL;;;AAAA;;;ADgwBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9BA;;AAAA;AAAA;AAAA;;AAAA;ACluBL;;;ADkuBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAnCA;;AAAA;AAAA;AAAA;;AAAA;AC/rBL;;;AAAA;;;AD+rBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhDA;;AAAA;AAAA;AAAA;;AAAA;AC/oBL;;;AAAA;;;AD+oBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/DA;;AAAA;AAAA;AAAA;;AAAA;AChlBL;;;AAAA;;;AAAA;;;ADglBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAxDA;;AAAA;AAAA;AAAA;;AAAA;ACxhBL;;;ADwhBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlFA;;AAAA;AAAA;AAAA;;AAAA;ACtcL;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;ADscK;;;AAAA;;AAtBA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AChbL;;;AAAA;;;ADgbK;;;AAAA;;ACrCA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjCA;;AAAA;AAAA;AAAA;;AAAA;AA1WL;;;AA0WK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAzDA;;AAAA;AAAA;AAAA;;AAAA;AApSL;;;AAAA;;;AAoSK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhDA;;AAAA;AAAA;AAAA;;AAAA;AApPL;;;AAAA;;;AAoPK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9DA;;AAAA;AAAA;AAAA;;AAAA;AAtLL;;;AAAA;;;AAsLK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjDA;;AAAA;AAAA;AAAA;;AAAA;AArIL;;;AAAA;;;AAAA;;;AAqIK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AArIL;;AAAA;;AAAA;;;;AAAA;;;AD4bK;;AAAA;AAAL;;;AAAA;;ACvTA;;;;;;;;;AA+BY;;AAAA;ADnFG;AAAA;AAAA;AAAA;AAAe;AAAf;AAgMH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AA6EO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AAxM0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AA2MW;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;AAAP;AACW;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;AAAP;AAIa;;AAAA;AAAA;AAAA;;;AAAA;AAAT;;AAAA;AADJ;AAUoB;AAAA;AAAA;AAAA;;;AAApB;;AACG;AAAA;AAAA;;;AAAA;AAAX;;;AArFY;;AAAA;AAAA;AAAA;;;AAAmC;;AAAA;AAAA;AAAA;;;AAAnC;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AAAqC;;AAAA;AAAA;AAAA;;;AAArC;AADJ;;;;AADJ;ACnHc;;;AACd;;AAAA;;AAAA;;;AAGoB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAApB;;AACA;;AAAA;;AAAA;AAAA;;AAAA;;AAAmB;;;AAAnB;;ADwOI;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AADyC;AAA7C;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAII;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAD2C;AAA/C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AA5EG;AAAA;AAAA;;;AAAA;AAAX;;;AACY;;AAAA;AAAA;AAAA;AAA2C;;AAA3C;;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAA6C;;AAA7C;;AAAA;ACzJ8B;;AAAA;AAAf;;AAAA;AAAA;;AAAA;AAAZ;AAAP;;AAAA;;;;;ADkMI;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AACsD;;AAAA;AAAA;AAAtD;;AAAA;AAAA;AAAA;AAAsD;;;AAAtD;;AAAA;;;;;;;;AAhSZ;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAER;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AC/DR;;;;;AAEqB;;AAAb;AACc;AAAA;;AAAA;AAAA;AAAA;;AAAA;AACG;AAAA;;AAAA;AAAA;AAAd;AAAX;;;AAC0B;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAYlB;;AAAA;;AAAA;AAAA;;AAAA;AACA;;AAAA;AAZkB;AAAA;;AAAA;AAAA;AAAb;;AAAA;AAAb;;;AAC6D;AAAA;;AAAA;AAAA;AAApC;;AAAA;AAAb;AAAA;;AACkB;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACZ;;AAAA;AAAlB;;;AAEoC;;AACL;AAFf;;;AAIA;;AAAc;AAAd;AAAA;AAAA;;AACkB;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;AACtB;;AAA2B;;AAAb;AAAd;;;;;AA0BZ;;;AAKY;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AADJ;;AAoCR;;;AAKQ;;AAAA;;AAAA;;;AACA;;AAAmB;;;AACK;AAAA;;;AAAA;AACR;AAAA;;;AAAA;AACO;;AAAA;AAAA;AAAA;;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAInB;;AAAA;;AAAA;;;AAAA;AAAA;;AAAA;AAII;;;AAAA;;AAAA;AAJJ;AADJ;AArCR;;;;;;;AAGA;;AAAA;;;AACkC;AAAA;;AAAA;AAAA;AAGF;;AAAxB;;AAAwB;AAAxB;AAAA;;AAAA;;AACgB;;AAAA;;;AAAhB;AAAgB;AAAhB;AAAA;;AACG;AAAA;;AAAA;AAAA;AAA6B;AAA7B;;;;;;;AAAX;;;ADuOe;;AAAe;;AAAf;AAAA;;AAAe;;AAAf;;;;;;;;;ACnOO;AACE;AAAA;AAFT;AAAP;;AAAA;AA3CkB;AAAlB;;AACR;;AAAA;;;AACY;;AAAkB;;;AAAlB;;;;;;;AARZ;;;AAEsC;;AAAA;;AAAA;AAAqC;AAArC;AAAvB;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAP;AASR;;;AAE0B;AACD;AAAA;;AAAA;AAAA;AAAd;;AAAA;AAAX;;;AACmD;;AAAc;AAAd;AAArB;;;AAAlB;;AACJ;;AAAA;AAAA;ADuPR;;;AAIuB;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAR;;AAAA;AAAP;ACvIR;;;ADrGe;AAAA;AAAA;AAAA;AAAe;AAAf;AC6HP;AACA;;;AACA;;;ADzD0B;AAAnB;;AAAA;AAAA;;AAAA;AAAA;;AAAP;AC2DQ;AAAA;AAAA;AAAA;;;AAAA;AAAR;AAAA;;AACA;AACc;;;AACS;AAAA;AAAA;AAAA;;;AAAA;AAAvB;AAAA;;AACO;;AAAA;AAAP;AAEO;;;AAAP;AAKG;;AAAA;;;AAAX;;;AAEgB;;AAAA;;;AACA;;AAAuB;AAAvB;AAFa;;;AAAjB;;AAKA;;;AAES;;AAAA;AAAA;AAAA;;;AAAT;AAAA;;;AAMA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAoD;AAApD;AADyC;AAA7C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAEW;AACe;;AAAZ;AAFP;AAAA;;AAAA;AAAA;;AAAA;AAAP;;AAAA;AANqB;;;;AApK7B;;;AAEe;AAAA;;AAAA;AAAA;AAA0B;AAAA;AAAA;AAAA;AAAA;;AAAA;AAA1B;AAAP;AD0NR;;;AAGY;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AACU;AAAA;;AAAA;AAAA;AADV;;AAAA;;AAAA;;;AAGQ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;;;;AAJR;AAAA;;;;;AA6BR;;;AAG6B;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AADd;;AAAA;AAAA;;;AAAP;ACjPR;;;AAIkD;;AAAS;AAAT;AAAxB;;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AACX;;AAAA;AAAsC;;;AAAtC;AAAP;ADoNR;;;AAGoD;;AAAlC;AAAA;;AAAA;AAAA;AAAN;;AAAA;AAAA;;AAAA;AADJ;;AAKR;;;AAEQ;AAIQ;;AAHO;AAAA;;AAAA;AAAA;;;;;;;;;;;AADf;;;;;;AAAA;;AC9DR;;;ADnKe;AAAA;AAAA;AAAA;AAAe;AAAf;AA8UP;AACA;;;AACA;;;AA1Q0B;AAAnB;;AAAA;AAAA;;AAAA;AAAA;;AAAP;AA4QQ;AAAA;AAAA;;;AAAA;AACR;AACO;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AAAP;ACtJI;;;AADG;;;AAAP;AAKG;;AAAA;;;AAAX;;;AACY;;AAAiB;;;AAAjB;;AAEA;;;AAES;;AAAA;AAAA;AAAA;;;AAAT;AAAA;;;ADoJJ;AAAA;AAAA;AAAA;AAA0B;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAA1B;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAsC;;AAAtC;;AAAA;AACA;;;AC/IW;AACe;;AAAZ;AAFP;AAAA;;AAAA;AAAA;;AAAA;AAAP;AAAA;AAHqB;;;;ADoD7B;;;AAEW;AAAA;AAAA;AAAA;AAAX;;;AACY;AAAc;;AAAd;;AC9CZ;;;;;;;;AAqBY;AAAA;;AAAA;AAAA;AAAA;;;AACI;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;;;;AADJ;ADjK0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;ACuKI;;AAAA;;AAAA;AAAA;;;AAAa;;AAAA;AAAA;AAAA;;;AAAA;AAAT;AAAA;;AAAA;AAAJ;;;;AADJ;AAMqB;;AAAA;AAAA;AAAA;;AADrB;;AAAA;AAA8B;;;AAA9B;;AAImB;AAAnB;;AACY;AAAZ;;AACc;AAAd;;AAGc;;;AAAd;AAAA;;AACA;;AAAA;;AAAA;;;AACG;;;AAAX;;;AACY;;AAAA;AAAmB;;;AACnB;;AAAA;;AAAA;;AAAmB;;;AAAnB;;AAGY;AAAA;;;AAAA;AAAZ;;AACc;;;AAAA;AAAd;;AAEY;;AAAA;AACK;;AAAA;AAEH;;AAAA;AACE;;AAAA;AAFC;AAHd;;AAAA;AAAA;AAAA;AAAP;;AAAA;;;;;;;;;AA5OR;;;AAGY;AAAA;;AAAA;AAAA;AAAA;;;AACI;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;;;AAEkB;AAAA;;AAAA;AAAA;AAAd;;AAAA;AAFJ;;;;AADJ;;AAAA;AAmPR;;;AAQuB;;ADpRR;AAAA;AAAA;AAAA;AAAe;AAAf;ACqRf;;;AAC2B;;AAAA;AAAA;AAAA;;AAAA;AACnB;;AAAA;AAAA;AAER;;;;;ADnNkC;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;ACkOkB;AAAlB;;ADxSO;AAAA;AAAA;AAAe;AAAf;;;;AC0Sf;;;AAC2B;;AAAA;AAAA;AAAA;;;AAAA;AAAf;AAAA;;AACkB;AAAA;;AAAA;AAAA;AAAf;AAAf;;;AAGoB;;AAAA;;;AACA;;AAAe;AAAf;AAFc;;;AAAlB;;;;;;;;;;;;;;AAQK;AACC;AAAA;AAFP;AAAP;;AAAA;AADQ;;AAAmB;;;AAAnB;;;;;AAMhB;;;AASsB;;;AAAd;;AACuB;;;AAAvB;AACA;AAAuB;;;AAAvB;AACY;AAAZ;AACc;AAAd;AACG;;;AAAX;;;AACY;;AAAmB;;;AACP;AAAA;;;AAAA;AAAZ;;AACc;;;AAAA;AAAd;;AAE0B;AAAA;;AAAA;AAAA;AAAZ;AACF;;AAAA;AACS;;AAAA;AAEP;;AAAA;AACE;;AAAA;AAFC;AAII;;AAAA;AAAA;;AAAA;AARlB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAP;;AAAA;ADmBR;;;AASQ;;AAAA;;AAAA;AACgB;;AAAA;;;AAAhB;;AAAA;AAAA;;AAYR;;;;;;;AAyCQ;;;AACO;AAAA;AAAA;AAAA;AAAA;AAAP;AAG+B;;AAAA;AAAA;AAtV3B;;;AAAuC;;AAAA;;AAAA;AAAA;;AAAA;AAAvC;;;;AADJ;AAMA;;AAAA;;AAAA;AAqV6B;;AAAA;AA/UF;AAAA;;AAAA;AAAA;AAAvB;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAEA;AAIQ;;AAHO;AAAA;;AAAA;AAAA;AACI;;AACF;;;;;;;AAHjB;;;;;;AAAA;AA6UI;;AAAA;AAAmB;;AAAA;AAAnB;AAAA;AAAA;AADJ;AAGA;;AAAA;;AAAA;AACmB;AAAnB;;AAAA;AAAA;AAGiC;;AAAA;AAAA;AAAA;;AAxU7B;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;;AAAP;AAOA;;AAAA;;AAAA;AAsU0B;;AAAA;AAlU1B;AAAA;AAIA;;AAAA;AAAA;AC5KO;;AAAA;AAAA;AAAP;AAAA;ADoLA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AAAX;;;AACY;;AAAA;;AAAA;;AAAA;;AAAA;AAKA;;AAAA;AAAA;AAAsB;AAAA;;AAAA;AAAA;AAAqB;;AAArB;AAAtB;AADJ;AAyTA;;AAAA;;;AAAA;;AA/RA;;AAAA;;AAAA;;AAAA;;AAAA;AACyC;;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGyC;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGqB;;;AAAA;AAArB;;AAAA;AAAA;AAGG;;AAAA;AAAA;AAAA;AAAA;;AAAsB;AAAA;;AAAA;AAAA;AAAqB;;AAArB;AAAtB;AAAX;;;AACiC;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAArB;;AAAA;AAAA;AAIO;;AAAA;AAAA;AAAJ;AAAP;AAuRA;AAAc;AAAd;;;;;;;;;;AAvbR;;;AAEe;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAP;;AAyHR;;;;;;AAGY;;AAAA;;;AAAA;AAAA;;;AAAA;AACE;;AADF;AADJ;AAIiB;;AAAA;AAAA;AAAqB;AAArB;AAAP;AAAA;;AAAA;;AAAA;AAAlB;;;AAEgC;;AACL;AAFf;;;AAIS;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AAAA;;AAC0B;AAAL;AAAA;AAAA;;AAAZ;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AACO;AAAP;AACG;AAAA;;AAAA;AAAA;AAA6B;;AAA7B;AAAf;;;AAEwB;;AAAA;;AAAA;AAAmB;;AAApB;AAAA;AAAP;;;;;;;;;AA8ShB;;;;AAqBQ;;;AAxdO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAydA;AAAP;AACA;;;AAEO;;AAAA;AAAA;AAAP;AAAA;AACyC;AAAtC;;;;AAAX;;;AACY;;AAAA;;;;AAAA;;;;;;;;AAEA;AAAA;;AAAA;AAAA;AACG;;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAEI;;AAAA;AAAA;AADD;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAKI;AAAA;;AAAA;AAAA;AAD0B;AAI1B;AAAA;;AAAA;AAAA;AAD0B;AAJ3B;AAAP;;AAAA;AASR;;;AAqBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;AASS;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA6BQ;AANwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;AAKW;;AAAZ;AAAP;AAAA;AAXmC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACyD;;AAAA;;;AAAzD;;;;AAJ2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACuD;;AAAA;;;AAAvD;;;;AAN2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEI;;AAAA;;;AADJ;;;;AAPwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;;;;AALA;;AAAA;;AAAA;;;;;;;;AA8BhB;;;AAkBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAAP;AASS;;;;;;;AAFT;;AAAA;;;;;;;;;;;;AAkBQ;AAHuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAGW;;AAAZ;AAAP;AAAA;AAP+B;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;;;;;AAiBhB;;;AAoBQ;;;AA9nBO;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+nBA;AAAP;AACA;;;AACA;;;AAC8B;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEgC;;AAEtB;;AAFsB;AAGjB;;AAHiB;AAIf;;AAJe;AAKlB;;AALkB;AAAhC;AAOmB;;AAAZ;AAAP;AA7nBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AA4nBR;;;AAkBQ;;;AACA;;;AA9lB0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAimBe;AAAA;AAAA;AAAA;;;AAAA;AACf;AAAA;;AACA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AACA;;;AAEK;AAAuC;;AAAZ;AADzB;AAAP;AAIR;;;;;;;AA/qBe;AAAA;AAAA;AAAA;AAAe;AAAf;AAuLH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AAtJc;;AAFQ;;AAElB;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAuC0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqoBA;;;AACA;;;AACO;;AAAA;AAAP;AAAA;AAEI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAyC;AAAA;;AAAA;AAAA;AAAzC;AADJ;AAIA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAEI;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AADkC;AAAtC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAGuD;AAAA;;AAAA;AAAA;AAAZ;AAA3C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AACmB;AAAA;;AAAA;AAAA;AAAmB;AAAA;AAAA;AAAA;AAAnB;AAAZ;AAAP;;AAAA;;;;;;;;;AAER;;;AAcQ;;;AACiB;;;AAAO;AAAxB;;AAAA;AAAA;AACmB;;AAAZ;AAAP;AAzrBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AAwrBR;;;AAkBQ;;;AAvrB0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAyrBA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AACmB;;AAAZ;AAAP;AAER;;;;AAxtBsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAquBiB;;;AAAO;AAAxB;;AAAA;AAAA;;;;;;AAER;;;AAW8C;AAAA;;AAAA;AAAA;AAAZ;AACU;AAAA;;AAAA;AAAA;AAAZ;AACc;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AAAZ;AACC;AAAA;;AAAA;AAAA;AAAZ;AACqB;AAAA;;AAAA;AAAA;AAAX;AAAA;;;AACK;AAAA;;AAAA;AAAA;AAAZ;AAAA;;;AACW;AAAA;;AAAA;AAAA;AAAZ;AACkB;AAAA;AAAA;AAAA;AAAZ;AAEf;AAAA;;AAAA;AAAA;AAD8B;AAI9B;AAAA;;AAAA;AAAA;AAD8B;AAGR;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AACW;AAAA;;AAAA;AAAA;AAAf;;AAAA;AAAA;;AAAA;AACe;AAAA;;AAAA;AAAA;AAAf;;AAAA;AAAA;;AAAA;AAlBP;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAP;AAqBR;;;AAzuBkC;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAwvBO;AAAA;AAAP;AAER;;;AAQsB;;AAx0BP;AAAA;AAAA;AAAA;AAAe;AAAf;AAy0Bf;;;AAC0B;;AAAA;AAAA;AAAA;;AAAA;AAClB;;AAAA;AAAA;AAER;;;AASwB;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AAFG;AAAA;;;;AAAA;AAAA;AAAP;AAKR;;;AAQiC;AAAA;;AAAA;AAAA;AAAlB;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAP;AAvfR;;;AAQQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", "op_pc_offset": 0, "pc_events": { "1": { @@ -15,7 +15,7 @@ "op": "intcblock 0 1 8 100 448 255 86400 200" }, "16": { - "op": "bytecblock 0x151f7c75 0x52333023 \"circulating_units\" \"status\" \"total_coupons\" \"issuance_date\" \"maturity_date\" 0x00 0x0000000000000000 \"denomination_asset_id\" \"primary_distribution_opening_date\" 0x74696d654576656e7473 \"unit_value\" \"day_count_convention\" \"total_units\" \"secondary_market_opening_date\" \"secondary_market_closure_date\" 0x636f75706f6e5261746573 0x52323023 \"settlement_asset_id\" \"primary_distribution_closure_date\" \"suspended\" \"defaulted\" \"due_coupons_watermark\" \"paid_coupon_units\" \"metadata\" \"interest_rate\" 0x52373023 0x52363023 0x52353023 0x52343023 0x0012 0x0000 0x52383023 0x068101" + "op": "bytecblock 0x151f7c75 0x52333023 \"circulating_units\" \"status\" \"total_coupons\" \"issuance_date\" \"settlement_asset_id\" \"maturity_date\" 0x00 0x0000000000000000 \"primary_distribution_opening_date\" 0x74696d654576656e7473 \"unit_value\" \"day_count_convention\" \"total_units\" \"secondary_market_opening_date\" \"secondary_market_closure_date\" 0x636f75706f6e5261746573 0x52323023 \"denomination_asset_id\" \"primary_distribution_closure_date\" \"suspended\" \"defaulted\" \"due_coupons_watermark\" \"paid_coupon_units\" \"metadata\" \"interest_rate\" 0x52373023 0x52363023 0x52353023 0x52343023 0x0012 0x0000 0x52383023 0x068101" }, "466": { "op": "txn ApplicationID", @@ -40,7 +40,7 @@ "op": "app_global_put" }, "476": { - "op": "bytec 9 // \"denomination_asset_id\"" + "op": "bytec 19 // \"denomination_asset_id\"" }, "478": { "op": "intc_0 // 0" @@ -49,7 +49,7 @@ "op": "app_global_put" }, "480": { - "op": "bytec 19 // \"settlement_asset_id\"" + "op": "bytec 6 // \"settlement_asset_id\"" }, "482": { "op": "intc_0 // 0" @@ -166,7 +166,7 @@ "op": "app_global_put" }, "532": { - "op": "bytec 6 // \"maturity_date\"" + "op": "bytec 7 // \"maturity_date\"" }, "534": { "op": "intc_0 // 0" @@ -281,7 +281,7 @@ "stack_out": [] }, "580": { - "op": "pushbytess 0x4fd6a3cc 0x8cf14b51 0x9c76b6a3 0x44363d49 0x53bef045 0x67db4f20 0xf6a96c8d 0x63f99589 0xd3a4d6ab 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x301dd919 0xed02759f 0xfad2173e 0x08efea35 0xddcec07b // method \"asset_transfer(address,address,uint64)uint64\", method \"pay_coupon(address,byte[])(uint64,uint64,byte[])\", method \"pay_principal(address,byte[])(uint64,uint64,byte[])\", method \"get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))\", method \"get_coupon_rates()uint16[]\", method \"get_payment_amount(address)(uint64,uint64)\", method \"get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)\", method \"asset_create(address,byte[])void\", method \"asset_config(uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void\", method \"set_secondary_time_events(uint64[])(uint64,uint64)\", method \"assign_role(address,uint8,byte[])uint64\", method \"revoke_role(address,uint8)uint64\", method \"open_account(address,address)uint64\", method \"close_account(address)(uint64,uint64)\", method \"primary_distribution(address,uint64)uint64\", method \"set_asset_suspension(bool)uint64\", method \"set_account_suspension(address,bool)uint64\", method \"set_default_status(bool)void\", method \"get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)\", method \"get_account_info(address)(address,uint64,uint64,uint64,bool)\", method \"get_time_events()uint64[]\", method \"get_secondary_market_schedule()uint64[]\", method \"get_asset_metadata()byte[]\"" + "op": "pushbytess 0x4fd6a3cc 0x8cf14b51 0x9c76b6a3 0x44363d49 0x53bef045 0x67db4f20 0xf6a96c8d 0x63f99589 0xd3a4d6ab 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x80bfcdd1 0xed02759f 0xfad2173e 0x08efea35 0xddcec07b // method \"asset_transfer(address,address,uint64)uint64\", method \"pay_coupon(address,byte[])(uint64,uint64,byte[])\", method \"pay_principal(address,byte[])(uint64,uint64,byte[])\", method \"get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))\", method \"get_coupon_rates()uint16[]\", method \"get_payment_amount(address)(uint64,uint64)\", method \"get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)\", method \"asset_create(address,byte[])void\", method \"asset_config(uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void\", method \"set_secondary_time_events(uint64[])(uint64,uint64)\", method \"assign_role(address,uint8,byte[])uint64\", method \"revoke_role(address,uint8)uint64\", method \"open_account(address,address)uint64\", method \"close_account(address)(uint64,uint64)\", method \"primary_distribution(address,uint64)uint64\", method \"set_asset_suspension(bool)uint64\", method \"set_account_suspension(address,bool)uint64\", method \"set_default_status(bool)void\", method \"get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)\", method \"get_account_info(address)(address,uint64,uint64,uint64,bool)\", method \"get_time_events()uint64[]\", method \"get_secondary_market_schedule()uint64[]\", method \"get_asset_metadata()byte[]\"" }, "697": { "op": "txna ApplicationArgs 0" @@ -3318,7 +3318,7 @@ ] }, "1328": { - "op": "bytec 7 // 0x00", + "op": "bytec 8 // 0x00", "defined_out": [ "0x00", "is_true%0#0", @@ -3541,7 +3541,7 @@ ] }, "1344": { - "op": "bytec 7 // 0x00", + "op": "bytec 8 // 0x00", "stack_out": [ "sender_unit_value#0", "tmp%0#1", @@ -5048,7 +5048,7 @@ "op": "assert // check self.account entry exists" }, "1514": { - "op": "bytec 8 // 0x0000000000000000" + "op": "bytec 9 // 0x0000000000000000" }, "1516": { "op": "replace2 40" @@ -5073,7 +5073,7 @@ "op": "assert // check self.account entry exists" }, "1525": { - "op": "bytec 8 // 0x0000000000000000" + "op": "bytec 9 // 0x0000000000000000" }, "1527": { "op": "replace2 48" @@ -5818,7 +5818,7 @@ ] }, "1621": { - "op": "bytec 6 // \"maturity_date\"", + "op": "bytec 7 // \"maturity_date\"", "defined_out": [ "\"maturity_date\"", "0", @@ -8992,9 +8992,9 @@ ] }, "2148": { - "op": "bytec 9 // \"denomination_asset_id\"", + "op": "bytec 6 // \"settlement_asset_id\"", "defined_out": [ - "\"denomination_asset_id\"", + "\"settlement_asset_id\"", "0", "tmp%0#0", "tmp%1#0" @@ -9003,7 +9003,7 @@ "tmp%0#0", "tmp%1#0", "0", - "\"denomination_asset_id\"" + "\"settlement_asset_id\"" ] }, "2150": { @@ -9022,8 +9022,8 @@ ] }, "2151": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", "stack_out": [ "tmp%0#0", "tmp%1#0", @@ -9073,7 +9073,7 @@ "op": "getbit" }, "2166": { - "op": "bytec 7 // 0x00" + "op": "bytec 8 // 0x00" }, "2168": { "op": "intc_0 // 0" @@ -9445,16 +9445,16 @@ ] }, "2240": { - "op": "bytec 9 // \"denomination_asset_id\"", + "op": "bytec 6 // \"settlement_asset_id\"", "defined_out": [ - "\"denomination_asset_id\"", + "\"settlement_asset_id\"", "0", "tmp%0#0" ], "stack_out": [ "tmp%0#0", "0", - "\"denomination_asset_id\"" + "\"settlement_asset_id\"" ] }, "2242": { @@ -9471,8 +9471,8 @@ ] }, "2243": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", "stack_out": [ "tmp%0#0", "maybe_value%0#0" @@ -9559,7 +9559,7 @@ ] }, "2259": { - "op": "bytec 19 // \"settlement_asset_id\"", + "op": "bytec 6 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", "0", @@ -9884,7 +9884,7 @@ ] }, "2317": { - "op": "bytec 6 // \"maturity_date\"", + "op": "bytec 7 // \"maturity_date\"", "defined_out": [ "\"maturity_date\"", "0", @@ -10255,7 +10255,7 @@ ] }, "2381": { - "op": "bytec 8 // 0x0000000000000000", + "op": "bytec 9 // 0x0000000000000000", "defined_out": [ "0x0000000000000000", "maybe_value%2#0", @@ -10787,7 +10787,7 @@ ] }, "2463": { - "op": "bytec 8 // 0x0000000000000000", + "op": "bytec 9 // 0x0000000000000000", "defined_out": [ "0x0000000000000000", "tmp%0#0", @@ -12892,7 +12892,7 @@ ] }, "2804": { - "op": "bytec 7 // 0x00", + "op": "bytec 8 // 0x00", "defined_out": [ "0x00", "denominator#0", @@ -13421,7 +13421,7 @@ ] }, "2880": { - "op": "bytec 9 // \"denomination_asset_id\"", + "op": "bytec 19 // \"denomination_asset_id\"", "defined_out": [ "\"denomination_asset_id\"" ], @@ -13502,7 +13502,7 @@ ] }, "2889": { - "op": "bytec 9 // \"denomination_asset_id\"", + "op": "bytec 19 // \"denomination_asset_id\"", "stack_out": [ "array_head_and_tail%0#0", "day_count_convention#1", @@ -13589,7 +13589,7 @@ ] }, "2897": { - "op": "bytec 19 // \"settlement_asset_id\"", + "op": "bytec 6 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", "denomination_asset_id#1", @@ -13653,7 +13653,7 @@ ] }, "2905": { - "op": "bytec 19 // \"settlement_asset_id\"", + "op": "bytec 6 // \"settlement_asset_id\"", "stack_out": [ "array_head_and_tail%0#0", "day_count_convention#1", @@ -15186,7 +15186,7 @@ "op": "btoi" }, "3102": { - "op": "bytec 6 // \"maturity_date\"" + "op": "bytec 7 // \"maturity_date\"" }, "3104": { "op": "swap" @@ -16315,7 +16315,7 @@ ] }, "3315": { - "op": "bytec 6 // \"maturity_date\"", + "op": "bytec 7 // \"maturity_date\"", "defined_out": [ "\"maturity_date\"", "0", @@ -16362,7 +16362,7 @@ "op": "intc_0 // 0" }, "3323": { - "op": "bytec 6 // \"maturity_date\"" + "op": "bytec 7 // \"maturity_date\"" }, "3325": { "op": "app_global_get_ex" @@ -18387,7 +18387,7 @@ ] }, "3755": { - "op": "bytec 8 // 0x0000000000000000", + "op": "bytec 9 // 0x0000000000000000", "defined_out": [ "0x0000000000000000", "payment_address#0 (copy)", @@ -18411,7 +18411,7 @@ ] }, "3758": { - "op": "bytec 8 // 0x0000000000000000", + "op": "bytec 9 // 0x0000000000000000", "stack_out": [ "tmp%2#0", "encoded_tuple_buffer%2#0", @@ -18430,7 +18430,7 @@ ] }, "3761": { - "op": "bytec 8 // 0x0000000000000000", + "op": "bytec 9 // 0x0000000000000000", "stack_out": [ "tmp%2#0", "encoded_tuple_buffer%3#0", @@ -18449,7 +18449,7 @@ ] }, "3764": { - "op": "bytec 7 // 0x00", + "op": "bytec 8 // 0x00", "defined_out": [ "0x00", "encoded_tuple_buffer%4#0", @@ -20978,7 +20978,7 @@ ] }, "4229": { - "op": "bytec 9 // \"denomination_asset_id\"", + "op": "bytec 19 // \"denomination_asset_id\"", "defined_out": [ "\"denomination_asset_id\"", "0" @@ -21023,19 +21023,19 @@ ] }, "4235": { - "op": "bytec_2 // \"circulating_units\"", + "op": "bytec 6 // \"settlement_asset_id\"", "defined_out": [ - "\"circulating_units\"", + "\"settlement_asset_id\"", "0", "val_as_bytes%0#0" ], "stack_out": [ "val_as_bytes%0#0", "0", - "\"circulating_units\"" + "\"settlement_asset_id\"" ] }, - "4236": { + "4237": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -21048,104 +21048,103 @@ "maybe_exists%1#0" ] }, - "4237": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", + "4238": { + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", "stack_out": [ "val_as_bytes%0#0", "maybe_value%1#0" ] }, - "4238": { + "4239": { + "op": "itob", + "defined_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ] + }, + "4240": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", - "maybe_value%1#0", + "val_as_bytes%1#0", "0" ] }, - "4239": { - "op": "bytec 12 // \"unit_value\"", + "4241": { + "op": "bytec_2 // \"circulating_units\"", "defined_out": [ - "\"unit_value\"", + "\"circulating_units\"", "0", - "maybe_value%1#0", - "val_as_bytes%0#0" + "val_as_bytes%0#0", + "val_as_bytes%1#0" ], "stack_out": [ "val_as_bytes%0#0", - "maybe_value%1#0", + "val_as_bytes%1#0", "0", - "\"unit_value\"" + "\"circulating_units\"" ] }, - "4241": { + "4242": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", - "maybe_value%1#0", "maybe_value%2#0", - "val_as_bytes%0#0" + "val_as_bytes%0#0", + "val_as_bytes%1#0" ], "stack_out": [ "val_as_bytes%0#0", - "maybe_value%1#0", + "val_as_bytes%1#0", "maybe_value%2#0", "maybe_exists%2#0" ] }, - "4242": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "val_as_bytes%0#0", - "maybe_value%1#0", - "maybe_value%2#0" - ] - }, "4243": { - "op": "*", - "defined_out": [ - "to_encode%0#0", - "val_as_bytes%0#0" - ], + "error": "check self.circulating_units exists", + "op": "assert // check self.circulating_units exists", "stack_out": [ "val_as_bytes%0#0", - "to_encode%0#0" + "val_as_bytes%1#0", + "maybe_value%2#0" ] }, "4244": { - "op": "itob", - "defined_out": [ - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ], - "stack_out": [ - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ] - }, - "4245": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", + "maybe_value%2#0", "0" ] }, - "4246": { + "4245": { "op": "bytec 12 // \"unit_value\"", + "defined_out": [ + "\"unit_value\"", + "0", + "maybe_value%2#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", + "maybe_value%2#0", "0", "\"unit_value\"" ] }, - "4248": { + "4247": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", + "maybe_value%2#0", "maybe_value%3#0", "val_as_bytes%0#0", "val_as_bytes%1#0" @@ -21153,19 +21152,34 @@ "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", + "maybe_value%2#0", "maybe_value%3#0", "maybe_exists%3#0" ] }, - "4249": { + "4248": { "error": "check self.unit_value exists", "op": "assert // check self.unit_value exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", + "maybe_value%2#0", "maybe_value%3#0" ] }, + "4249": { + "op": "*", + "defined_out": [ + "to_encode%0#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "to_encode%0#0" + ] + }, "4250": { "op": "itob", "defined_out": [ @@ -21189,20 +21203,13 @@ ] }, "4252": { - "op": "bytec 13 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0" - ], + "op": "bytec 12 // \"unit_value\"", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", "0", - "\"day_count_convention\"" + "\"unit_value\"" ] }, "4254": { @@ -21223,8 +21230,8 @@ ] }, "4255": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", + "error": "check self.unit_value exists", + "op": "assert // check self.unit_value exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", @@ -21248,223 +21255,237 @@ ] }, "4257": { - "op": "extract 7 1", - "defined_out": [ - "tmp%0#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0" - ], - "stack_out": [ - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "tmp%0#0" - ] - }, - "4260": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "tmp%0#0", + "val_as_bytes%3#0", "0" ] }, - "4261": { - "op": "bytec 26 // \"interest_rate\"", + "4258": { + "op": "bytec 13 // \"day_count_convention\"", "defined_out": [ - "\"interest_rate\"", + "\"day_count_convention\"", "0", - "tmp%0#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "tmp%0#0", + "val_as_bytes%3#0", "0", - "\"interest_rate\"" + "\"day_count_convention\"" ] }, - "4263": { + "4260": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%5#0", "maybe_value%5#0", - "tmp%0#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "tmp%0#0", + "val_as_bytes%3#0", "maybe_value%5#0", "maybe_exists%5#0" ] }, - "4264": { - "error": "check self.interest_rate exists", - "op": "assert // check self.interest_rate exists", + "4261": { + "error": "check self.day_count_convention exists", + "op": "assert // check self.day_count_convention exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "tmp%0#0", + "val_as_bytes%3#0", "maybe_value%5#0" ] }, - "4265": { + "4262": { "op": "itob", "defined_out": [ - "tmp%0#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "val_as_bytes%4#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "tmp%0#0", + "val_as_bytes%3#0", "val_as_bytes%4#0" ] }, - "4266": { - "op": "extract 6 2", + "4263": { + "op": "extract 7 1", "defined_out": [ "tmp%0#0", - "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "tmp%0#0", - "tmp%1#0" + "val_as_bytes%3#0", + "tmp%0#0" ] }, - "4269": { + "4266": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "tmp%1#0", "0" ] }, - "4270": { - "op": "bytec 14 // \"total_units\"", + "4267": { + "op": "bytec 26 // \"interest_rate\"", "defined_out": [ - "\"total_units\"", + "\"interest_rate\"", "0", "tmp%0#0", - "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "tmp%1#0", "0", - "\"total_units\"" + "\"interest_rate\"" ] }, - "4272": { + "4269": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%6#0", "maybe_value%6#0", "tmp%0#0", - "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "tmp%1#0", "maybe_value%6#0", "maybe_exists%6#0" ] }, - "4273": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", + "4270": { + "error": "check self.interest_rate exists", + "op": "assert // check self.interest_rate exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "tmp%1#0", "maybe_value%6#0" ] }, - "4274": { + "4271": { "op": "itob", "defined_out": [ "tmp%0#0", - "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "val_as_bytes%5#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "tmp%1#0", "val_as_bytes%5#0" ] }, - "4275": { - "op": "intc_0 // 0", + "4272": { + "op": "extract 6 2", + "defined_out": [ + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "tmp%1#0", - "val_as_bytes%5#0", - "0" + "tmp%1#0" ] }, - "4276": { - "op": "bytec_2 // \"circulating_units\"", + "4275": { + "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", + "0" + ] + }, + "4276": { + "op": "bytec 14 // \"total_units\"", + "defined_out": [ + "\"total_units\"", "0", - "\"circulating_units\"" + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%0#0", + "tmp%1#0", + "0", + "\"total_units\"" ] }, - "4277": { + "4278": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%7#0", @@ -21474,33 +21495,33 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0" + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "maybe_value%7#0", "maybe_exists%7#0" ] }, - "4278": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", + "4279": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "maybe_value%7#0" ] }, - "4279": { + "4280": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -21508,55 +21529,44 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0" ] }, - "4280": { + "4281": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "0" ] }, - "4281": { - "op": "bytec 10 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "tmp%0#0", - "tmp%1#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%5#0", - "val_as_bytes%6#0" - ], + "4282": { + "op": "bytec_2 // \"circulating_units\"", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "0", - "\"primary_distribution_opening_date\"" + "\"circulating_units\"" ] }, "4283": { @@ -21569,31 +21579,31 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "maybe_value%8#0", "maybe_exists%8#0" ] }, "4284": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", + "error": "check self.circulating_units exists", + "op": "assert // check self.circulating_units exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "maybe_value%8#0" ] @@ -21606,7 +21616,7 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0" ], @@ -21614,9 +21624,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0" ] @@ -21627,25 +21637,25 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "0" ] }, "4287": { - "op": "bytec 20 // \"primary_distribution_closure_date\"", + "op": "bytec 10 // \"primary_distribution_opening_date\"", "defined_out": [ - "\"primary_distribution_closure_date\"", + "\"primary_distribution_opening_date\"", "0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0" ], @@ -21653,13 +21663,13 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "0", - "\"primary_distribution_closure_date\"" + "\"primary_distribution_opening_date\"" ] }, "4289": { @@ -21672,7 +21682,7 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0" ], @@ -21680,9 +21690,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "maybe_value%9#0", @@ -21690,15 +21700,15 @@ ] }, "4290": { - "error": "check self.primary_distribution_closure_date exists", - "op": "assert // check self.primary_distribution_closure_date exists", + "error": "check self.primary_distribution_opening_date exists", + "op": "assert // check self.primary_distribution_opening_date exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "maybe_value%9#0" @@ -21712,7 +21722,7 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0" @@ -21721,9 +21731,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0" @@ -21735,9 +21745,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21745,16 +21755,16 @@ ] }, "4293": { - "op": "bytec 5 // \"issuance_date\"", + "op": "bytec 20 // \"primary_distribution_closure_date\"", "defined_out": [ - "\"issuance_date\"", + "\"primary_distribution_closure_date\"", "0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0" @@ -21763,14 +21773,14 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "0", - "\"issuance_date\"" + "\"primary_distribution_closure_date\"" ] }, "4295": { @@ -21783,7 +21793,7 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0" @@ -21792,9 +21802,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21803,15 +21813,15 @@ ] }, "4296": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", + "error": "check self.primary_distribution_closure_date exists", + "op": "assert // check self.primary_distribution_closure_date exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21826,7 +21836,7 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21836,9 +21846,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21851,9 +21861,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21862,16 +21872,16 @@ ] }, "4299": { - "op": "bytec 6 // \"maturity_date\"", + "op": "bytec 5 // \"issuance_date\"", "defined_out": [ - "\"maturity_date\"", + "\"issuance_date\"", "0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21881,15 +21891,15 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "0", - "\"maturity_date\"" + "\"issuance_date\"" ] }, "4301": { @@ -21902,7 +21912,7 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21912,9 +21922,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21924,15 +21934,15 @@ ] }, "4302": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", + "error": "check self.issuance_date exists", + "op": "assert // check self.issuance_date exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21949,7 +21959,7 @@ "val_as_bytes%1#0", "val_as_bytes%10#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21959,9 +21969,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21975,9 +21985,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21987,9 +21997,9 @@ ] }, "4305": { - "op": "bytec 21 // \"suspended\"", + "op": "bytec 7 // \"maturity_date\"", "defined_out": [ - "\"suspended\"", + "\"maturity_date\"", "0", "tmp%0#0", "tmp%1#0", @@ -21997,7 +22007,7 @@ "val_as_bytes%1#0", "val_as_bytes%10#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -22007,16 +22017,16 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", "0", - "\"suspended\"" + "\"maturity_date\"" ] }, "4307": { @@ -22030,7 +22040,7 @@ "val_as_bytes%1#0", "val_as_bytes%10#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -22040,9 +22050,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -22053,15 +22063,15 @@ ] }, "4308": { - "error": "check self.suspended exists", - "op": "assert // check self.suspended exists", + "error": "check self.maturity_date exists", + "op": "assert // check self.maturity_date exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -22071,17 +22081,156 @@ ] }, "4309": { - "op": "bytec 7 // 0x00", + "op": "itob", + "defined_out": [ + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0" + ] + }, + "4310": { + "op": "intc_0 // 0", + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "0" + ] + }, + "4311": { + "op": "bytec 21 // \"suspended\"", + "defined_out": [ + "\"suspended\"", + "0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "0", + "\"suspended\"" + ] + }, + "4313": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%13#0", + "maybe_value%13#0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "maybe_value%13#0", + "maybe_exists%13#0" + ] + }, + "4314": { + "error": "check self.suspended exists", + "op": "assert // check self.suspended exists", + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "maybe_value%13#0" + ] + }, + "4315": { + "op": "bytec 8 // 0x00", "defined_out": [ "0x00", - "maybe_value%12#0", + "maybe_value%13#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -22091,57 +22240,60 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", - "maybe_value%12#0", + "val_as_bytes%11#0", + "maybe_value%13#0", "0x00" ] }, - "4311": { + "4317": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", - "maybe_value%12#0", + "val_as_bytes%11#0", + "maybe_value%13#0", "0x00", "0" ] }, - "4312": { + "4318": { "op": "uncover 2", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "0x00", "0", - "maybe_value%12#0" + "maybe_value%13#0" ] }, - "4314": { + "4320": { "op": "setbit", "defined_out": [ "encoded_bool%0#0", @@ -22150,8 +22302,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -22161,36 +22314,38 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0" ] }, - "4315": { + "4321": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "0" ] }, - "4316": { + "4322": { "op": "bytec 22 // \"defaulted\"", "defined_out": [ "\"defaulted\"", @@ -22201,8 +22356,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -22212,32 +22368,34 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "0", "\"defaulted\"" ] }, - "4318": { + "4324": { "op": "app_global_get_ex", "defined_out": [ "encoded_bool%0#0", - "maybe_exists%13#0", - "maybe_value%13#0", + "maybe_exists%14#0", + "maybe_value%14#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -22247,98 +22405,103 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", - "maybe_value%13#0", - "maybe_exists%13#0" + "maybe_value%14#0", + "maybe_exists%14#0" ] }, - "4319": { + "4325": { "error": "check self.defaulted exists", "op": "assert // check self.defaulted exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", - "maybe_value%13#0" + "maybe_value%14#0" ] }, - "4320": { - "op": "bytec 7 // 0x00", + "4326": { + "op": "bytec 8 // 0x00", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", - "maybe_value%13#0", + "maybe_value%14#0", "0x00" ] }, - "4322": { + "4328": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", - "maybe_value%13#0", + "maybe_value%14#0", "0x00", "0" ] }, - "4323": { + "4329": { "op": "uncover 2", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "0x00", "0", - "maybe_value%13#0" + "maybe_value%14#0" ] }, - "4325": { + "4331": { "op": "setbit", "defined_out": [ "encoded_bool%0#0", @@ -22348,8 +22511,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -22359,40 +22523,42 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0" ] }, - "4326": { - "op": "uncover 12" + "4332": { + "op": "uncover 13" }, - "4328": { - "op": "uncover 12", + "4334": { + "op": "uncover 13", "stack_out": [ "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0" ] }, - "4330": { + "4336": { "op": "concat", "defined_out": [ "encoded_bool%0#0", @@ -22401,8 +22567,9 @@ "tmp%0#0", "tmp%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -22410,37 +22577,39 @@ ], "stack_out": [ "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%2#0" ] }, - "4331": { - "op": "uncover 11", + "4337": { + "op": "uncover 12", "stack_out": [ + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%2#0", "val_as_bytes%2#0" ] }, - "4333": { + "4339": { "op": "concat", "defined_out": [ "encoded_bool%0#0", @@ -22449,130 +22618,140 @@ "tmp%0#0", "tmp%1#0", "val_as_bytes%10#0", - "val_as_bytes%5#0", + "val_as_bytes%11#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0" ], "stack_out": [ + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%3#0" ] }, - "4334": { - "op": "uncover 10", + "4340": { + "op": "uncover 11", "stack_out": [ + "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%3#0", - "tmp%0#0" + "val_as_bytes%3#0" ] }, - "4336": { + "4342": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%4#0", + "tmp%0#0", "tmp%1#0", "val_as_bytes%10#0", - "val_as_bytes%5#0", + "val_as_bytes%11#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0" ], "stack_out": [ + "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%4#0" ] }, - "4337": { - "op": "uncover 9", + "4343": { + "op": "uncover 10", "stack_out": [ - "val_as_bytes%5#0", + "tmp%1#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%4#0", - "tmp%1#0" + "tmp%0#0" ] }, - "4339": { + "4345": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%5#0", + "tmp%1#0", "val_as_bytes%10#0", - "val_as_bytes%5#0", + "val_as_bytes%11#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0" ], "stack_out": [ - "val_as_bytes%5#0", + "tmp%1#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%5#0" ] }, - "4340": { - "op": "uncover 8", + "4346": { + "op": "uncover 9", "stack_out": [ "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%5#0", - "val_as_bytes%5#0" + "tmp%1#0" ] }, - "4342": { + "4348": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%6#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -22584,31 +22763,34 @@ "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%6#0" ] }, - "4343": { - "op": "uncover 7", + "4349": { + "op": "uncover 8", "stack_out": [ "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%6#0", "val_as_bytes%6#0" ] }, - "4345": { + "4351": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%7#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0" @@ -22618,30 +22800,33 @@ "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%7#0" ] }, - "4346": { - "op": "uncover 6", + "4352": { + "op": "uncover 7", "stack_out": [ "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%7#0", "val_as_bytes%7#0" ] }, - "4348": { + "4354": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%8#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%8#0", "val_as_bytes%9#0" ], @@ -22649,161 +22834,193 @@ "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%8#0" ] }, - "4349": { - "op": "uncover 5", + "4355": { + "op": "uncover 6", "stack_out": [ "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%8#0", "val_as_bytes%8#0" ] }, - "4351": { + "4357": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%9#0" ], "stack_out": [ "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%9#0" ] }, - "4352": { - "op": "uncover 4", + "4358": { + "op": "uncover 5", "stack_out": [ "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%9#0", "val_as_bytes%9#0" ] }, - "4354": { + "4360": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%10#0", - "val_as_bytes%10#0" + "val_as_bytes%10#0", + "val_as_bytes%11#0" ], "stack_out": [ "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%10#0" ] }, - "4355": { - "op": "uncover 3", + "4361": { + "op": "uncover 4", "stack_out": [ + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%10#0", "val_as_bytes%10#0" ] }, - "4357": { + "4363": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", - "encoded_tuple_buffer%11#0" + "encoded_tuple_buffer%11#0", + "val_as_bytes%11#0" ], "stack_out": [ + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%11#0" ] }, - "4358": { - "op": "uncover 2", + "4364": { + "op": "uncover 3", "stack_out": [ + "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%11#0", - "encoded_bool%0#0" + "val_as_bytes%11#0" ] }, - "4360": { + "4366": { "op": "concat", "defined_out": [ + "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%12#0" ], "stack_out": [ + "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%12#0" ] }, - "4361": { - "op": "swap", + "4367": { + "op": "uncover 2", "stack_out": [ + "encoded_bool%1#0", "encoded_tuple_buffer%12#0", + "encoded_bool%0#0" + ] + }, + "4369": { + "op": "concat", + "defined_out": [ + "encoded_bool%1#0", + "encoded_tuple_buffer%13#0" + ], + "stack_out": [ + "encoded_bool%1#0", + "encoded_tuple_buffer%13#0" + ] + }, + "4370": { + "op": "swap", + "stack_out": [ + "encoded_tuple_buffer%13#0", "encoded_bool%1#0" ] }, - "4362": { + "4371": { "op": "intc_0 // 0", "stack_out": [ - "encoded_tuple_buffer%12#0", + "encoded_tuple_buffer%13#0", "encoded_bool%1#0", "0" ] }, - "4363": { + "4372": { "op": "getbit", "defined_out": [ - "encoded_tuple_buffer%12#0", + "encoded_tuple_buffer%13#0", "is_true%0#0" ], "stack_out": [ - "encoded_tuple_buffer%12#0", + "encoded_tuple_buffer%13#0", "is_true%0#0" ] }, - "4364": { - "op": "pushint 601 // 601" + "4373": { + "op": "pushint 665 // 665" }, - "4367": { + "4376": { "op": "swap", "defined_out": [ - "601", - "encoded_tuple_buffer%12#0", + "665", + "encoded_tuple_buffer%13#0", "is_true%0#0" ], "stack_out": [ - "encoded_tuple_buffer%12#0", - "601", + "encoded_tuple_buffer%13#0", + "665", "is_true%0#0" ] }, - "4368": { + "4377": { "op": "setbit", "defined_out": [ - "encoded_tuple_buffer%13#0" + "encoded_tuple_buffer%14#0" ], "stack_out": [ - "encoded_tuple_buffer%13#0" + "encoded_tuple_buffer%14#0" ] }, - "4369": { + "4378": { "retsub": true, "op": "retsub" }, - "4370": { + "4379": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_account_info", "params": { "holding_address#0": "bytes" @@ -22812,7 +23029,7 @@ "stack_in": [], "op": "proto 1 1" }, - "4373": { + "4382": { "op": "bytec_1 // 0x52333023", "defined_out": [ "0x52333023" @@ -22821,7 +23038,7 @@ "0x52333023" ] }, - "4374": { + "4383": { "op": "frame_dig -1", "defined_out": [ "0x52333023", @@ -22832,7 +23049,7 @@ "holding_address#0 (copy)" ] }, - "4376": { + "4385": { "op": "concat", "defined_out": [ "tmp%0#1" @@ -22841,7 +23058,7 @@ "tmp%0#1" ] }, - "4377": { + "4386": { "op": "dup", "defined_out": [ "tmp%0#1", @@ -22852,7 +23069,7 @@ "tmp%0#1 (copy)" ] }, - "4378": { + "4387": { "op": "box_len", "defined_out": [ "maybe_exists%0#0", @@ -22865,21 +23082,21 @@ "maybe_exists%0#0" ] }, - "4379": { + "4388": { "op": "bury 1", "stack_out": [ "tmp%0#1", "maybe_exists%0#0" ] }, - "4381": { + "4390": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ "tmp%0#1" ] }, - "4382": { + "4391": { "op": "box_get", "defined_out": [ "maybe_exists%0#0", @@ -22890,31 +23107,31 @@ "maybe_exists%0#0" ] }, - "4383": { + "4392": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ "maybe_value%0#0" ] }, - "4384": { + "4393": { "retsub": true, "op": "retsub" }, - "4385": { + "4394": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_time_events", "params": {}, "block": "get_time_events", "stack_in": [], "op": "proto 0 1" }, - "4388": { + "4397": { "op": "bytec 32 // 0x0000" }, - "4390": { + "4399": { "op": "intc_0 // 0" }, - "4391": { + "4400": { "op": "bytec_3 // \"status\"", "defined_out": [ "\"status\"", @@ -22927,7 +23144,7 @@ "\"status\"" ] }, - "4392": { + "4401": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -22940,7 +23157,7 @@ "maybe_exists%0#0" ] }, - "4393": { + "4402": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -22948,7 +23165,7 @@ "maybe_value%0#0" ] }, - "4394": { + "4403": { "op": "intc_3 // 100", "defined_out": [ "100", @@ -22961,7 +23178,7 @@ "100" ] }, - "4395": { + "4404": { "op": "==", "defined_out": [ "time_events#0", @@ -22972,29 +23189,29 @@ "tmp%0#1" ] }, - "4396": { + "4405": { "op": "bz get_time_events_after_if_else@2", "stack_out": [ "time_events#0" ] }, - "4399": { + "4408": { "op": "bytec 11 // 0x74696d654576656e7473" }, - "4401": { + "4410": { "op": "box_get" }, - "4402": { + "4411": { "op": "swap" }, - "4403": { + "4412": { "op": "frame_bury 0" }, - "4405": { + "4414": { "error": "check self.time_events exists", "op": "assert // check self.time_events exists" }, - "4406": { + "4415": { "block": "get_time_events_after_if_else@2", "stack_in": [ "time_events#0" @@ -23008,21 +23225,21 @@ "time_events#0" ] }, - "4408": { + "4417": { "op": "swap" }, - "4409": { + "4418": { "retsub": true, "op": "retsub" }, - "4410": { + "4419": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_secondary_market_schedule", "params": {}, "block": "get_secondary_market_schedule", "stack_in": [], "op": "proto 0 1" }, - "4413": { + "4422": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -23031,7 +23248,7 @@ "0" ] }, - "4414": { + "4423": { "op": "bytec 15 // \"secondary_market_opening_date\"", "defined_out": [ "\"secondary_market_opening_date\"", @@ -23042,7 +23259,7 @@ "\"secondary_market_opening_date\"" ] }, - "4416": { + "4425": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -23053,14 +23270,14 @@ "maybe_exists%0#0" ] }, - "4417": { + "4426": { "error": "check self.secondary_market_opening_date exists", "op": "assert // check self.secondary_market_opening_date exists", "stack_out": [ "maybe_value%0#0" ] }, - "4418": { + "4427": { "op": "itob", "defined_out": [ "val_as_bytes%0#0" @@ -23069,14 +23286,14 @@ "val_as_bytes%0#0" ] }, - "4419": { + "4428": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "0" ] }, - "4420": { + "4429": { "op": "bytec 16 // \"secondary_market_closure_date\"", "defined_out": [ "\"secondary_market_closure_date\"", @@ -23089,7 +23306,7 @@ "\"secondary_market_closure_date\"" ] }, - "4422": { + "4431": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -23102,7 +23319,7 @@ "maybe_exists%1#0" ] }, - "4423": { + "4432": { "error": "check self.secondary_market_closure_date exists", "op": "assert // check self.secondary_market_closure_date exists", "stack_out": [ @@ -23110,7 +23327,7 @@ "maybe_value%1#0" ] }, - "4424": { + "4433": { "op": "itob", "defined_out": [ "val_as_bytes%0#0", @@ -23121,7 +23338,7 @@ "val_as_bytes%1#0" ] }, - "4425": { + "4434": { "op": "concat", "defined_out": [ "result%1#0" @@ -23130,7 +23347,7 @@ "result%1#0" ] }, - "4426": { + "4435": { "op": "pushbytes 0x0002", "defined_out": [ "0x0002", @@ -23141,14 +23358,14 @@ "0x0002" ] }, - "4430": { + "4439": { "op": "swap", "stack_out": [ "0x0002", "result%1#0" ] }, - "4431": { + "4440": { "op": "concat", "defined_out": [ "array_data%0#0" @@ -23157,18 +23374,18 @@ "array_data%0#0" ] }, - "4432": { + "4441": { "retsub": true, "op": "retsub" }, - "4433": { + "4442": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_metadata", "params": {}, "block": "get_asset_metadata", "stack_in": [], "op": "proto 0 1" }, - "4436": { + "4445": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -23177,7 +23394,7 @@ "0" ] }, - "4437": { + "4446": { "op": "bytec 25 // \"metadata\"", "defined_out": [ "\"metadata\"", @@ -23188,7 +23405,7 @@ "\"metadata\"" ] }, - "4439": { + "4448": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -23199,14 +23416,14 @@ "maybe_exists%0#0" ] }, - "4440": { + "4449": { "error": "check self.metadata exists", "op": "assert // check self.metadata exists", "stack_out": [ "maybe_value%0#0" ] }, - "4441": { + "4450": { "op": "dup", "defined_out": [ "maybe_value%0#0", @@ -23217,7 +23434,7 @@ "maybe_value%0#0 (copy)" ] }, - "4442": { + "4451": { "op": "len", "defined_out": [ "length%0#0", @@ -23228,7 +23445,7 @@ "length%0#0" ] }, - "4443": { + "4452": { "op": "itob", "defined_out": [ "as_bytes%0#0", @@ -23239,7 +23456,7 @@ "as_bytes%0#0" ] }, - "4444": { + "4453": { "op": "extract 6 2", "defined_out": [ "length_uint16%0#0", @@ -23250,14 +23467,14 @@ "length_uint16%0#0" ] }, - "4447": { + "4456": { "op": "swap", "stack_out": [ "length_uint16%0#0", "maybe_value%0#0" ] }, - "4448": { + "4457": { "op": "concat", "defined_out": [ "encoded_value%0#0" @@ -23266,26 +23483,26 @@ "encoded_value%0#0" ] }, - "4449": { + "4458": { "retsub": true, "op": "retsub" }, - "4450": { + "4459": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.asset_update", "params": {}, "block": "asset_update", "stack_in": [], "op": "proto 0 0" }, - "4453": { + "4462": { "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger", "op": "callsub assert_caller_is_arranger" }, - "4456": { + "4465": { "retsub": true, "op": "retsub" }, - "4457": { + "4466": { "subroutine": "_puya_lib.util.ensure_budget", "params": { "required_budget#0": "uint64", @@ -23295,7 +23512,7 @@ "stack_in": [], "op": "proto 2 0" }, - "4460": { + "4469": { "op": "frame_dig -2", "defined_out": [ "required_budget#0 (copy)" @@ -23304,7 +23521,7 @@ "required_budget#0 (copy)" ] }, - "4462": { + "4471": { "op": "pushint 10 // 10", "defined_out": [ "10", @@ -23315,7 +23532,7 @@ "10" ] }, - "4464": { + "4473": { "op": "+", "defined_out": [ "required_budget_with_buffer#0" @@ -23324,14 +23541,14 @@ "required_budget_with_buffer#0" ] }, - "4465": { + "4474": { "block": "ensure_budget_while_top@1", "stack_in": [ "required_budget_with_buffer#0" ], "op": "frame_dig 0" }, - "4467": { + "4476": { "op": "global OpcodeBudget", "defined_out": [ "required_budget_with_buffer#0", @@ -23343,7 +23560,7 @@ "tmp%0#0" ] }, - "4469": { + "4478": { "op": ">", "defined_out": [ "required_budget_with_buffer#0", @@ -23354,56 +23571,56 @@ "tmp%1#0" ] }, - "4470": { + "4479": { "op": "bz ensure_budget_after_while@7", "stack_out": [ "required_budget_with_buffer#0" ] }, - "4473": { + "4482": { "op": "itxn_begin" }, - "4474": { + "4483": { "op": "pushint 6 // appl" }, - "4476": { + "4485": { "op": "itxn_field TypeEnum" }, - "4478": { + "4487": { "op": "pushint 5 // DeleteApplication" }, - "4480": { + "4489": { "op": "itxn_field OnCompletion" }, - "4482": { + "4491": { "op": "bytec 34 // 0x068101" }, - "4484": { + "4493": { "op": "itxn_field ApprovalProgram" }, - "4486": { + "4495": { "op": "bytec 34 // 0x068101" }, - "4488": { + "4497": { "op": "itxn_field ClearStateProgram" }, - "4490": { + "4499": { "op": "frame_dig -1" }, - "4492": { + "4501": { "op": "switch ensure_budget_switch_case_0@3 ensure_budget_switch_case_1@4" }, - "4498": { + "4507": { "block": "ensure_budget_switch_case_next@6", "stack_in": [ "required_budget_with_buffer#0" ], "op": "itxn_submit" }, - "4499": { + "4508": { "op": "b ensure_budget_while_top@1" }, - "4502": { + "4511": { "block": "ensure_budget_switch_case_1@4", "stack_in": [ "required_budget_with_buffer#0" @@ -23417,16 +23634,16 @@ "tmp%2#0" ] }, - "4504": { + "4513": { "op": "itxn_field Fee", "stack_out": [ "required_budget_with_buffer#0" ] }, - "4506": { + "4515": { "op": "b ensure_budget_switch_case_next@6" }, - "4509": { + "4518": { "block": "ensure_budget_switch_case_0@3", "stack_in": [ "required_budget_with_buffer#0" @@ -23440,16 +23657,16 @@ "0" ] }, - "4510": { + "4519": { "op": "itxn_field Fee", "stack_out": [ "required_budget_with_buffer#0" ] }, - "4512": { + "4521": { "op": "b ensure_budget_switch_case_next@6" }, - "4515": { + "4524": { "block": "ensure_budget_after_while@7", "stack_in": [ "required_budget_with_buffer#0" diff --git a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.teal b/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.teal index 3cb37d6..bde86da 100644 --- a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.teal +++ b/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.approval.teal @@ -4,7 +4,7 @@ // smart_contracts.fixed_coupon_bond.contract.FixedCouponBond.__algopy_entrypoint_with_init() -> uint64: main: intcblock 0 1 8 100 448 255 86400 200 - bytecblock 0x151f7c75 0x52333023 "circulating_units" "status" "total_coupons" "issuance_date" "maturity_date" 0x00 0x0000000000000000 "denomination_asset_id" "primary_distribution_opening_date" 0x74696d654576656e7473 "unit_value" "day_count_convention" "total_units" "secondary_market_opening_date" "secondary_market_closure_date" 0x636f75706f6e5261746573 0x52323023 "settlement_asset_id" "primary_distribution_closure_date" "suspended" "defaulted" "due_coupons_watermark" "paid_coupon_units" "metadata" "interest_rate" 0x52373023 0x52363023 0x52353023 0x52343023 0x0012 0x0000 0x52383023 0x068101 + bytecblock 0x151f7c75 0x52333023 "circulating_units" "status" "total_coupons" "issuance_date" "settlement_asset_id" "maturity_date" 0x00 0x0000000000000000 "primary_distribution_opening_date" 0x74696d654576656e7473 "unit_value" "day_count_convention" "total_units" "secondary_market_opening_date" "secondary_market_closure_date" 0x636f75706f6e5261746573 0x52323023 "denomination_asset_id" "primary_distribution_closure_date" "suspended" "defaulted" "due_coupons_watermark" "paid_coupon_units" "metadata" "interest_rate" 0x52373023 0x52363023 0x52353023 0x52343023 0x0012 0x0000 0x52383023 0x068101 txn ApplicationID bnz main_after_if_else@2 // smart_contracts/base_d_asa/contract.py:41-42 @@ -16,12 +16,12 @@ main: // smart_contracts/base_d_asa/contract.py:59-60 // # Asset Configuration // self.denomination_asset_id = UInt64() - bytec 9 // "denomination_asset_id" + bytec 19 // "denomination_asset_id" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:61 // self.settlement_asset_id = UInt64() - bytec 19 // "settlement_asset_id" + bytec 6 // "settlement_asset_id" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:62 @@ -89,7 +89,7 @@ main: app_global_put // smart_contracts/base_d_asa/contract.py:87 // self.maturity_date = UInt64() - bytec 6 // "maturity_date" + bytec 7 // "maturity_date" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:89-90 @@ -156,7 +156,7 @@ main_after_if_else@2: // ): txn NumAppArgs bz main_bare_routing@28 - pushbytess 0x4fd6a3cc 0x8cf14b51 0x9c76b6a3 0x44363d49 0x53bef045 0x67db4f20 0xf6a96c8d 0x63f99589 0xd3a4d6ab 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x301dd919 0xed02759f 0xfad2173e 0x08efea35 0xddcec07b // method "asset_transfer(address,address,uint64)uint64", method "pay_coupon(address,byte[])(uint64,uint64,byte[])", method "pay_principal(address,byte[])(uint64,uint64,byte[])", method "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", method "get_coupon_rates()uint16[]", method "get_payment_amount(address)(uint64,uint64)", method "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", method "asset_create(address,byte[])void", method "asset_config(uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", method "set_secondary_time_events(uint64[])(uint64,uint64)", method "assign_role(address,uint8,byte[])uint64", method "revoke_role(address,uint8)uint64", method "open_account(address,address)uint64", method "close_account(address)(uint64,uint64)", method "primary_distribution(address,uint64)uint64", method "set_asset_suspension(bool)uint64", method "set_account_suspension(address,bool)uint64", method "set_default_status(bool)void", method "get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", method "get_account_info(address)(address,uint64,uint64,uint64,bool)", method "get_time_events()uint64[]", method "get_secondary_market_schedule()uint64[]", method "get_asset_metadata()byte[]" + pushbytess 0x4fd6a3cc 0x8cf14b51 0x9c76b6a3 0x44363d49 0x53bef045 0x67db4f20 0xf6a96c8d 0x63f99589 0xd3a4d6ab 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x80bfcdd1 0xed02759f 0xfad2173e 0x08efea35 0xddcec07b // method "asset_transfer(address,address,uint64)uint64", method "pay_coupon(address,byte[])(uint64,uint64,byte[])", method "pay_principal(address,byte[])(uint64,uint64,byte[])", method "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", method "get_coupon_rates()uint16[]", method "get_payment_amount(address)(uint64,uint64)", method "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", method "asset_create(address,byte[])void", method "asset_config(uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", method "set_secondary_time_events(uint64[])(uint64,uint64)", method "assign_role(address,uint8,byte[])uint64", method "revoke_role(address,uint8)uint64", method "open_account(address,address)uint64", method "close_account(address)(uint64,uint64)", method "primary_distribution(address,uint64)uint64", method "set_asset_suspension(bool)uint64", method "set_account_suspension(address,bool)uint64", method "set_default_status(bool)void", method "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", method "get_account_info(address)(address,uint64,uint64,uint64,bool)", method "get_time_events()uint64[]", method "get_secondary_market_schedule()uint64[]", method "get_asset_metadata()byte[]" txna ApplicationArgs 0 match main_asset_transfer_route@5 main_pay_coupon_route@6 main_pay_principal_route@7 main_get_account_units_current_value_route@8 main_get_coupon_rates_route@9 main_get_payment_amount_route@10 main_get_coupons_status_route@11 main_asset_create_route@12 main_asset_config_route@13 main_set_secondary_time_events_route@14 main_assign_role_route@15 main_revoke_role_route@16 main_open_account_route@17 main_close_account_route@18 main_primary_distribution_route@19 main_set_asset_suspension_route@20 main_set_account_suspension_route@21 main_set_default_status_route@22 main_get_asset_info_route@23 main_get_account_info_route@24 main_get_time_events_route@25 main_get_secondary_market_schedule_route@26 main_get_asset_metadata_route@27 @@ -175,7 +175,7 @@ main_after_if_else@30: return main_get_asset_metadata_route@27: - // smart_contracts/base_d_asa/contract.py:954 + // smart_contracts/base_d_asa/contract.py:959 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -191,7 +191,7 @@ main_get_asset_metadata_route@27: return main_get_secondary_market_schedule_route@26: - // smart_contracts/base_d_asa/contract.py:947 + // smart_contracts/base_d_asa/contract.py:946 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -207,7 +207,7 @@ main_get_secondary_market_schedule_route@26: return main_get_time_events_route@25: - // smart_contracts/base_d_asa/contract.py:934 + // smart_contracts/base_d_asa/contract.py:933 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -223,7 +223,7 @@ main_get_time_events_route@25: return main_get_account_info_route@24: - // smart_contracts/base_d_asa/contract.py:917 + // smart_contracts/base_d_asa/contract.py:916 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -241,7 +241,7 @@ main_get_account_info_route@24: // ), // ): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:917 + // smart_contracts/base_d_asa/contract.py:916 // @arc4.abimethod(readonly=True) callsub get_account_info bytec_0 // 0x151f7c75 @@ -252,7 +252,7 @@ main_get_account_info_route@24: return main_get_asset_info_route@23: - // smart_contracts/base_d_asa/contract.py:887 + // smart_contracts/base_d_asa/contract.py:885 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -268,7 +268,7 @@ main_get_asset_info_route@23: return main_set_default_status_route@22: - // smart_contracts/base_d_asa/contract.py:873 + // smart_contracts/base_d_asa/contract.py:871 // @arc4.abimethod txn OnCompletion ! @@ -286,14 +286,14 @@ main_set_default_status_route@22: // ), // ): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:873 + // smart_contracts/base_d_asa/contract.py:871 // @arc4.abimethod callsub set_default_status intc_1 // 1 return main_set_account_suspension_route@21: - // smart_contracts/base_d_asa/contract.py:850 + // smart_contracts/base_d_asa/contract.py:848 // @arc4.abimethod txn OnCompletion ! @@ -312,7 +312,7 @@ main_set_account_suspension_route@21: // ): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:850 + // smart_contracts/base_d_asa/contract.py:848 // @arc4.abimethod callsub set_account_suspension bytec_0 // 0x151f7c75 @@ -323,7 +323,7 @@ main_set_account_suspension_route@21: return main_set_asset_suspension_route@20: - // smart_contracts/base_d_asa/contract.py:832 + // smart_contracts/base_d_asa/contract.py:830 // @arc4.abimethod txn OnCompletion ! @@ -341,7 +341,7 @@ main_set_asset_suspension_route@20: // ), // ): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:832 + // smart_contracts/base_d_asa/contract.py:830 // @arc4.abimethod callsub set_asset_suspension bytec_0 // 0x151f7c75 @@ -352,7 +352,7 @@ main_set_asset_suspension_route@20: return main_primary_distribution_route@19: - // smart_contracts/base_d_asa/contract.py:790 + // smart_contracts/base_d_asa/contract.py:788 // @arc4.abimethod txn OnCompletion ! @@ -371,7 +371,7 @@ main_primary_distribution_route@19: // ): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:790 + // smart_contracts/base_d_asa/contract.py:788 // @arc4.abimethod callsub primary_distribution bytec_0 // 0x151f7c75 @@ -382,7 +382,7 @@ main_primary_distribution_route@19: return main_close_account_route@18: - // smart_contracts/base_d_asa/contract.py:760 + // smart_contracts/base_d_asa/contract.py:758 // @arc4.abimethod txn OnCompletion ! @@ -400,7 +400,7 @@ main_close_account_route@18: // ), // ): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:760 + // smart_contracts/base_d_asa/contract.py:758 // @arc4.abimethod callsub close_account bytec_0 // 0x151f7c75 @@ -411,7 +411,7 @@ main_close_account_route@18: return main_open_account_route@17: - // smart_contracts/base_d_asa/contract.py:725 + // smart_contracts/base_d_asa/contract.py:723 // @arc4.abimethod txn OnCompletion ! @@ -430,7 +430,7 @@ main_open_account_route@17: // ): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:725 + // smart_contracts/base_d_asa/contract.py:723 // @arc4.abimethod callsub open_account bytec_0 // 0x151f7c75 @@ -441,7 +441,7 @@ main_open_account_route@17: return main_revoke_role_route@16: - // smart_contracts/base_d_asa/contract.py:677 + // smart_contracts/base_d_asa/contract.py:675 // @arc4.abimethod txn OnCompletion ! @@ -460,7 +460,7 @@ main_revoke_role_route@16: // ): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:677 + // smart_contracts/base_d_asa/contract.py:675 // @arc4.abimethod callsub revoke_role bytec_0 // 0x151f7c75 @@ -471,7 +471,7 @@ main_revoke_role_route@16: return main_assign_role_route@15: - // smart_contracts/base_d_asa/contract.py:614 + // smart_contracts/base_d_asa/contract.py:612 // @arc4.abimethod txn OnCompletion ! @@ -491,7 +491,7 @@ main_assign_role_route@15: txna ApplicationArgs 1 txna ApplicationArgs 2 txna ApplicationArgs 3 - // smart_contracts/base_d_asa/contract.py:614 + // smart_contracts/base_d_asa/contract.py:612 // @arc4.abimethod callsub assign_role bytec_0 // 0x151f7c75 @@ -502,7 +502,7 @@ main_assign_role_route@15: return main_set_secondary_time_events_route@14: - // smart_contracts/base_d_asa/contract.py:558 + // smart_contracts/base_d_asa/contract.py:556 // @arc4.abimethod txn OnCompletion ! @@ -520,7 +520,7 @@ main_set_secondary_time_events_route@14: // ), // ): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:558 + // smart_contracts/base_d_asa/contract.py:556 // @arc4.abimethod callsub set_secondary_time_events bytec_0 // 0x151f7c75 @@ -531,7 +531,7 @@ main_set_secondary_time_events_route@14: return main_asset_config_route@13: - // smart_contracts/base_d_asa/contract.py:476 + // smart_contracts/base_d_asa/contract.py:474 // @arc4.abimethod txn OnCompletion ! @@ -557,14 +557,14 @@ main_asset_config_route@13: txna ApplicationArgs 7 txna ApplicationArgs 8 txna ApplicationArgs 9 - // smart_contracts/base_d_asa/contract.py:476 + // smart_contracts/base_d_asa/contract.py:474 // @arc4.abimethod callsub asset_config intc_1 // 1 return main_asset_create_route@12: - // smart_contracts/base_d_asa/contract.py:454 + // smart_contracts/base_d_asa/contract.py:452 // @arc4.abimethod(create="require") txn OnCompletion ! @@ -584,7 +584,7 @@ main_asset_create_route@12: // ): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:454 + // smart_contracts/base_d_asa/contract.py:452 // @arc4.abimethod(create="require") callsub asset_create intc_1 // 1 @@ -789,11 +789,11 @@ main_bare_routing@28: b main_after_if_else@30 main_asset_update@29: - // smart_contracts/base_d_asa/contract.py:466 + // smart_contracts/base_d_asa/contract.py:464 // @arc4.baremethod(allow_actions=["UpdateApplication"]) txn ApplicationID assert // can only call when not creating - // smart_contracts/base_d_asa/contract.py:466-467 + // smart_contracts/base_d_asa/contract.py:464-465 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def asset_update(self) -> None: callsub asset_update @@ -881,7 +881,7 @@ asset_transfer_bool_merge@6: // < self.secondary_market_closure_date // ), err.SECONDARY_MARKET_CLOSED assert // Secondary market is closed - // smart_contracts/base_d_asa/contract.py:369-371 + // smart_contracts/base_d_asa/contract.py:367-369 // # The reference implementation grants transfer right to D-ASA owners. Other implementations may relay on other // # roles, external Apps through C2C calls (e.g., an order book), or off-chain transfer agents. // assert Txn.sender == sender_holding_address.native, err.UNAUTHORIZED @@ -889,10 +889,10 @@ asset_transfer_bool_merge@6: frame_dig -3 == assert // Not authorized - // smart_contracts/base_d_asa/contract.py:372 + // smart_contracts/base_d_asa/contract.py:370 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:373 + // smart_contracts/base_d_asa/contract.py:371 // self.assert_is_not_suspended() callsub assert_is_not_suspended // smart_contracts/base_d_asa/contract.py:171 @@ -915,14 +915,14 @@ asset_transfer_bool_merge@6: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:376 + // smart_contracts/base_d_asa/contract.py:374 // assert not self.account[sender_holding_address].suspended.native, err.SUSPENDED dig 1 box_get assert // check self.account entry exists intc 4 // 448 getbit - bytec 7 // 0x00 + bytec 8 // 0x00 intc_0 // 0 uncover 2 setbit @@ -930,7 +930,7 @@ asset_transfer_bool_merge@6: getbit ! assert // Suspended operations - // smart_contracts/base_d_asa/contract.py:377-379 + // smart_contracts/base_d_asa/contract.py:375-377 // assert not self.account[ // receiver_holding_address // ].suspended.native, err.SUSPENDED @@ -939,7 +939,7 @@ asset_transfer_bool_merge@6: assert // check self.account entry exists intc 4 // 448 getbit - bytec 7 // 0x00 + bytec 8 // 0x00 intc_0 // 0 uncover 2 setbit @@ -947,7 +947,7 @@ asset_transfer_bool_merge@6: getbit ! assert // Suspended operations - // smart_contracts/base_d_asa/contract.py:381 + // smart_contracts/base_d_asa/contract.py:379 // units <= self.account[sender_holding_address].units.native dig 1 box_get @@ -956,19 +956,19 @@ asset_transfer_bool_merge@6: btoi frame_dig 5 >= - // smart_contracts/base_d_asa/contract.py:380-382 + // smart_contracts/base_d_asa/contract.py:378-380 // assert ( // units <= self.account[sender_holding_address].units.native // ), err.OVER_TRANSFER assert // Insufficient sender units to transfer - // smart_contracts/base_d_asa/contract.py:390 + // smart_contracts/base_d_asa/contract.py:388 // sender_unit_value = self.account[sender_holding_address].unit_value swap box_get assert // check self.account entry exists extract 40 8 // on error: Index access is out of bounds frame_bury 0 - // smart_contracts/base_d_asa/contract.py:391 + // smart_contracts/base_d_asa/contract.py:389 // if self.account[receiver_holding_address].units.native > 0: box_get assert // check self.account entry exists @@ -1046,7 +1046,7 @@ asset_transfer_after_if_else@17: uncover 2 callsub accrued_interest_amount frame_bury 3 - // smart_contracts/base_d_asa/contract.py:427 + // smart_contracts/base_d_asa/contract.py:425 // self.account[sender_holding_address].units.native - units dup box_get @@ -1055,17 +1055,17 @@ asset_transfer_after_if_else@17: btoi dig 2 - - // smart_contracts/base_d_asa/contract.py:426-428 + // smart_contracts/base_d_asa/contract.py:424-426 // self.account[sender_holding_address].units = arc4.UInt64( // self.account[sender_holding_address].units.native - units // ) itob - // smart_contracts/base_d_asa/contract.py:426 + // smart_contracts/base_d_asa/contract.py:424 // self.account[sender_holding_address].units = arc4.UInt64( dig 1 box_get assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:426-428 + // smart_contracts/base_d_asa/contract.py:424-426 // self.account[sender_holding_address].units = arc4.UInt64( // self.account[sender_holding_address].units.native - units // ) @@ -1074,7 +1074,7 @@ asset_transfer_after_if_else@17: dig 1 swap box_put - // smart_contracts/base_d_asa/contract.py:430 + // smart_contracts/base_d_asa/contract.py:428 // self.account[receiver_holding_address].units.native + units frame_dig 2 dup @@ -1084,47 +1084,47 @@ asset_transfer_after_if_else@17: btoi uncover 3 + - // smart_contracts/base_d_asa/contract.py:429-431 + // smart_contracts/base_d_asa/contract.py:427-429 // self.account[receiver_holding_address].units = arc4.UInt64( // self.account[receiver_holding_address].units.native + units // ) itob - // smart_contracts/base_d_asa/contract.py:429 + // smart_contracts/base_d_asa/contract.py:427 // self.account[receiver_holding_address].units = arc4.UInt64( dig 1 box_get assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:429-431 + // smart_contracts/base_d_asa/contract.py:427-429 // self.account[receiver_holding_address].units = arc4.UInt64( // self.account[receiver_holding_address].units.native + units // ) swap replace2 32 box_put - // smart_contracts/base_d_asa/contract.py:353 + // smart_contracts/base_d_asa/contract.py:351 // if self.account[holding_address].units.native == 0: box_get assert // check self.account entry exists extract 32 8 // on error: Index access is out of bounds btoi bnz asset_transfer_after_if_else@21 - // smart_contracts/base_d_asa/contract.py:354 + // smart_contracts/base_d_asa/contract.py:352 // self.account[holding_address].unit_value = arc4.UInt64() frame_dig 1 dup box_get assert // check self.account entry exists - bytec 8 // 0x0000000000000000 + bytec 9 // 0x0000000000000000 replace2 40 dig 1 swap box_put - // smart_contracts/base_d_asa/contract.py:355 + // smart_contracts/base_d_asa/contract.py:353 // self.account[holding_address].paid_coupons = arc4.UInt64() dup box_get assert // check self.account entry exists - bytec 8 // 0x0000000000000000 + bytec 9 // 0x0000000000000000 replace2 48 box_put @@ -1146,7 +1146,7 @@ asset_transfer_bool_false@14: b asset_transfer_bool_merge@15 asset_transfer_else_body@16: - // smart_contracts/base_d_asa/contract.py:396 + // smart_contracts/base_d_asa/contract.py:394 // self.account[receiver_holding_address].unit_value = sender_unit_value frame_dig 2 dup @@ -1157,19 +1157,19 @@ asset_transfer_else_body@16: dig 1 swap box_put - // smart_contracts/base_d_asa/contract.py:397-399 + // smart_contracts/base_d_asa/contract.py:395-397 // self.account[receiver_holding_address].paid_coupons = self.account[ // sender_holding_address // ].paid_coupons frame_dig 1 box_get assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:397 + // smart_contracts/base_d_asa/contract.py:395 // self.account[receiver_holding_address].paid_coupons = self.account[ dig 1 box_get assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:397-399 + // smart_contracts/base_d_asa/contract.py:395-397 // self.account[receiver_holding_address].paid_coupons = self.account[ // sender_holding_address // ].paid_coupons @@ -1240,7 +1240,7 @@ count_due_coupons: // smart_contracts/fixed_coupon_bond/contract.py:54 // if current_ts >= self.maturity_date: intc_0 // 0 - bytec 6 // "maturity_date" + bytec 7 // "maturity_date" app_global_get_ex assert // check self.maturity_date exists >= @@ -1510,7 +1510,7 @@ day_count_factor_after_if_else@3: swap frame_bury 1 bz day_count_factor_after_if_else@5 - // smart_contracts/base_d_asa/contract.py:349 + // smart_contracts/base_d_asa/contract.py:347 // return time_period // UInt64(cst.DAY_2_SEC) frame_dig 0 intc 6 // 86400 @@ -1622,13 +1622,13 @@ next_coupon_due_date_after_if_else@2: // smart_contracts.base_d_asa.contract.BaseDAsa.account_units_value(holding_address: bytes, units: uint64) -> uint64: account_units_value: - // smart_contracts/base_d_asa/contract.py:335-338 + // smart_contracts/base_d_asa/contract.py:333-336 // @subroutine // def account_units_value( // self, holding_address: arc4.Address, units: UInt64 // ) -> UInt64: proto 2 1 - // smart_contracts/base_d_asa/contract.py:339 + // smart_contracts/base_d_asa/contract.py:337 // return units * self.account[holding_address].unit_value.native bytec_1 // 0x52333023 frame_dig -2 @@ -1854,20 +1854,20 @@ is_payment_executable: assert // check self.account entry exists extract 0 32 // on error: Index access is out of bounds // smart_contracts/base_d_asa/contract.py:312 - // Asset(self.denomination_asset_id) + // Asset(self.settlement_asset_id) intc_0 // 0 - bytec 9 // "denomination_asset_id" + bytec 6 // "settlement_asset_id" app_global_get_ex - assert // check self.denomination_asset_id exists + assert // check self.settlement_asset_id exists // smart_contracts/base_d_asa/contract.py:311-313 // self.account[holding_address].payment_address.native.is_opted_in( - // Asset(self.denomination_asset_id) + // Asset(self.settlement_asset_id) // ) asset_holding_get AssetBalance bury 1 // smart_contracts/base_d_asa/contract.py:311-314 // self.account[holding_address].payment_address.native.is_opted_in( - // Asset(self.denomination_asset_id) + // Asset(self.settlement_asset_id) // ) // and not self.account[holding_address].suspended.native bz is_payment_executable_bool_false@3 @@ -1878,7 +1878,7 @@ is_payment_executable: assert // check self.account entry exists intc 4 // 448 getbit - bytec 7 // 0x00 + bytec 8 // 0x00 intc_0 // 0 uncover 2 setbit @@ -1891,7 +1891,7 @@ is_payment_executable_bool_merge@4: // smart_contracts/base_d_asa/contract.py:310-315 // return ( // self.account[holding_address].payment_address.native.is_opted_in( - // Asset(self.denomination_asset_id) + // Asset(self.settlement_asset_id) // ) // and not self.account[holding_address].suspended.native // ) @@ -1905,11 +1905,11 @@ is_payment_executable_bool_false@3: // smart_contracts.base_d_asa.contract.BaseDAsa.account_total_units_value(holding_address: bytes) -> uint64: account_total_units_value: - // smart_contracts/base_d_asa/contract.py:341-342 + // smart_contracts/base_d_asa/contract.py:339-340 // @subroutine // def account_total_units_value(self, holding_address: arc4.Address) -> UInt64: proto 1 1 - // smart_contracts/base_d_asa/contract.py:344 + // smart_contracts/base_d_asa/contract.py:342 // holding_address, self.account[holding_address].units.native bytec_1 // 0x52333023 frame_dig -1 @@ -1918,7 +1918,7 @@ account_total_units_value: assert // check self.account entry exists extract 32 8 // on error: Index access is out of bounds btoi - // smart_contracts/base_d_asa/contract.py:343-345 + // smart_contracts/base_d_asa/contract.py:341-343 // return self.account_units_value( // holding_address, self.account[holding_address].units.native // ) @@ -1966,33 +1966,23 @@ assert_enough_funds: // @subroutine // def assert_enough_funds(self, payment_amount: UInt64) -> None: proto 1 0 - // smart_contracts/base_d_asa/contract.py:321 - // Global.current_application_address - global CurrentApplicationAddress // smart_contracts/base_d_asa/contract.py:320 - // Asset(self.denomination_asset_id).balance( + // Asset(self.settlement_asset_id).balance(Global.current_application_address) + global CurrentApplicationAddress intc_0 // 0 - bytec 9 // "denomination_asset_id" + bytec 6 // "settlement_asset_id" app_global_get_ex - assert // check self.denomination_asset_id exists - // smart_contracts/base_d_asa/contract.py:320-322 - // Asset(self.denomination_asset_id).balance( - // Global.current_application_address - // ) + assert // check self.settlement_asset_id exists asset_holding_get AssetBalance assert // account opted into asset - // smart_contracts/base_d_asa/contract.py:320-323 - // Asset(self.denomination_asset_id).balance( - // Global.current_application_address - // ) + // smart_contracts/base_d_asa/contract.py:320-321 + // Asset(self.settlement_asset_id).balance(Global.current_application_address) // >= payment_amount frame_dig -1 >= - // smart_contracts/base_d_asa/contract.py:319-324 + // smart_contracts/base_d_asa/contract.py:319-322 // assert ( - // Asset(self.denomination_asset_id).balance( - // Global.current_application_address - // ) + // Asset(self.settlement_asset_id).balance(Global.current_application_address) // >= payment_amount // ), err.NOT_ENOUGH_FUNDS assert // Not enough funds for the payment @@ -2001,11 +1991,11 @@ assert_enough_funds: // smart_contracts.base_d_asa.contract.BaseDAsa.pay(receiver: bytes, amount: uint64) -> void: pay: - // smart_contracts/base_d_asa/contract.py:326-327 + // smart_contracts/base_d_asa/contract.py:324-325 // @subroutine // def pay(self, receiver: arc4.Address, amount: UInt64) -> None: proto 2 0 - // smart_contracts/base_d_asa/contract.py:328-333 + // smart_contracts/base_d_asa/contract.py:326-331 // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, // asset_receiver=receiver.native, @@ -2013,13 +2003,13 @@ pay: // fee=Global.min_txn_fee, // ).submit() itxn_begin - // smart_contracts/base_d_asa/contract.py:332 + // smart_contracts/base_d_asa/contract.py:330 // fee=Global.min_txn_fee, global MinTxnFee - // smart_contracts/base_d_asa/contract.py:329 + // smart_contracts/base_d_asa/contract.py:327 // xfer_asset=self.settlement_asset_id, intc_0 // 0 - bytec 19 // "settlement_asset_id" + bytec 6 // "settlement_asset_id" app_global_get_ex assert // check self.settlement_asset_id exists frame_dig -1 @@ -2027,12 +2017,12 @@ pay: frame_dig -2 itxn_field AssetReceiver itxn_field XferAsset - // smart_contracts/base_d_asa/contract.py:328 + // smart_contracts/base_d_asa/contract.py:326 // itxn.AssetTransfer( pushint 4 // axfer itxn_field TypeEnum itxn_field Fee - // smart_contracts/base_d_asa/contract.py:328-333 + // smart_contracts/base_d_asa/contract.py:326-331 // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, // asset_receiver=receiver.native, @@ -2059,14 +2049,14 @@ pay_principal: assert // check self.status exists intc_3 // 100 == - // smart_contracts/base_d_asa/contract.py:436-437 + // smart_contracts/base_d_asa/contract.py:434-435 // # The reference implementation does not restrict caller authorization // assert self.status_is_active(), err.UNAUTHORIZED assert // Not authorized - // smart_contracts/base_d_asa/contract.py:438 + // smart_contracts/base_d_asa/contract.py:436 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:439 + // smart_contracts/base_d_asa/contract.py:437 // self.assert_is_not_suspended() callsub assert_is_not_suspended // smart_contracts/base_d_asa/contract.py:171 @@ -2078,20 +2068,20 @@ pay_principal: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:441 + // smart_contracts/base_d_asa/contract.py:439 // units = self.account[holding_address].units.native box_get assert // check self.account entry exists extract 32 8 // on error: Index access is out of bounds btoi - // smart_contracts/base_d_asa/contract.py:442 + // smart_contracts/base_d_asa/contract.py:440 // assert units > 0, err.NO_UNITS assert // No D-ASA units - // smart_contracts/base_d_asa/contract.py:443 + // smart_contracts/base_d_asa/contract.py:441 // assert Global.latest_timestamp >= self.maturity_date, err.NOT_MATURE global LatestTimestamp intc_0 // 0 - bytec 6 // "maturity_date" + bytec 7 // "maturity_date" app_global_get_ex assert // check self.maturity_date exists >= @@ -2131,7 +2121,7 @@ pay_principal: callsub pay pay_principal_after_if_else@3: - // smart_contracts/base_d_asa/contract.py:450 + // smart_contracts/base_d_asa/contract.py:448 // self.circulating_units -= self.account[holding_address].units.native intc_0 // 0 bytec_2 // "circulating_units" @@ -2148,15 +2138,15 @@ pay_principal_after_if_else@3: bytec_2 // "circulating_units" swap app_global_put - // smart_contracts/base_d_asa/contract.py:451 + // smart_contracts/base_d_asa/contract.py:449 // self.account[holding_address].units = arc4.UInt64() dup box_get assert // check self.account entry exists - bytec 8 // 0x0000000000000000 + bytec 9 // 0x0000000000000000 replace2 32 box_put - // smart_contracts/base_d_asa/contract.py:452 + // smart_contracts/base_d_asa/contract.py:450 // self.end_if_no_circulating_units() callsub end_if_no_circulating_units // smart_contracts/fixed_coupon_bond/contract.py:307 @@ -2190,18 +2180,18 @@ pay_principal_else_body@2: // smart_contracts.base_d_asa.contract.BaseDAsa.end_if_no_circulating_units() -> void: end_if_no_circulating_units: - // smart_contracts/base_d_asa/contract.py:357-358 + // smart_contracts/base_d_asa/contract.py:355-356 // @subroutine // def end_if_no_circulating_units(self) -> None: proto 0 0 - // smart_contracts/base_d_asa/contract.py:359 + // smart_contracts/base_d_asa/contract.py:357 // if self.circulating_units == 0: intc_0 // 0 bytec_2 // "circulating_units" app_global_get_ex assert // check self.circulating_units exists bnz end_if_no_circulating_units_after_if_else@2 - // smart_contracts/base_d_asa/contract.py:360 + // smart_contracts/base_d_asa/contract.py:358 // self.status = UInt64(cfg.STATUS_ENDED) bytec_3 // "status" intc 7 // 200 @@ -2266,7 +2256,7 @@ get_account_units_current_value_bool_merge@4: // smart_contracts/fixed_coupon_bond/contract.py:338 // 0 < units <= self.account[holding_address].units.native frame_dig -1 - bytec 8 // 0x0000000000000000 + bytec 9 // 0x0000000000000000 b> bz get_account_units_current_value_bool_false@7 frame_dig 0 @@ -2686,7 +2676,7 @@ get_coupons_status_after_if_else@2: concat // smart_contracts/fixed_coupon_bond/contract.py:441 // all_due_coupons_paid=arc4.Bool(all_due_coupons_paid), - bytec 7 // 0x00 + bytec 8 // 0x00 intc_0 // 0 frame_dig 2 setbit @@ -2716,16 +2706,16 @@ get_coupons_status_after_if_else@2: // smart_contracts.base_d_asa.contract.BaseDAsa.asset_create(arranger: bytes, metadata: bytes) -> void: asset_create: - // smart_contracts/base_d_asa/contract.py:454-455 + // smart_contracts/base_d_asa/contract.py:452-453 // @arc4.abimethod(create="require") // def asset_create(self, arranger: arc4.Address, metadata: typ.AssetMetadata) -> None: proto 2 0 - // smart_contracts/base_d_asa/contract.py:463 + // smart_contracts/base_d_asa/contract.py:461 // self.arranger.value = arranger.native bytec 18 // 0x52323023 frame_dig -2 app_global_put - // smart_contracts/base_d_asa/contract.py:464 + // smart_contracts/base_d_asa/contract.py:462 // self.metadata = metadata.native frame_dig -1 extract 2 0 @@ -2737,7 +2727,7 @@ asset_create: // smart_contracts.base_d_asa.contract.BaseDAsa.asset_config(denomination_asset_id: bytes, settlement_asset_id: bytes, principal: bytes, minimum_denomination: bytes, day_count_convention: bytes, interest_rate: bytes, coupon_rates: bytes, time_events: bytes, time_periods: bytes) -> void: asset_config: - // smart_contracts/base_d_asa/contract.py:476-488 + // smart_contracts/base_d_asa/contract.py:474-486 // @arc4.abimethod // def asset_config( // self, @@ -2755,10 +2745,10 @@ asset_config: intc_0 // 0 pushbytes "" dup - // smart_contracts/base_d_asa/contract.py:517 + // smart_contracts/base_d_asa/contract.py:515 // self.assert_caller_is_arranger() callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:518 + // smart_contracts/base_d_asa/contract.py:516 // assert self.status == cfg.STATUS_EMPTY, err.ALREADY_CONFIGURED intc_0 // 0 bytec_3 // "status" @@ -2766,7 +2756,7 @@ asset_config: assert // check self.status exists ! assert // D-ASA already configured - // smart_contracts/base_d_asa/contract.py:520-521 + // smart_contracts/base_d_asa/contract.py:518-519 // # Set Denomination Asset // self.assert_denomination_asset(denomination_asset_id.native) frame_dig -9 @@ -2792,10 +2782,10 @@ asset_config_bool_merge@5: assert // Denomination asset is not properly set // smart_contracts/base_d_asa/contract.py:182 // self.denomination_asset_id = denomination_asset_id - bytec 9 // "denomination_asset_id" + bytec 19 // "denomination_asset_id" frame_dig 3 app_global_put - // smart_contracts/base_d_asa/contract.py:524-525 + // smart_contracts/base_d_asa/contract.py:522-523 // # Set Denomination Asset // self.assert_settlement_asset(settlement_asset_id.native) frame_dig -8 @@ -2803,7 +2793,7 @@ asset_config_bool_merge@5: // smart_contracts/base_d_asa/contract.py:188 // settlement_asset_id == self.denomination_asset_id intc_0 // 0 - bytec 9 // "denomination_asset_id" + bytec 19 // "denomination_asset_id" app_global_get_ex assert // check self.denomination_asset_id exists dig 1 @@ -2816,7 +2806,7 @@ asset_config_bool_merge@5: assert // Different settlement asset not supported, must be equal to denomination asset // smart_contracts/base_d_asa/contract.py:193 // self.settlement_asset_id = settlement_asset_id - bytec 19 // "settlement_asset_id" + bytec 6 // "settlement_asset_id" swap app_global_put // smart_contracts/base_d_asa/contract.py:194-200 @@ -2834,7 +2824,7 @@ asset_config_bool_merge@5: // smart_contracts/base_d_asa/contract.py:196 // xfer_asset=self.settlement_asset_id, intc_0 // 0 - bytec 19 // "settlement_asset_id" + bytec 6 // "settlement_asset_id" app_global_get_ex assert // check self.settlement_asset_id exists // smart_contracts/base_d_asa/contract.py:197 @@ -2861,7 +2851,7 @@ asset_config_bool_merge@5: // fee=Global.min_txn_fee, // ).submit() itxn_submit - // smart_contracts/base_d_asa/contract.py:530 + // smart_contracts/base_d_asa/contract.py:528 // principal.native % minimum_denomination.native == 0 frame_dig -7 btoi @@ -2870,24 +2860,24 @@ asset_config_bool_merge@5: dup2 % ! - // smart_contracts/base_d_asa/contract.py:528-531 + // smart_contracts/base_d_asa/contract.py:526-529 // # Set Principal and Minimum Denomination // assert ( // principal.native % minimum_denomination.native == 0 // ), err.INVALID_MINIMUM_DENOMINATION assert // Minimum denomination is not a divisor of principal - // smart_contracts/base_d_asa/contract.py:532 + // smart_contracts/base_d_asa/contract.py:530 // self.unit_value = minimum_denomination.native bytec 12 // "unit_value" dig 1 app_global_put - // smart_contracts/base_d_asa/contract.py:533 + // smart_contracts/base_d_asa/contract.py:531 // self.total_units = principal.native // minimum_denomination.native / bytec 14 // "total_units" swap app_global_put - // smart_contracts/base_d_asa/contract.py:535-536 + // smart_contracts/base_d_asa/contract.py:533-534 // # Set Day-Count Convention // self.assert_day_count_convention(day_count_convention.native) frame_dig -5 @@ -2934,7 +2924,7 @@ asset_config_bool_merge@18: bytec 13 // "day_count_convention" frame_dig 1 app_global_put - // smart_contracts/base_d_asa/contract.py:539-540 + // smart_contracts/base_d_asa/contract.py:537-538 // # Set Interest Rate // self.assert_interest_rate(interest_rate.native) frame_dig -4 @@ -2994,7 +2984,7 @@ asset_config_after_if_else@30: // time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS // ), err.INVALID_TIME_EVENTS_LENGTH assert // Time events length is invalid - // smart_contracts/base_d_asa/contract.py:549 + // smart_contracts/base_d_asa/contract.py:547 // self.assert_time_events_sorted(time_events) frame_dig -2 callsub assert_time_events_sorted @@ -3078,7 +3068,7 @@ asset_config_after_if_else@30: intc_2 // 8 extract3 // on error: Index access is out of bounds btoi - bytec 6 // "maturity_date" + bytec 7 // "maturity_date" swap app_global_put @@ -3090,7 +3080,7 @@ asset_config_after_if_else@36: extract_uint16 ! assert // Time periods are not properly defined - // smart_contracts/base_d_asa/contract.py:556 + // smart_contracts/base_d_asa/contract.py:554 // self.status = UInt64(cfg.STATUS_ACTIVE) bytec_3 // "status" intc_3 // 100 @@ -3247,14 +3237,14 @@ assert_time_events_sorted_after_for@6: // smart_contracts.base_d_asa.contract.BaseDAsa.set_secondary_time_events(secondary_market_time_events: bytes) -> bytes: set_secondary_time_events: - // smart_contracts/base_d_asa/contract.py:558-561 + // smart_contracts/base_d_asa/contract.py:556-559 // @arc4.abimethod // def set_secondary_time_events( // self, secondary_market_time_events: typ.TimeEvents // ) -> typ.SecondaryMarketSchedule: proto 1 1 intc_0 // 0 - // smart_contracts/base_d_asa/contract.py:579 + // smart_contracts/base_d_asa/contract.py:577 // self.assert_caller_is_arranger() callsub assert_caller_is_arranger // smart_contracts/base_d_asa/contract.py:105 @@ -3265,28 +3255,28 @@ set_secondary_time_events: assert // check self.status exists intc 7 // 200 == - // smart_contracts/base_d_asa/contract.py:580 + // smart_contracts/base_d_asa/contract.py:578 // assert not self.status_is_ended(), err.UNAUTHORIZED ! assert // Not authorized - // smart_contracts/base_d_asa/contract.py:581 + // smart_contracts/base_d_asa/contract.py:579 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:583 + // smart_contracts/base_d_asa/contract.py:581 // assert secondary_market_time_events.length >= 1, err.INVALID_TIME_EVENTS_LENGTH frame_dig -1 intc_0 // 0 extract_uint16 dup assert // Time events length is invalid - // smart_contracts/base_d_asa/contract.py:584 + // smart_contracts/base_d_asa/contract.py:582 // if secondary_market_time_events.length > 1: intc_1 // 1 > frame_dig -1 swap bz set_secondary_time_events_after_if_else@2 - // smart_contracts/base_d_asa/contract.py:585 + // smart_contracts/base_d_asa/contract.py:583 // self.assert_time_events_sorted(secondary_market_time_events) frame_dig -1 callsub assert_time_events_sorted @@ -3297,13 +3287,13 @@ set_secondary_time_events: set_secondary_time_events_after_if_else@2: frame_dig 1 frame_bury -1 - // smart_contracts/base_d_asa/contract.py:587 + // smart_contracts/base_d_asa/contract.py:585 // self.issuance_date intc_0 // 0 bytec 5 // "issuance_date" app_global_get_ex assert // check self.issuance_date exists - // smart_contracts/base_d_asa/contract.py:588-590 + // smart_contracts/base_d_asa/contract.py:586-588 // <= secondary_market_time_events[ // cfg.SECONDARY_MARKET_OPENING_DATE_IDX // ].native @@ -3313,7 +3303,7 @@ set_secondary_time_events_after_if_else@2: frame_bury 0 extract 0 8 // on error: Index access is out of bounds btoi - // smart_contracts/base_d_asa/contract.py:587-590 + // smart_contracts/base_d_asa/contract.py:585-588 // self.issuance_date // <= secondary_market_time_events[ // cfg.SECONDARY_MARKET_OPENING_DATE_IDX @@ -3321,7 +3311,7 @@ set_secondary_time_events_after_if_else@2: swap dig 1 <= - // smart_contracts/base_d_asa/contract.py:586-591 + // smart_contracts/base_d_asa/contract.py:584-589 // assert ( // self.issuance_date // <= secondary_market_time_events[ @@ -3329,34 +3319,34 @@ set_secondary_time_events_after_if_else@2: // ].native // ), err.INVALID_SECONDARY_OPENING_DATE assert // Invalid secondary market opening date - // smart_contracts/base_d_asa/contract.py:592 + // smart_contracts/base_d_asa/contract.py:590 // self.secondary_market_opening_date = secondary_market_time_events[ bytec 15 // "secondary_market_opening_date" - // smart_contracts/base_d_asa/contract.py:592-594 + // smart_contracts/base_d_asa/contract.py:590-592 // self.secondary_market_opening_date = secondary_market_time_events[ // cfg.SECONDARY_MARKET_OPENING_DATE_IDX // ].native swap app_global_put - // smart_contracts/base_d_asa/contract.py:595 + // smart_contracts/base_d_asa/contract.py:593 // if self.maturity_date: intc_0 // 0 - bytec 6 // "maturity_date" + bytec 7 // "maturity_date" app_global_get_ex assert // check self.maturity_date exists bz set_secondary_time_events_after_if_else@4 - // smart_contracts/base_d_asa/contract.py:597 + // smart_contracts/base_d_asa/contract.py:595 // self.maturity_date intc_0 // 0 - bytec 6 // "maturity_date" + bytec 7 // "maturity_date" app_global_get_ex assert // check self.maturity_date exists - // smart_contracts/base_d_asa/contract.py:599 + // smart_contracts/base_d_asa/contract.py:597 // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX frame_dig -1 intc_0 // 0 extract_uint16 - // smart_contracts/base_d_asa/contract.py:598-600 + // smart_contracts/base_d_asa/contract.py:596-598 // >= secondary_market_time_events[ // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX // ].native @@ -3369,7 +3359,7 @@ set_secondary_time_events_after_if_else@2: intc_2 // 8 extract3 // on error: Index access is out of bounds btoi - // smart_contracts/base_d_asa/contract.py:597-600 + // smart_contracts/base_d_asa/contract.py:595-598 // self.maturity_date // >= secondary_market_time_events[ // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX @@ -3377,7 +3367,7 @@ set_secondary_time_events_after_if_else@2: swap dig 1 >= - // smart_contracts/base_d_asa/contract.py:596-601 + // smart_contracts/base_d_asa/contract.py:594-599 // assert ( // self.maturity_date // >= secondary_market_time_events[ @@ -3385,10 +3375,10 @@ set_secondary_time_events_after_if_else@2: // ].native // ), err.INVALID_SECONDARY_CLOSURE_DATE assert // Invalid secondary market closure date - // smart_contracts/base_d_asa/contract.py:602 + // smart_contracts/base_d_asa/contract.py:600 // self.secondary_market_closure_date = secondary_market_time_events[ bytec 16 // "secondary_market_closure_date" - // smart_contracts/base_d_asa/contract.py:602-604 + // smart_contracts/base_d_asa/contract.py:600-602 // self.secondary_market_closure_date = secondary_market_time_events[ // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX // ].native @@ -3396,29 +3386,29 @@ set_secondary_time_events_after_if_else@2: app_global_put set_secondary_time_events_after_if_else@4: - // smart_contracts/base_d_asa/contract.py:607 + // smart_contracts/base_d_asa/contract.py:605 // self.secondary_market_opening_date intc_0 // 0 bytec 15 // "secondary_market_opening_date" app_global_get_ex assert // check self.secondary_market_opening_date exists - // smart_contracts/base_d_asa/contract.py:606-608 + // smart_contracts/base_d_asa/contract.py:604-606 // secondary_market_opening_date=arc4.UInt64( // self.secondary_market_opening_date // ), itob - // smart_contracts/base_d_asa/contract.py:610 + // smart_contracts/base_d_asa/contract.py:608 // self.secondary_market_closure_date intc_0 // 0 bytec 16 // "secondary_market_closure_date" app_global_get_ex assert // check self.secondary_market_closure_date exists - // smart_contracts/base_d_asa/contract.py:609-611 + // smart_contracts/base_d_asa/contract.py:607-609 // secondary_market_closure_date=arc4.UInt64( // self.secondary_market_closure_date // ), itob - // smart_contracts/base_d_asa/contract.py:605-612 + // smart_contracts/base_d_asa/contract.py:603-610 // return typ.SecondaryMarketSchedule( // secondary_market_opening_date=arc4.UInt64( // self.secondary_market_opening_date @@ -3434,27 +3424,27 @@ set_secondary_time_events_after_if_else@4: // smart_contracts.base_d_asa.contract.BaseDAsa.assign_role(role_address: bytes, role: bytes, config: bytes) -> bytes: assign_role: - // smart_contracts/base_d_asa/contract.py:614-617 + // smart_contracts/base_d_asa/contract.py:612-615 // @arc4.abimethod // def assign_role( // self, role_address: arc4.Address, role: arc4.UInt8, config: arc4.DynamicBytes // ) -> arc4.UInt64: proto 3 1 - // smart_contracts/base_d_asa/contract.py:635 + // smart_contracts/base_d_asa/contract.py:633 // self.assert_caller_is_arranger() callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:636 + // smart_contracts/base_d_asa/contract.py:634 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:637 + // smart_contracts/base_d_asa/contract.py:635 // assert role.native in ( frame_dig -2 btoi dup - // smart_contracts/base_d_asa/contract.py:638 + // smart_contracts/base_d_asa/contract.py:636 // UInt64(cst.ROLE_ARRANGER), pushint 20 // 20 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -3466,10 +3456,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:639 + // smart_contracts/base_d_asa/contract.py:637 // UInt64(cst.ROLE_ACCOUNT_MANAGER), pushint 40 // 40 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -3481,10 +3471,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:640 + // smart_contracts/base_d_asa/contract.py:638 // UInt64(cst.ROLE_PRIMARY_DEALER), pushint 50 // 50 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -3496,10 +3486,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:641 + // smart_contracts/base_d_asa/contract.py:639 // UInt64(cst.ROLE_TRUSTEE), pushint 60 // 60 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -3511,10 +3501,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:642 + // smart_contracts/base_d_asa/contract.py:640 // UInt64(cst.ROLE_AUTHORITY), pushint 70 // 70 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -3526,10 +3516,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:643 + // smart_contracts/base_d_asa/contract.py:641 // UInt64(cst.ROLE_INTEREST_ORACLE), pushint 80 // 80 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -3545,7 +3535,7 @@ assign_role_bool_true@6: intc_1 // 1 assign_role_bool_merge@8: - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -3555,10 +3545,10 @@ assign_role_bool_merge@8: // UInt64(cst.ROLE_INTEREST_ORACLE), // ), err.INVALID_ROLE assert // Invalid role identifier - // smart_contracts/base_d_asa/contract.py:646 + // smart_contracts/base_d_asa/contract.py:644 // case UInt64(cst.ROLE_ARRANGER): pushints 20 40 50 60 70 80 // 20, 40, 50, 60, 70, 80 - // smart_contracts/base_d_asa/contract.py:645-674 + // smart_contracts/base_d_asa/contract.py:643-672 // match role.native: // case UInt64(cst.ROLE_ARRANGER): // self.arranger.value = role_address.native @@ -3591,12 +3581,12 @@ assign_role_bool_merge@8: // op.err() frame_dig 0 match assign_role_switch_case_0@9 assign_role_switch_case_1@10 assign_role_switch_case_2@11 assign_role_switch_case_3@12 assign_role_switch_case_4@13 assign_role_switch_case_5@14 - // smart_contracts/base_d_asa/contract.py:674 + // smart_contracts/base_d_asa/contract.py:672 // op.err() err assign_role_switch_case_5@14: - // smart_contracts/base_d_asa/contract.py:668 + // smart_contracts/base_d_asa/contract.py:666 // role_address not in self.interest_oracle bytec 33 // 0x52383023 frame_dig -3 @@ -3605,23 +3595,23 @@ assign_role_switch_case_5@14: box_len bury 1 ! - // smart_contracts/base_d_asa/contract.py:667-669 + // smart_contracts/base_d_asa/contract.py:665-667 // assert ( // role_address not in self.interest_oracle // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:671 + // smart_contracts/base_d_asa/contract.py:669 // config.native frame_dig -1 extract 2 0 - // smart_contracts/base_d_asa/contract.py:670-672 + // smart_contracts/base_d_asa/contract.py:668-670 // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes( // config.native // ) box_put assign_role_switch_case_next@16: - // smart_contracts/base_d_asa/contract.py:675 + // smart_contracts/base_d_asa/contract.py:673 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -3629,7 +3619,7 @@ assign_role_switch_case_next@16: retsub assign_role_switch_case_4@13: - // smart_contracts/base_d_asa/contract.py:664 + // smart_contracts/base_d_asa/contract.py:662 // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS bytec 27 // 0x52373023 frame_dig -3 @@ -3639,7 +3629,7 @@ assign_role_switch_case_4@13: bury 1 ! assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:665 + // smart_contracts/base_d_asa/contract.py:663 // self.authority[role_address] = typ.RoleConfig.from_bytes(config.native) frame_dig -1 extract 2 0 @@ -3647,7 +3637,7 @@ assign_role_switch_case_4@13: b assign_role_switch_case_next@16 assign_role_switch_case_3@12: - // smart_contracts/base_d_asa/contract.py:661 + // smart_contracts/base_d_asa/contract.py:659 // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS bytec 28 // 0x52363023 frame_dig -3 @@ -3657,7 +3647,7 @@ assign_role_switch_case_3@12: bury 1 ! assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:662 + // smart_contracts/base_d_asa/contract.py:660 // self.trustee[role_address] = typ.RoleConfig.from_bytes(config.native) frame_dig -1 extract 2 0 @@ -3665,7 +3655,7 @@ assign_role_switch_case_3@12: b assign_role_switch_case_next@16 assign_role_switch_case_2@11: - // smart_contracts/base_d_asa/contract.py:656 + // smart_contracts/base_d_asa/contract.py:654 // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS bytec 29 // 0x52353023 frame_dig -3 @@ -3675,11 +3665,11 @@ assign_role_switch_case_2@11: bury 1 ! assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:658 + // smart_contracts/base_d_asa/contract.py:656 // config.native frame_dig -1 extract 2 0 - // smart_contracts/base_d_asa/contract.py:657-659 + // smart_contracts/base_d_asa/contract.py:655-657 // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes( // config.native // ) @@ -3687,7 +3677,7 @@ assign_role_switch_case_2@11: b assign_role_switch_case_next@16 assign_role_switch_case_1@10: - // smart_contracts/base_d_asa/contract.py:650 + // smart_contracts/base_d_asa/contract.py:648 // role_address not in self.account_manager bytec 30 // 0x52343023 frame_dig -3 @@ -3696,16 +3686,16 @@ assign_role_switch_case_1@10: box_len bury 1 ! - // smart_contracts/base_d_asa/contract.py:649-651 + // smart_contracts/base_d_asa/contract.py:647-649 // assert ( // role_address not in self.account_manager // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:653 + // smart_contracts/base_d_asa/contract.py:651 // config.native frame_dig -1 extract 2 0 - // smart_contracts/base_d_asa/contract.py:652-654 + // smart_contracts/base_d_asa/contract.py:650-652 // self.account_manager[role_address] = typ.RoleConfig.from_bytes( // config.native // ) @@ -3713,7 +3703,7 @@ assign_role_switch_case_1@10: b assign_role_switch_case_next@16 assign_role_switch_case_0@9: - // smart_contracts/base_d_asa/contract.py:647 + // smart_contracts/base_d_asa/contract.py:645 // self.arranger.value = role_address.native bytec 18 // 0x52323023 frame_dig -3 @@ -3727,25 +3717,25 @@ assign_role_bool_false@7: // smart_contracts.base_d_asa.contract.BaseDAsa.revoke_role(role_address: bytes, role: bytes) -> bytes: revoke_role: - // smart_contracts/base_d_asa/contract.py:677-678 + // smart_contracts/base_d_asa/contract.py:675-676 // @arc4.abimethod // def revoke_role(self, role_address: arc4.Address, role: arc4.UInt8) -> arc4.UInt64: proto 2 1 - // smart_contracts/base_d_asa/contract.py:695 + // smart_contracts/base_d_asa/contract.py:693 // self.assert_caller_is_arranger() callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:696 + // smart_contracts/base_d_asa/contract.py:694 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:697 + // smart_contracts/base_d_asa/contract.py:695 // assert role.native in ( frame_dig -1 btoi dup - // smart_contracts/base_d_asa/contract.py:698 + // smart_contracts/base_d_asa/contract.py:696 // UInt64(cst.ROLE_ACCOUNT_MANAGER), pushint 40 // 40 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -3756,10 +3746,10 @@ revoke_role: == bnz revoke_role_bool_true@5 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:699 + // smart_contracts/base_d_asa/contract.py:697 // UInt64(cst.ROLE_PRIMARY_DEALER), pushint 50 // 50 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -3770,10 +3760,10 @@ revoke_role: == bnz revoke_role_bool_true@5 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:700 + // smart_contracts/base_d_asa/contract.py:698 // UInt64(cst.ROLE_TRUSTEE), pushint 60 // 60 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -3784,10 +3774,10 @@ revoke_role: == bnz revoke_role_bool_true@5 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:701 + // smart_contracts/base_d_asa/contract.py:699 // UInt64(cst.ROLE_AUTHORITY), pushint 70 // 70 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -3798,10 +3788,10 @@ revoke_role: == bnz revoke_role_bool_true@5 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:702 + // smart_contracts/base_d_asa/contract.py:700 // UInt64(cst.ROLE_INTEREST_ORACLE), pushint 80 // 80 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -3816,7 +3806,7 @@ revoke_role_bool_true@5: intc_1 // 1 revoke_role_bool_merge@7: - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -3825,11 +3815,11 @@ revoke_role_bool_merge@7: // UInt64(cst.ROLE_INTEREST_ORACLE), // ), err.INVALID_ROLE assert // Invalid role identifier - // smart_contracts/base_d_asa/contract.py:705-706 + // smart_contracts/base_d_asa/contract.py:703-704 // # Arranger role can not be revoked (just rotated) // case UInt64(cst.ROLE_ACCOUNT_MANAGER): pushints 40 50 60 70 80 // 40, 50, 60, 70, 80 - // smart_contracts/base_d_asa/contract.py:704-722 + // smart_contracts/base_d_asa/contract.py:702-720 // match role.native: // # Arranger role can not be revoked (just rotated) // case UInt64(cst.ROLE_ACCOUNT_MANAGER): @@ -3851,12 +3841,12 @@ revoke_role_bool_merge@7: // op.err() frame_dig 0 match revoke_role_switch_case_0@8 revoke_role_switch_case_1@9 revoke_role_switch_case_2@10 revoke_role_switch_case_3@11 revoke_role_switch_case_4@12 - // smart_contracts/base_d_asa/contract.py:722 + // smart_contracts/base_d_asa/contract.py:720 // op.err() err revoke_role_switch_case_4@12: - // smart_contracts/base_d_asa/contract.py:719 + // smart_contracts/base_d_asa/contract.py:717 // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS bytec 33 // 0x52383023 frame_dig -2 @@ -3865,13 +3855,13 @@ revoke_role_switch_case_4@12: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:720 + // smart_contracts/base_d_asa/contract.py:718 // op.Box.delete(cst.PREFIX_ID_INTEREST_ORACLE + role_address.bytes) box_del pop revoke_role_switch_case_next@14: - // smart_contracts/base_d_asa/contract.py:723 + // smart_contracts/base_d_asa/contract.py:721 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -3879,7 +3869,7 @@ revoke_role_switch_case_next@14: retsub revoke_role_switch_case_3@11: - // smart_contracts/base_d_asa/contract.py:716 + // smart_contracts/base_d_asa/contract.py:714 // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS bytec 27 // 0x52373023 frame_dig -2 @@ -3888,14 +3878,14 @@ revoke_role_switch_case_3@11: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:717 + // smart_contracts/base_d_asa/contract.py:715 // op.Box.delete(cst.PREFIX_ID_AUTHORITY + role_address.bytes) box_del pop b revoke_role_switch_case_next@14 revoke_role_switch_case_2@10: - // smart_contracts/base_d_asa/contract.py:713 + // smart_contracts/base_d_asa/contract.py:711 // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS bytec 28 // 0x52363023 frame_dig -2 @@ -3904,14 +3894,14 @@ revoke_role_switch_case_2@10: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:714 + // smart_contracts/base_d_asa/contract.py:712 // op.Box.delete(cst.PREFIX_ID_TRUSTEE + role_address.bytes) box_del pop b revoke_role_switch_case_next@14 revoke_role_switch_case_1@9: - // smart_contracts/base_d_asa/contract.py:710 + // smart_contracts/base_d_asa/contract.py:708 // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS bytec 29 // 0x52353023 frame_dig -2 @@ -3920,14 +3910,14 @@ revoke_role_switch_case_1@9: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:711 + // smart_contracts/base_d_asa/contract.py:709 // op.Box.delete(cst.PREFIX_ID_PRIMARY_DEALER + role_address.bytes) box_del pop b revoke_role_switch_case_next@14 revoke_role_switch_case_0@8: - // smart_contracts/base_d_asa/contract.py:707 + // smart_contracts/base_d_asa/contract.py:705 // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS bytec 30 // 0x52343023 frame_dig -2 @@ -3936,7 +3926,7 @@ revoke_role_switch_case_0@8: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:708 + // smart_contracts/base_d_asa/contract.py:706 // op.Box.delete(cst.PREFIX_ID_ACCOUNT_MANAGER + role_address.bytes) box_del pop @@ -3949,13 +3939,13 @@ revoke_role_bool_false@6: // smart_contracts.base_d_asa.contract.BaseDAsa.open_account(holding_address: bytes, payment_address: bytes) -> bytes: open_account: - // smart_contracts/base_d_asa/contract.py:725-728 + // smart_contracts/base_d_asa/contract.py:723-726 // @arc4.abimethod // def open_account( // self, holding_address: arc4.Address, payment_address: arc4.Address // ) -> arc4.UInt64: proto 2 1 - // smart_contracts/base_d_asa/contract.py:745 + // smart_contracts/base_d_asa/contract.py:743 // self.assert_caller_is_account_manager() callsub assert_caller_is_account_manager // smart_contracts/base_d_asa/contract.py:105 @@ -3966,17 +3956,17 @@ open_account: assert // check self.status exists intc 7 // 200 == - // smart_contracts/base_d_asa/contract.py:746 + // smart_contracts/base_d_asa/contract.py:744 // assert not self.status_is_ended(), err.UNAUTHORIZED ! assert // Not authorized - // smart_contracts/base_d_asa/contract.py:747 + // smart_contracts/base_d_asa/contract.py:745 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:748 + // smart_contracts/base_d_asa/contract.py:746 // self.assert_is_not_suspended() callsub assert_is_not_suspended - // smart_contracts/base_d_asa/contract.py:749 + // smart_contracts/base_d_asa/contract.py:747 // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS bytec_1 // 0x52333023 frame_dig -2 @@ -3986,7 +3976,7 @@ open_account: bury 1 ! assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:751-757 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -3995,10 +3985,10 @@ open_account: // suspended=arc4.Bool(), // ) frame_dig -1 - // smart_contracts/base_d_asa/contract.py:753 + // smart_contracts/base_d_asa/contract.py:751 // units=arc4.UInt64(), - bytec 8 // 0x0000000000000000 - // smart_contracts/base_d_asa/contract.py:751-757 + bytec 9 // 0x0000000000000000 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -4007,10 +3997,10 @@ open_account: // suspended=arc4.Bool(), // ) concat - // smart_contracts/base_d_asa/contract.py:754 + // smart_contracts/base_d_asa/contract.py:752 // unit_value=arc4.UInt64(), - bytec 8 // 0x0000000000000000 - // smart_contracts/base_d_asa/contract.py:751-757 + bytec 9 // 0x0000000000000000 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -4019,10 +4009,10 @@ open_account: // suspended=arc4.Bool(), // ) concat - // smart_contracts/base_d_asa/contract.py:755 + // smart_contracts/base_d_asa/contract.py:753 // paid_coupons=arc4.UInt64(), - bytec 8 // 0x0000000000000000 - // smart_contracts/base_d_asa/contract.py:751-757 + bytec 9 // 0x0000000000000000 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -4031,10 +4021,10 @@ open_account: // suspended=arc4.Bool(), // ) concat - // smart_contracts/base_d_asa/contract.py:756 + // smart_contracts/base_d_asa/contract.py:754 // suspended=arc4.Bool(), - bytec 7 // 0x00 - // smart_contracts/base_d_asa/contract.py:751-757 + bytec 8 // 0x00 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -4044,7 +4034,7 @@ open_account: // ) concat box_put - // smart_contracts/base_d_asa/contract.py:758 + // smart_contracts/base_d_asa/contract.py:756 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -4133,16 +4123,16 @@ assert_caller_is_account_manager_bool_false@4: // smart_contracts.base_d_asa.contract.BaseDAsa.close_account(holding_address: bytes) -> bytes: close_account: - // smart_contracts/base_d_asa/contract.py:760-763 + // smart_contracts/base_d_asa/contract.py:758-761 // @arc4.abimethod // def close_account( // self, holding_address: arc4.Address // ) -> arc4.Tuple[arc4.UInt64, arc4.UInt64]: proto 1 1 - // smart_contracts/base_d_asa/contract.py:778 + // smart_contracts/base_d_asa/contract.py:776 // self.assert_caller_is_account_manager() callsub assert_caller_is_account_manager - // smart_contracts/base_d_asa/contract.py:779 + // smart_contracts/base_d_asa/contract.py:777 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted // smart_contracts/base_d_asa/contract.py:171 @@ -4154,19 +4144,19 @@ close_account: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:782 + // smart_contracts/base_d_asa/contract.py:780 // closed_units = self.account[holding_address].units.native dup box_get assert // check self.account entry exists extract 32 8 // on error: Index access is out of bounds btoi - // smart_contracts/base_d_asa/contract.py:783 + // smart_contracts/base_d_asa/contract.py:781 // op.Box.delete(cst.PREFIX_ID_ACCOUNT + holding_address.bytes) swap box_del pop - // smart_contracts/base_d_asa/contract.py:784 + // smart_contracts/base_d_asa/contract.py:782 // self.circulating_units -= closed_units intc_0 // 0 bytec_2 // "circulating_units" @@ -4177,15 +4167,15 @@ close_account: bytec_2 // "circulating_units" swap app_global_put - // smart_contracts/base_d_asa/contract.py:785 + // smart_contracts/base_d_asa/contract.py:783 // self.end_if_no_circulating_units() callsub end_if_no_circulating_units - // smart_contracts/base_d_asa/contract.py:787 + // smart_contracts/base_d_asa/contract.py:785 // (arc4.UInt64(closed_units), arc4.UInt64(Global.latest_timestamp)) itob global LatestTimestamp itob - // smart_contracts/base_d_asa/contract.py:786-788 + // smart_contracts/base_d_asa/contract.py:784-786 // return arc4.Tuple( // (arc4.UInt64(closed_units), arc4.UInt64(Global.latest_timestamp)) // ) @@ -4195,7 +4185,7 @@ close_account: // smart_contracts.base_d_asa.contract.BaseDAsa.primary_distribution(holding_address: bytes, units: bytes) -> bytes: primary_distribution: - // smart_contracts/base_d_asa/contract.py:790-793 + // smart_contracts/base_d_asa/contract.py:788-791 // @arc4.abimethod // def primary_distribution( // self, holding_address: arc4.Address, units: arc4.UInt64 @@ -4341,19 +4331,19 @@ primary_distribution_bool_merge@13: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:818 + // smart_contracts/base_d_asa/contract.py:816 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:819 + // smart_contracts/base_d_asa/contract.py:817 // self.assert_is_not_suspended() callsub assert_is_not_suspended - // smart_contracts/base_d_asa/contract.py:820 + // smart_contracts/base_d_asa/contract.py:818 // assert units.native > 0, err.ZERO_UNITS frame_dig -1 btoi dup assert // Can not distribute zero units - // smart_contracts/base_d_asa/contract.py:822 + // smart_contracts/base_d_asa/contract.py:820 // self.circulating_units + units.native <= self.total_units intc_0 // 0 bytec_2 // "circulating_units" @@ -4366,12 +4356,12 @@ primary_distribution_bool_merge@13: app_global_get_ex assert // check self.total_units exists <= - // smart_contracts/base_d_asa/contract.py:821-823 + // smart_contracts/base_d_asa/contract.py:819-821 // assert ( // self.circulating_units + units.native <= self.total_units // ), err.OVER_DISTRIBUTION assert // Insufficient remaining D-ASA units - // smart_contracts/base_d_asa/contract.py:825 + // smart_contracts/base_d_asa/contract.py:823 // self.circulating_units += units.native intc_0 // 0 bytec_2 // "circulating_units" @@ -4382,7 +4372,7 @@ primary_distribution_bool_merge@13: bytec_2 // "circulating_units" swap app_global_put - // smart_contracts/base_d_asa/contract.py:827 + // smart_contracts/base_d_asa/contract.py:825 // self.account[holding_address].units.native + units.native dig 1 box_get @@ -4390,17 +4380,17 @@ primary_distribution_bool_merge@13: extract 32 8 // on error: Index access is out of bounds btoi + - // smart_contracts/base_d_asa/contract.py:826-828 + // smart_contracts/base_d_asa/contract.py:824-826 // self.account[holding_address].units = arc4.UInt64( // self.account[holding_address].units.native + units.native // ) itob - // smart_contracts/base_d_asa/contract.py:826 + // smart_contracts/base_d_asa/contract.py:824 // self.account[holding_address].units = arc4.UInt64( dig 1 box_get assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:826-828 + // smart_contracts/base_d_asa/contract.py:824-826 // self.account[holding_address].units = arc4.UInt64( // self.account[holding_address].units.native + units.native // ) @@ -4409,7 +4399,7 @@ primary_distribution_bool_merge@13: dig 1 swap box_put - // smart_contracts/base_d_asa/contract.py:829 + // smart_contracts/base_d_asa/contract.py:827 // self.account[holding_address].unit_value = arc4.UInt64(self.unit_value) intc_0 // 0 bytec 12 // "unit_value" @@ -4422,7 +4412,7 @@ primary_distribution_bool_merge@13: swap replace2 40 box_put - // smart_contracts/base_d_asa/contract.py:830 + // smart_contracts/base_d_asa/contract.py:828 // return arc4.UInt64(self.total_units - self.circulating_units) intc_0 // 0 bytec 14 // "total_units" @@ -4448,14 +4438,14 @@ primary_distribution_bool_false@5: // smart_contracts.base_d_asa.contract.BaseDAsa.set_asset_suspension(suspended: bytes) -> bytes: set_asset_suspension: - // smart_contracts/base_d_asa/contract.py:832-833 + // smart_contracts/base_d_asa/contract.py:830-831 // @arc4.abimethod // def set_asset_suspension(self, suspended: arc4.Bool) -> arc4.UInt64: proto 1 1 - // smart_contracts/base_d_asa/contract.py:846 + // smart_contracts/base_d_asa/contract.py:844 // self.assert_caller_is_authority() callsub assert_caller_is_authority - // smart_contracts/base_d_asa/contract.py:847 + // smart_contracts/base_d_asa/contract.py:845 // self.suspended = UInt64(suspended.native) frame_dig -1 intc_0 // 0 @@ -4463,7 +4453,7 @@ set_asset_suspension: bytec 21 // "suspended" swap app_global_put - // smart_contracts/base_d_asa/contract.py:848 + // smart_contracts/base_d_asa/contract.py:846 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -4552,13 +4542,13 @@ assert_caller_is_authority_bool_false@4: // smart_contracts.base_d_asa.contract.BaseDAsa.set_account_suspension(holding_address: bytes, suspended: bytes) -> bytes: set_account_suspension: - // smart_contracts/base_d_asa/contract.py:850-853 + // smart_contracts/base_d_asa/contract.py:848-851 // @arc4.abimethod // def set_account_suspension( // self, holding_address: arc4.Address, suspended: arc4.Bool // ) -> arc4.UInt64: proto 2 1 - // smart_contracts/base_d_asa/contract.py:868 + // smart_contracts/base_d_asa/contract.py:866 // self.assert_caller_is_authority() callsub assert_caller_is_authority // smart_contracts/base_d_asa/contract.py:171 @@ -4570,7 +4560,7 @@ set_account_suspension: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:870 + // smart_contracts/base_d_asa/contract.py:868 // self.account[holding_address].suspended = suspended dup box_get @@ -4582,7 +4572,7 @@ set_account_suspension: swap setbit box_put - // smart_contracts/base_d_asa/contract.py:871 + // smart_contracts/base_d_asa/contract.py:869 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -4591,7 +4581,7 @@ set_account_suspension: // smart_contracts.base_d_asa.contract.BaseDAsa.set_default_status(defaulted: bytes) -> void: set_default_status: - // smart_contracts/base_d_asa/contract.py:873-874 + // smart_contracts/base_d_asa/contract.py:871-872 // @arc4.abimethod // def set_default_status(self, defaulted: arc4.Bool) -> None: proto 1 0 @@ -4662,7 +4652,7 @@ set_default_status_bool_merge@6: // <= self.trustee[caller].role_validity_end // ), err.UNAUTHORIZED assert // Not authorized - // smart_contracts/base_d_asa/contract.py:885 + // smart_contracts/base_d_asa/contract.py:883 // self.defaulted = UInt64(defaulted.native) frame_dig -1 intc_0 // 0 @@ -4679,18 +4669,25 @@ set_default_status_bool_false@5: // smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_info() -> bytes: get_asset_info: - // smart_contracts/base_d_asa/contract.py:887-888 + // smart_contracts/base_d_asa/contract.py:885-886 // @arc4.abimethod(readonly=True) // def get_asset_info(self) -> typ.AssetInfo: proto 0 1 - // smart_contracts/base_d_asa/contract.py:898 + // smart_contracts/base_d_asa/contract.py:896 // denomination_asset_id=arc4.UInt64(self.denomination_asset_id), intc_0 // 0 - bytec 9 // "denomination_asset_id" + bytec 19 // "denomination_asset_id" app_global_get_ex assert // check self.denomination_asset_id exists itob - // smart_contracts/base_d_asa/contract.py:899 + // smart_contracts/base_d_asa/contract.py:897 + // settlement_asset_id=arc4.UInt64(self.settlement_asset_id), + intc_0 // 0 + bytec 6 // "settlement_asset_id" + app_global_get_ex + assert // check self.settlement_asset_id exists + itob + // smart_contracts/base_d_asa/contract.py:898 // outstanding_principal=arc4.UInt64(self.circulating_units * self.unit_value), intc_0 // 0 bytec_2 // "circulating_units" @@ -4702,14 +4699,14 @@ get_asset_info: assert // check self.unit_value exists * itob - // smart_contracts/base_d_asa/contract.py:900 + // smart_contracts/base_d_asa/contract.py:899 // unit_value=arc4.UInt64(self.unit_value), intc_0 // 0 bytec 12 // "unit_value" app_global_get_ex assert // check self.unit_value exists itob - // smart_contracts/base_d_asa/contract.py:901 + // smart_contracts/base_d_asa/contract.py:900 // day_count_convention=arc4.UInt8(self.day_count_convention), intc_0 // 0 bytec 13 // "day_count_convention" @@ -4717,7 +4714,7 @@ get_asset_info: assert // check self.day_count_convention exists itob extract 7 1 - // smart_contracts/base_d_asa/contract.py:902 + // smart_contracts/base_d_asa/contract.py:901 // interest_rate=arc4.UInt16(self.interest_rate), intc_0 // 0 bytec 26 // "interest_rate" @@ -4725,79 +4722,80 @@ get_asset_info: assert // check self.interest_rate exists itob extract 6 2 - // smart_contracts/base_d_asa/contract.py:903 + // smart_contracts/base_d_asa/contract.py:902 // total_supply=arc4.UInt64(self.total_units), intc_0 // 0 bytec 14 // "total_units" app_global_get_ex assert // check self.total_units exists itob - // smart_contracts/base_d_asa/contract.py:904 + // smart_contracts/base_d_asa/contract.py:903 // circulating_supply=arc4.UInt64(self.circulating_units), intc_0 // 0 bytec_2 // "circulating_units" app_global_get_ex assert // check self.circulating_units exists itob - // smart_contracts/base_d_asa/contract.py:906 + // smart_contracts/base_d_asa/contract.py:905 // self.primary_distribution_opening_date intc_0 // 0 bytec 10 // "primary_distribution_opening_date" app_global_get_ex assert // check self.primary_distribution_opening_date exists - // smart_contracts/base_d_asa/contract.py:905-907 + // smart_contracts/base_d_asa/contract.py:904-906 // primary_distribution_opening_date=arc4.UInt64( // self.primary_distribution_opening_date // ), itob - // smart_contracts/base_d_asa/contract.py:909 + // smart_contracts/base_d_asa/contract.py:908 // self.primary_distribution_closure_date intc_0 // 0 bytec 20 // "primary_distribution_closure_date" app_global_get_ex assert // check self.primary_distribution_closure_date exists - // smart_contracts/base_d_asa/contract.py:908-910 + // smart_contracts/base_d_asa/contract.py:907-909 // primary_distribution_closure_date=arc4.UInt64( // self.primary_distribution_closure_date // ), itob - // smart_contracts/base_d_asa/contract.py:911 + // smart_contracts/base_d_asa/contract.py:910 // issuance_date=arc4.UInt64(self.issuance_date), intc_0 // 0 bytec 5 // "issuance_date" app_global_get_ex assert // check self.issuance_date exists itob - // smart_contracts/base_d_asa/contract.py:912 + // smart_contracts/base_d_asa/contract.py:911 // maturity_date=arc4.UInt64(self.maturity_date), intc_0 // 0 - bytec 6 // "maturity_date" + bytec 7 // "maturity_date" app_global_get_ex assert // check self.maturity_date exists itob - // smart_contracts/base_d_asa/contract.py:913 + // smart_contracts/base_d_asa/contract.py:912 // suspended=arc4.Bool(bool(self.suspended)), intc_0 // 0 bytec 21 // "suspended" app_global_get_ex assert // check self.suspended exists - bytec 7 // 0x00 + bytec 8 // 0x00 intc_0 // 0 uncover 2 setbit - // smart_contracts/base_d_asa/contract.py:914 + // smart_contracts/base_d_asa/contract.py:913 // defaulted=arc4.Bool(bool(self.defaulted)), intc_0 // 0 bytec 22 // "defaulted" app_global_get_ex assert // check self.defaulted exists - bytec 7 // 0x00 + bytec 8 // 0x00 intc_0 // 0 uncover 2 setbit - // smart_contracts/base_d_asa/contract.py:897-915 + // smart_contracts/base_d_asa/contract.py:895-914 // return typ.AssetInfo( // denomination_asset_id=arc4.UInt64(self.denomination_asset_id), + // settlement_asset_id=arc4.UInt64(self.settlement_asset_id), // outstanding_principal=arc4.UInt64(self.circulating_units * self.unit_value), // unit_value=arc4.UInt64(self.unit_value), // day_count_convention=arc4.UInt8(self.day_count_convention), @@ -4815,7 +4813,9 @@ get_asset_info: // suspended=arc4.Bool(bool(self.suspended)), // defaulted=arc4.Bool(bool(self.defaulted)), // ) - uncover 12 + uncover 13 + uncover 13 + concat uncover 12 concat uncover 11 @@ -4841,7 +4841,7 @@ get_asset_info: swap intc_0 // 0 getbit - pushint 601 // 601 + pushint 665 // 665 swap setbit retsub @@ -4849,7 +4849,7 @@ get_asset_info: // smart_contracts.base_d_asa.contract.BaseDAsa.get_account_info(holding_address: bytes) -> bytes: get_account_info: - // smart_contracts/base_d_asa/contract.py:917-918 + // smart_contracts/base_d_asa/contract.py:916-917 // @arc4.abimethod(readonly=True) // def get_account_info(self, holding_address: arc4.Address) -> typ.AccountInfo: proto 1 1 @@ -4862,7 +4862,7 @@ get_account_info: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:932 + // smart_contracts/base_d_asa/contract.py:931 // return self.account[holding_address] box_get assert // check self.account entry exists @@ -4871,11 +4871,11 @@ get_account_info: // smart_contracts.base_d_asa.contract.BaseDAsa.get_time_events() -> bytes: get_time_events: - // smart_contracts/base_d_asa/contract.py:934-935 + // smart_contracts/base_d_asa/contract.py:933-934 // @arc4.abimethod(readonly=True) // def get_time_events(self) -> typ.TimeEvents: proto 0 1 - // smart_contracts/base_d_asa/contract.py:942 + // smart_contracts/base_d_asa/contract.py:941 // time_events = typ.TimeEvents() bytec 32 // 0x0000 // smart_contracts/base_d_asa/contract.py:101 @@ -4886,10 +4886,10 @@ get_time_events: assert // check self.status exists intc_3 // 100 == - // smart_contracts/base_d_asa/contract.py:943 + // smart_contracts/base_d_asa/contract.py:942 // if self.status_is_active(): bz get_time_events_after_if_else@2 - // smart_contracts/base_d_asa/contract.py:944 + // smart_contracts/base_d_asa/contract.py:943 // time_events = self.time_events.value.copy() bytec 11 // 0x74696d654576656e7473 box_get @@ -4898,7 +4898,7 @@ get_time_events: assert // check self.time_events exists get_time_events_after_if_else@2: - // smart_contracts/base_d_asa/contract.py:945 + // smart_contracts/base_d_asa/contract.py:944 // return time_events frame_dig 0 swap @@ -4907,25 +4907,25 @@ get_time_events_after_if_else@2: // smart_contracts.base_d_asa.contract.BaseDAsa.get_secondary_market_schedule() -> bytes: get_secondary_market_schedule: - // smart_contracts/base_d_asa/contract.py:947-948 + // smart_contracts/base_d_asa/contract.py:946-947 // @arc4.abimethod(readonly=True) // def get_secondary_market_schedule(self) -> typ.TimeEvents: proto 0 1 - // smart_contracts/base_d_asa/contract.py:950 + // smart_contracts/base_d_asa/contract.py:955 // arc4.UInt64(self.secondary_market_opening_date), intc_0 // 0 bytec 15 // "secondary_market_opening_date" app_global_get_ex assert // check self.secondary_market_opening_date exists itob - // smart_contracts/base_d_asa/contract.py:951 + // smart_contracts/base_d_asa/contract.py:956 // arc4.UInt64(self.secondary_market_closure_date), intc_0 // 0 bytec 16 // "secondary_market_closure_date" app_global_get_ex assert // check self.secondary_market_closure_date exists itob - // smart_contracts/base_d_asa/contract.py:949-952 + // smart_contracts/base_d_asa/contract.py:954-957 // return typ.TimeEvents( // arc4.UInt64(self.secondary_market_opening_date), // arc4.UInt64(self.secondary_market_closure_date), @@ -4939,11 +4939,11 @@ get_secondary_market_schedule: // smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_metadata() -> bytes: get_asset_metadata: - // smart_contracts/base_d_asa/contract.py:954-955 + // smart_contracts/base_d_asa/contract.py:959-960 // @arc4.abimethod(readonly=True) // def get_asset_metadata(self) -> typ.AssetMetadata: proto 0 1 - // smart_contracts/base_d_asa/contract.py:956 + // smart_contracts/base_d_asa/contract.py:967 // return typ.AssetMetadata(self.metadata) intc_0 // 0 bytec 25 // "metadata" @@ -4960,11 +4960,11 @@ get_asset_metadata: // smart_contracts.base_d_asa.contract.BaseDAsa.asset_update() -> void: asset_update: - // smart_contracts/base_d_asa/contract.py:466-467 + // smart_contracts/base_d_asa/contract.py:464-465 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def asset_update(self) -> None: proto 0 0 - // smart_contracts/base_d_asa/contract.py:471-474 + // smart_contracts/base_d_asa/contract.py:469-472 // # The reference implementation grants the update permissions to the Arranger. // # Other implementations may disable D-ASA application updatability or change its authorizations. // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they might introduce breaking changes. diff --git a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc32.json b/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc32.json index 310c232..39a001e 100644 --- a/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc32.json +++ b/smart_contracts/artifacts/fixed_coupon_bond/FixedCouponBond.arc32.json @@ -208,7 +208,7 @@ "no_op": "CALL" } }, - "get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)": { + "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)": { "read_only": true, "call_config": { "no_op": "CALL" @@ -221,6 +221,10 @@ "denomination_asset_id", "uint64" ], + [ + "settlement_asset_id", + "uint64" + ], [ "outstanding_principal", "uint64" @@ -326,7 +330,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLl9fYWxnb3B5X2VudHJ5cG9pbnRfd2l0aF9pbml0KCkgLT4gdWludDY0OgptYWluOgogICAgaW50Y2Jsb2NrIDAgMSA4IDEwMCA0NDggMjU1IDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NTIzMzMwMjMgImNpcmN1bGF0aW5nX3VuaXRzIiAic3RhdHVzIiAidG90YWxfY291cG9ucyIgImlzc3VhbmNlX2RhdGUiICJtYXR1cml0eV9kYXRlIiAweDAwIDB4MDAwMDAwMDAwMDAwMDAwMCAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczICJ1bml0X3ZhbHVlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJ0b3RhbF91bml0cyIgInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDUyMzIzMDIzICJzZXR0bGVtZW50X2Fzc2V0X2lkIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAic3VzcGVuZGVkIiAiZGVmYXVsdGVkIiAiZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIiAicGFpZF9jb3Vwb25fdW5pdHMiICJtZXRhZGF0YSIgImludGVyZXN0X3JhdGUiIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDEyIDB4MDAwMCAweDUyMzgzMDIzIDB4MDY4MTAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBSb2xlIEJhc2VkIEFjY2VzcyBDb250cm9sCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDE4IC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5LTYwCiAgICAvLyAjIEFzc2V0IENvbmZpZ3VyYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NS02NgogICAgLy8gIyBNZXRhZGF0YQogICAgLy8gc2VsZi5tZXRhZGF0YSA9IEJ5dGVzKCkKICAgIGJ5dGVjIDI1IC8vICJtZXRhZGF0YSIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4LTY5CiAgICAvLyAjIFN1cHBseQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3Mi03MwogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDI2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OS05MAogICAgLy8gIyBTdGF0dXMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU1QVFkpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAyMSAvLyAic3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MgogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjIgLy8gImRlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2LTM3CiAgICAvLyAjIFN0YXRlIHNjaGVtYSB2YWxpZGF0aW9uCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAxOSAvLyAxOQogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDAKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDItNDMKICAgIC8vICMgQ291cG9ucwogICAgLy8gc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgPSBVSW50NjQoKQogICAgYnl0ZWMgMjMgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBzZWxmLnBhaWRfY291cG9uX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDI0IC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMjgKICAgIHB1c2hieXRlc3MgMHg0ZmQ2YTNjYyAweDhjZjE0YjUxIDB4OWM3NmI2YTMgMHg0NDM2M2Q0OSAweDUzYmVmMDQ1IDB4NjdkYjRmMjAgMHhmNmE5NmM4ZCAweDYzZjk5NTg5IDB4ZDNhNGQ2YWIgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHgzMDFkZDkxOSAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGRkY2VjMDdiIC8vIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInBheV9jb3Vwb24oYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAicGF5X3ByaW5jaXBhbChhZGRyZXNzLGJ5dGVbXSkodWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKGFkZHJlc3MsdWludDY0KSh1aW50NjQsdWludDY0LCh1aW50NjQsdWludDY0KSkiLCBtZXRob2QgImdldF9jb3Vwb25fcmF0ZXMoKXVpbnQxNltdIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldF9jb3Vwb25zX3N0YXR1cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LCh1aW50NjQsdWludDY0KSxib29sKSIsIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNltdLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhc3NpZ25fcm9sZShhZGRyZXNzLHVpbnQ4LGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInJldm9rZV9yb2xlKGFkZHJlc3MsdWludDgpdWludDY0IiwgbWV0aG9kICJvcGVuX2FjY291bnQoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiY2xvc2VfYWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicHJpbWFyeV9kaXN0cmlidXRpb24oYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJzZXRfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2FjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfaW5mbygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wpIiwgbWV0aG9kICJnZXRfYWNjb3VudF9pbmZvKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCkiLCBtZXRob2QgImdldF90aW1lX2V2ZW50cygpdWludDY0W10iLCBtZXRob2QgImdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21ldGFkYXRhKClieXRlW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2Fzc2V0X3RyYW5zZmVyX3JvdXRlQDUgbWFpbl9wYXlfY291cG9uX3JvdXRlQDYgbWFpbl9wYXlfcHJpbmNpcGFsX3JvdXRlQDcgbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDggbWFpbl9nZXRfY291cG9uX3JhdGVzX3JvdXRlQDkgbWFpbl9nZXRfcGF5bWVudF9hbW91bnRfcm91dGVAMTAgbWFpbl9nZXRfY291cG9uc19zdGF0dXNfcm91dGVAMTEgbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAMTIgbWFpbl9hc3NldF9jb25maWdfcm91dGVAMTMgbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDE0IG1haW5fYXNzaWduX3JvbGVfcm91dGVAMTUgbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUAxNiBtYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxNyBtYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTggbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxOSBtYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDIwIG1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAyMSBtYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAyMiBtYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDIzIG1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAyNCBtYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAyNSBtYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDI2IG1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDI3CgptYWluX2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21ldGFkYXRhCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF9pbmZvX3JvdXRlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2FjY291bnRfaW5mbwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2RlZmF1bHRfc3RhdHVzX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2RlZmF1bHRfc3RhdHVzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2Fzc2V0X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY2xvc2VfYWNjb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBvcGVuX2FjY291bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiByZXZva2Vfcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2lnbl9yb2xlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X2NvbmZpZ19yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2V0X2NvbmZpZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGFzc2V0X2NyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfY291cG9uc19zdGF0dXNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfY291cG9uc19zdGF0dXMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfcGF5bWVudF9hbW91bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2NvdXBvbl9yYXRlc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2NvdXBvbl9yYXRlcwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwYXlfcHJpbmNpcGFsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3BheV9jb3Vwb25fcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGF5X2NvdXBvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICBwdXNoaW50IDQgLy8gNAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgbWF0Y2ggbWFpbl9hc3NldF91cGRhdGVAMjkKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDMwCgptYWluX2Fzc2V0X3VwZGF0ZUAyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NgogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY2LTQ2NwogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiBhc3NldF91cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIGNhbGxzdWIgYXNzZXRfdXBkYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5hc3NldF90cmFuc2ZlcihzZW5kZXJfaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXRfdHJhbnNmZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTUzLTE1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzZXRfdHJhbnNmZXIoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgICAgcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM6IGFyYzQuVUludDY0LAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODQKICAgIC8vIHVuaXRzLm5hdGl2ZSwKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5My0yOTYKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NC0yOTUKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NC0yOTYKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NgogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk1LTI5NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgZnJhbWVfZGlnIDQKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NC0yOTYKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTItMjk3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLlNFQ09OREFSWV9NQVJLRVRfQ0xPU0VECiAgICBhc3NlcnQgLy8gU2Vjb25kYXJ5IG1hcmtldCBpcyBjbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM2OS0zNzEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdHJhbnNmZXIgcmlnaHQgdG8gRC1BU0Egb3duZXJzLiBPdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IHJlbGF5IG9uIG90aGVyCiAgICAvLyAjIHJvbGVzLCBleHRlcm5hbCBBcHBzIHRocm91Z2ggQzJDIGNhbGxzIChlLmcuLCBhbiBvcmRlciBib29rKSwgb3Igb2ZmLWNoYWluIHRyYW5zZmVyIGFnZW50cy4KICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MubmF0aXZlLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3MgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUsIGVyci5TVVNQRU5ERUQKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50YyA0IC8vIDQ0OAogICAgZ2V0Yml0CiAgICBieXRlYyA3IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzctMzc5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0uc3VzcGVuZGVkLm5hdGl2ZSwgZXJyLlNVU1BFTkRFRAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50YyA0IC8vIDQ0OAogICAgZ2V0Yml0CiAgICBieXRlYyA3IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODEKICAgIC8vIHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIDUKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODAtMzgyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICksIGVyci5PVkVSX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzkwCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTEKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSA+IDA6CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnogYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDQKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA1CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNAogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDMtMzA2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLk5PTl9GVU5HSUJMRV9VTklUUwogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgdW5pdHMgYXJlIG5vdCBmdW5naWJsZQoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODctMTg4CiAgICAvLyAjIFRyYW5zZmVyIGlzIGZvcmJpZGRlbiBpbiBjYXNlIG9mIHBlbmRpbmcgY291cG9uIHBheW1lbnRzCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4OQogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMwogICAgZGlnIDEKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOTEtMTkyCiAgICAvLyAjIFRyYW5zZmVycmVkIHVuaXRzIHZhbHVlIChtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSB0aGUgdHJhbnNmZXIpCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTkzLTE5NQogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlLCBkdWVfY291cG9ucwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI3CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjYtNDI4CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNgogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNi00MjgKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgLSB1bml0cwogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzAKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjktNDMxCiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjkKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyOS00MzEKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNTMKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSA9PSAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJueiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBhcmM0LlVJbnQ2NCgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA4IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAwCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQodW5pdHMubmF0aXZlICogc2VuZGVyX3VuaXRfdmFsdWUubmF0aXZlICsgYWNjcnVlZF9pbnRlcmVzdCkKICAgIGZyYW1lX2RpZyAwCiAgICBidG9pCiAgICBmcmFtZV9kaWcgNQogICAgKgogICAgZnJhbWVfZGlnIDMKICAgICsKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAxNQoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk2CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gc2VuZGVyX3VuaXRfdmFsdWUKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgcmVwbGFjZTIgNDAKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTctMzk5CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5wYWlkX2NvdXBvbnMKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5Ny0zOTkKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnBhaWRfY291cG9ucwogICAgc3dhcAogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNwoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2RlZmF1bHRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNy0xMDgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTExLTExMgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAic3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5jb3VudF9kdWVfY291cG9ucygpIC0+IHVpbnQ2NDoKY291bnRfZHVlX2NvdXBvbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NTAtNTEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291bnRfZHVlX2NvdXBvbnMoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1MgogICAgLy8gY3VycmVudF90cyA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1MwogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmR1ZV9jb3Vwb25zX3dhdGVybWFyawogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJkdWVfY291cG9uc193YXRlcm1hcmsiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBpZiBjdXJyZW50X3RzID49IHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICA+PQogICAgYnogY291bnRfZHVlX2NvdXBvbnNfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1NQogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKCmNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NwogICAgLy8gc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgPSBkdWVfY291cG9ucwogICAgYnl0ZWMgMjMgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjgKICAgIC8vIHJldHVybiBkdWVfY291cG9ucwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmNvdW50X2R1ZV9jb3Vwb25zX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBlbGlmIGN1cnJlbnRfdHMgPiBzZWxmLmlzc3VhbmNlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBjb3Vwb25faWR4ID0gVUludDY0KGNmZy5GSVJTVF9DT1VQT05fREFURV9JRFgpICsgc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAiZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR1ZV9jb3Vwb25zX3dhdGVybWFyayBleGlzdHMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlW2NvdXBvbl9pZHhdLm5hdGl2ZQogICAgYnl0ZWMgMTEgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKCmNvdW50X2R1ZV9jb3Vwb25zX3doaWxlX3RvcEA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU5CiAgICAvLyB3aGlsZSBjdXJyZW50X3RzID49IGNvdXBvbl9kdWVfZGF0ZToKICAgIGZyYW1lX2RpZyAxCiAgICA8PQogICAgYnogY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfd2hpbGVANgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjYxCiAgICAvLyByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9DT1VQT05fRFVFX0NPVU5USU5HKSwKICAgIGludGMgNSAvLyAyNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2MgogICAgLy8gZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0LAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2MC02MwogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9DT1VQT05fRFVFX0NPVU5USU5HKSwKICAgIC8vICAgICBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQsCiAgICAvLyApCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NAogICAgLy8gY291cG9uX2lkeCArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjUKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYudGltZV9ldmVudHMudmFsdWVbY291cG9uX2lkeF0ubmF0aXZlCiAgICBieXRlYyAxMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYiBjb3VudF9kdWVfY291cG9uc193aGlsZV90b3BANAoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfd2hpbGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NgogICAgLy8gZHVlX2NvdXBvbnMgPSBjb3Vwb25faWR4IC0gY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAtCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUA4CgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBkdWVfY291cG9uczogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo5Mi05NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6OTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6OTYtOTgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID09IGR1ZV9jb3Vwb25zCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiB1aW50NjQsIGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTMyLTEzNQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IFVJbnQ2NCwgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgYXNzZXJ0IHNhZmVndWFyZHMgdGhlIHN1YnJvdXRpbmUgZnJvbSBmb3JiaWRkZW4gaW52b2NhdGlvbnMKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTM4CiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMzkKICAgIC8vIGNvdXBvbl9hY2NydWVkX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDAKICAgIC8vIGNvdXBvbl9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQxCiAgICAvLyBuZXh0X2NvdXBvbl9yYXRlX2JwcyA9IHNlbGYuY291cG9uX3JhdGVzLnZhbHVlWwogICAgYnl0ZWMgMTcgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcmF0ZXMgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQxLTE0MwogICAgLy8gbmV4dF9jb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVsKICAgIC8vICAgICBkdWVfY291cG9ucwogICAgLy8gXS5uYXRpdmUgICMgZHVlX2NvdXBvbnMgaXMgZXF1YWwgdG8gdGhlIDAtYmFzZSBpZHggb2YgbmV4dCBjb3Vwb24KICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUtMTQ2CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUtMTQ3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDkKICAgIC8vIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUtMTUwCiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICAvLyAvLyAoCiAgICAvLyAgICAgY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QKICAgIC8vICkgICMgZGl2LWJ5LXplcm86IGNvdXBvbl9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCBjaGVja3MKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDQtMTUxCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gICAgICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgIC8vICAgICAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gICAgIC8vICgKICAgIC8vICAgICAgICAgY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QKICAgIC8vICAgICApICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQgY2hlY2tzCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gYnl0ZXM6CmRheV9jb3VudF9mYWN0b3I6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTA3LTEwOAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBkYXlfY291bnRfZmFjdG9yKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IHR5cC5EYXlDb3VudEZhY3RvcjoKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMDktMTEwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGlmIG5vdCBkdWVfY291cG9uczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMTEKICAgIC8vIGFjY3J1aW5nX3N0YXJ0X3RpbWUgPSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMTQKICAgIC8vIGNvdXBvbl9hY2NydWVkX3BlcmlvZCA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIC0gYWNjcnVpbmdfc3RhcnRfdGltZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZGlnIDEKICAgIC0KICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE1CiAgICAvLyBjb3Vwb25fcGVyaW9kID0gc2VsZi5uZXh0X2NvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucykgLSBhY2NydWluZ19zdGFydF90aW1lCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgbmV4dF9jb3Vwb25fZHVlX2RhdGUKICAgIHN3YXAKICAgIC0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE2CiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID09IFVJbnQ2NChjc3QuRENDX0FfQSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxCiAgICBieiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQ5CiAgICAvLyByZXR1cm4gdGltZV9wZXJpb2QgLy8gVUludDY0KGNzdC5EQVlfMl9TRUMpCiAgICBmcmFtZV9kaWcgMAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAvCiAgICBmcmFtZV9kaWcgMwogICAgaW50YyA2IC8vIDg2NDAwCiAgICAvCiAgICBmcmFtZV9idXJ5IDQKICAgIGZyYW1lX2J1cnkgMQoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjAKICAgIC8vIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChjb3Vwb25fYWNjcnVlZF9wZXJpb2QpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoY291cG9uX3BlcmlvZCksCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE5LTEyMgogICAgLy8gcmV0dXJuIHR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQoY291cG9uX2FjY3J1ZWRfcGVyaW9kKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChjb3Vwb25fcGVyaW9kKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzYKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzcKICAgIC8vIGlmIGR1ZV9jb3Vwb25zID49IFVJbnQ2NCgxKToKICAgIGZyYW1lX2RpZyAtMQogICAgYnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo3OAogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gc2VsZi5jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgY291cG9uX2R1ZV9kYXRlCiAgICBmcmFtZV9idXJ5IDIKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA4OgogICAgZnJhbWVfZGlnIDIKICAgIGIgZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmNvdXBvbl9kdWVfZGF0ZShjb3Vwb246IHVpbnQ2NCkgLT4gdWludDY0Ogpjb3Vwb25fZHVlX2RhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzAtNzEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291cG9uX2R1ZV9kYXRlKHNlbGYsIGNvdXBvbjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo3MgogICAgLy8gcmV0dXJuIHNlbGYudGltZV9ldmVudHMudmFsdWVbY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWCArIGNvdXBvbiAtIDFdLm5hdGl2ZQogICAgcHVzaGludCAzIC8vIDMKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGJ5dGVjIDExIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfZXZlbnRzIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLm5leHRfY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKbmV4dF9jb3Vwb25fZHVlX2RhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODEtODIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbmV4dF9jb3Vwb25fZHVlX2RhdGUoc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODMKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBpZiBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9uczoKICAgIGR1cAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBieiBuZXh0X2NvdXBvbl9kdWVfZGF0ZV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo4NQogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gc2VsZi5jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMgKyAxKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgY2FsbHN1YiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2J1cnkgMAoKbmV4dF9jb3Vwb25fZHVlX2RhdGVfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyByZXR1cm4gY291cG9uX2R1ZV9kYXRlCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY291bnRfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzUtMzM4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzkKICAgIC8vIHJldHVybiB1bml0cyAqIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUubmF0aXZlCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLnBheV9jb3Vwb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9pbmZvOiBieXRlcykgLT4gYnl0ZXM6CnBheV9jb3Vwb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAyLTIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X2NvdXBvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjUtMjI2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjI3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzAKICAgIC8vIHVuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzEKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5OT19VTklUUwogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjMyCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gYWNjb3VudF9wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzQKICAgIC8vIGFzc2VydCBkdWVfY291cG9ucyA+IGFjY291bnRfcGFpZF9jb3Vwb25zLCBlcnIuTk9fRFVFX0NPVVBPTgogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBObyBkdWUgY291cG9uIHRvIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzNS0yMzgKICAgIC8vICMgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHZlcmlmeSBpZiBvdGhlciBhY2NvdW50cyBhcmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHBheW1lbnQgb2YgcHJldmlvdXMgY291cG9ucwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgYWNjb3VudF9wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDEKICAgIC8vIGlmIHNlbGYuaXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgaXNfcGF5bWVudF9leGVjdXRhYmxlCiAgICBieiBwYXlfY291cG9uX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQzCiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQ0CiAgICAvLyBhY2NvdW50X3BhaWRfY291cG9ucyArIDEsCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDItMjQ1CiAgICAvLyBwYXltZW50X2Ftb3VudCA9IHNlbGYuY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIC8vICAgICBhY2NvdW50X3BhaWRfY291cG9ucyArIDEsCiAgICAvLyApCiAgICBjYWxsc3ViIGNvdXBvbl9pbnRlcmVzdF9hbW91bnQKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0Ni0yNDcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gcGF5bWVudCBhZ2VudAogICAgLy8gc2VsZi5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50KQogICAgY2FsbHN1YiBhc3NlcnRfZW5vdWdoX2Z1bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQ4LTI0OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgc2FtZSBhc3NldCBmb3IgZGVub21pbmF0aW9uIGFuZCBzZXR0bGVtZW50LCBubyBjb252ZXJzaW9uIG5lZWRlZAogICAgLy8gc2VsZi5wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCBwYXltZW50X2Ftb3VudCkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgY2FsbHN1YiBwYXkKCnBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zLm5hdGl2ZSArIDEKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NC0yNTYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjU0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NC0yNTYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiA0OAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NwogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYWlkX2NvdXBvbl91bml0cyBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBieXRlYyAyNCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNjAKICAgIC8vIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjU4LTI2MgogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICAvLyAgICAgdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mby5jb3B5KCksICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBjb25jYXQKICAgIGJ5dGVjIDMxIC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnBheV9jb3Vwb25fZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjUxLTI1MgogICAgLy8gIyBBY2NvdW50cyBzdXNwZW5kZWQgb3Igbm90IG9wdGVkIGluIGF0IHRoZSB0aW1lIG9mIHBheW1lbnRzIG11c3Qgbm90IHN0YWxsIHRoZSBELUFTQQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X2NvdXBvbl9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWxsX2R1ZV9jb3Vwb25zX3BhaWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODgtODkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWxsX2R1ZV9jb3Vwb25zX3BhaWQoc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjkwCiAgICAvLyByZXR1cm4gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA+PSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogZHVlX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgID49CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogppc19wYXltZW50X2V4ZWN1dGFibGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDgtMzA5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGlzX3BheW1lbnRfZXhlY3V0YWJsZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzExCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzEyCiAgICAvLyBBc3NldChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzExLTMxMwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIC8vICAgICBBc3NldChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCkKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTEtMzE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgLy8gICAgIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBieiBpc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTQKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDcgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCmlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTAtMzE1CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgICAgIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgLy8gICAgICkKICAgIC8vICAgICBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUKICAgIC8vICkKICAgIHN3YXAKICAgIHJldHN1YgoKaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICBiIGlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKYWNjb3VudF90b3RhbF91bml0c192YWx1ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0MS0zNDIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWNjb3VudF90b3RhbF91bml0c192YWx1ZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDQKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQzLTM0NQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuY291cG9uX2ludGVyZXN0X2Ftb3VudChwcmluY2lwYWxfYW1vdW50OiB1aW50NjQsIGNvdXBvbjogdWludDY0KSAtPiB1aW50NjQ6CmNvdXBvbl9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTAwLTEwMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjb3Vwb25faW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYsIHByaW5jaXBhbF9hbW91bnQ6IFVJbnQ2NCwgY291cG9uOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTA0CiAgICAvLyBjb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVtjb3Vwb24gLSAxXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGJ5dGVjIDE3IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3JhdGVzIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTA1CiAgICAvLyByZXR1cm4gcHJpbmNpcGFsX2Ftb3VudCAqIGNvdXBvbl9yYXRlX2JwcyAvLyBjc3QuQlBTCiAgICBmcmFtZV9kaWcgLTIKICAgICoKICAgIHB1c2hpbnQgMTAwMDAgLy8gMTAwMDAKICAgIC8KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9lbm91Z2hfZnVuZHMocGF5bWVudF9hbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKYXNzZXJ0X2Vub3VnaF9mdW5kczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNy0zMTgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2Vub3VnaF9mdW5kcyhzZWxmLCBwYXltZW50X2Ftb3VudDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjEKICAgIC8vIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjAKICAgIC8vIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5iYWxhbmNlKAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjAtMzIyCiAgICAvLyBBc3NldChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCkuYmFsYW5jZSgKICAgIC8vICAgICBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyMC0zMjMKICAgIC8vIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5iYWxhbmNlKAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICkKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTktMzI0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5iYWxhbmNlKAogICAgLy8gICAgICAgICBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyAgICAgKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5wYXkocmVjZWl2ZXI6IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKcGF5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI2LTMyNwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBwYXkoc2VsZiwgcmVjZWl2ZXI6IGFyYzQuQWRkcmVzcywgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyOC0zMzMKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMyCiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI5CiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI4LTMzMwogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLm5hdGl2ZSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5wYXlfcHJpbmNpcGFsKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfaW5mbzogYnl0ZXMpIC0+IGJ5dGVzOgpwYXlfcHJpbmNpcGFsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI2NC0yNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHBheV9wcmluY2lwYWwoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfaW5mbzogYXJjNC5EeW5hbWljQnl0ZXMKICAgIC8vICkgLT4gdHlwLlBheW1lbnRSZXN1bHQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYtNDM3CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwbiAyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDEKICAgIC8vIHVuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQzCiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5tYXR1cml0eV9kYXRlLCBlcnIuTk9UX01BVFVSRQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IG1hdHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI5MQogICAgLy8gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mjg5LTI5MgogICAgLy8gIyBQcmluY2lwYWwgcGF5bWVudCBpcyBmb3JiaWRkZW4gaW4gY2FzZSBvZiBwZW5kaW5nIGNvdXBvbiBwYXltZW50cwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mjk1CiAgICAvLyBpZiBzZWxmLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGlzX3BheW1lbnRfZXhlY3V0YWJsZQogICAgYnogcGF5X3ByaW5jaXBhbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI5NgogICAgLy8gcGF5bWVudF9hbW91bnQgPSBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI5Ny0yOTgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gcGF5bWVudCBhZ2VudAogICAgLy8gc2VsZi5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50KQogICAgY2FsbHN1YiBhc3NlcnRfZW5vdWdoX2Z1bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mjk5LTMwMAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgc2FtZSBhc3NldCBmb3IgZGVub21pbmF0aW9uIGFuZCBzZXR0bGVtZW50LCBubyBjb252ZXJzaW9uIG5lZWRlZAogICAgLy8gc2VsZi5wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCBwYXltZW50X2Ftb3VudCkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgY2FsbHN1YiBwYXkKCnBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC0KICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA4IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgMzIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1MgogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMDcKICAgIC8vIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzA4CiAgICAvLyB0aW1lc3RhbXA9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMwNi0zMTAKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudFJlc3VsdCgKICAgIC8vICAgICBhbW91bnQ9YXJjNC5VSW50NjQocGF5bWVudF9hbW91bnQpLAogICAgLy8gICAgIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8uY29weSgpLCAgIyBUT0RPOiBBZGQgaW5mbyBvbiBmYWlsZWQgcGF5bWVudAogICAgLy8gKQogICAgY29uY2F0CiAgICBieXRlYyAzMSAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKcGF5X3ByaW5jaXBhbF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMDItMzAzCiAgICAvLyAjIEFjY291bnRzIHN1c3BlbmRlZCBvciBub3Qgb3B0ZWQgaW4gYXQgdGhlIHRpbWUgb2YgcGF5bWVudHMgbXVzdCBub3Qgc3RhbGwgdGhlIEQtQVNBCiAgICAvLyBwYXltZW50X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYiBwYXlfcHJpbmNpcGFsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpIC0+IHZvaWQ6CmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1Ny0zNTgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1OQogICAgLy8gaWYgc2VsZi5jaXJjdWxhdGluZ191bml0cyA9PSAwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgYm56IGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM2MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGludGMgNyAvLyAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CgplbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzEyLTMxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IHR5cC5DdXJyZW50VW5pdHNWYWx1ZToKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzMzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMzMy0zMzQKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzM0CiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzMzLTMzNAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzItMzM1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyApLCBlcnIuTk9fUFJJTUFSWV9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzM4CiAgICAvLyAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDcKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBiPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzM3LTMzOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9VTklUUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYW1vdW50IG9mIHVuaXRzIGZvciB0aGUgYWNjb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNDEtMzQ0CiAgICAvLyAjIFZhbHVlIGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0NS0zNDYKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uIGFuZCBhdCBtYXR1cml0eQogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzQ3CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0OAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1MC0zNTEKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1MgogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0yCiAgICBkaWcgMQogICAgY2FsbHN1YiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1MwogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTQKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTUtMzU3CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gc2VsZi5hY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZSwgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDYKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzU4CiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTkKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSAzCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzYxCiAgICAvLyB1bml0c192YWx1ZT1hcmM0LlVJbnQ2NChhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUpLAogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjIKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICBmcmFtZV9kaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICBmcmFtZV9kaWcgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2NQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjMtMzY2CiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzYwLTM2NwogICAgLy8gcmV0dXJuIHR5cC5DdXJyZW50VW5pdHNWYWx1ZSgKICAgIC8vICAgICB1bml0c192YWx1ZT1hcmM0LlVJbnQ2NChhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUpLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICAvLyAgICAgZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAOAoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuaXNfYWNjcnVpbmdfaW50ZXJlc3QoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0Ogppc19hY2NydWluZ19pbnRlcmVzdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjQtMTI1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGlzX2FjY3J1aW5nX2ludGVyZXN0KHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjcKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyNy0xMjkKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI3LTEyOQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgYnogaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI5CiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMAogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gYW5kIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zCiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI2LTEzMAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMAogICAgLy8gICAgIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIC8vICkKICAgIHJldHN1YgoKaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjYtMTMwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5nZXRfY291cG9uX3JhdGVzKCkgLT4gYnl0ZXM6CmdldF9jb3Vwb25fcmF0ZXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzY5LTM3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2NvdXBvbl9yYXRlcyhzZWxmKSAtPiB0eXAuQ291cG9uUmF0ZXM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNzcKICAgIC8vIGNvdXBvbl9yYXRlcyA9IHR5cC5Db3Vwb25SYXRlcygpCiAgICBieXRlYyAzMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mzc4CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF9jb3Vwb25fcmF0ZXNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mzc5CiAgICAvLyBjb3Vwb25fcmF0ZXMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDE3IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcmF0ZXMgZXhpc3RzCgpnZXRfY291cG9uX3JhdGVzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozODAKICAgIC8vIHJldHVybiBjb3Vwb25fcmF0ZXMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9wYXltZW50X2Ftb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3BheW1lbnRfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM4Mi0zODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wYXltZW50X2Ftb3VudChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLlBheW1lbnRBbW91bnRzOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mzk3CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOTctMzk4CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBVSW50NjQoKQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOTkKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwMAogICAgLy8gcGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zLm5hdGl2ZQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gaWYgcGFpZF9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIDwKICAgIGJ6IGdldF9wYXltZW50X2Ftb3VudF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwNQogICAgLy8gcGFpZF9jb3Vwb25zICsgMSwKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwMi00MDYKICAgIC8vICMgQ291cG9uIFBheW1lbnQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnMgKyAxLAogICAgLy8gKQogICAgY2FsbHN1YiBjb3Vwb25faW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDIKCmdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSA1CgpnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDExCiAgICAvLyBpbnRlcmVzdD1hcmM0LlVJbnQ2NChpbnRlcmVzdF9hbW91bnQpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQxMgogICAgLy8gcHJpbmNpcGFsPWFyYzQuVUludDY0KHByaW5jaXBhbF9hbW91bnQpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQxMC00MTMKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9YXJjNC5VSW50NjQoaW50ZXJlc3RfYW1vdW50KSwKICAgIC8vICAgICBwcmluY2lwYWw9YXJjNC5VSW50NjQocHJpbmNpcGFsX2Ftb3VudCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfcGF5bWVudF9hbW91bnRfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDA4LTQwOQogICAgLy8gIyBQcmluY2lwYWwgUGF5bWVudAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgZnJhbWVfYnVyeSAzCiAgICBiIGdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDQKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9jb3Vwb25zX3N0YXR1cygpIC0+IGJ5dGVzOgpnZXRfY291cG9uc19zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDE1LTQxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2NvdXBvbnNfc3RhdHVzKHNlbGYpIC0+IHR5cC5Db3Vwb25zSW5mbzoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyNAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyNQogICAgLy8gbmV4dF9jb3Vwb25fZHVlX2RhdGUgPSBzZWxmLm5leHRfY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zKQogICAgY2FsbHN1YiBuZXh0X2NvdXBvbl9kdWVfZGF0ZQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyNgogICAgLy8gYWxsX2R1ZV9jb3Vwb25zX3BhaWQgPSBzZWxmLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zKQogICAgZHVwCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDI3CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MjgKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDI5CiAgICAvLyBpZiBzZWxmLmlzX2FjY3J1aW5nX2ludGVyZXN0KGR1ZV9jb3Vwb25zKToKICAgIGNhbGxzdWIgaXNfYWNjcnVpbmdfaW50ZXJlc3QKICAgIGJ6IGdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzAKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgMAogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDMxCiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzIKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSA0CgpnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzNAogICAgLy8gdG90YWxfY291cG9ucz1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX2NvdXBvbnMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzUKICAgIC8vIGR1ZV9jb3Vwb25zPWFyYzQuVUludDY0KGR1ZV9jb3Vwb25zKSwKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDM2CiAgICAvLyBuZXh0X2NvdXBvbl9kdWVfZGF0ZT1hcmM0LlVJbnQ2NChuZXh0X2NvdXBvbl9kdWVfZGF0ZSksCiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzOAogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzOQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzctNDQwCiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDQxCiAgICAvLyBhbGxfZHVlX2NvdXBvbnNfcGFpZD1hcmM0LkJvb2woYWxsX2R1ZV9jb3Vwb25zX3BhaWQpLAogICAgYnl0ZWMgNyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzMy00NDIKICAgIC8vIHJldHVybiB0eXAuQ291cG9uc0luZm8oCiAgICAvLyAgICAgdG90YWxfY291cG9ucz1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX2NvdXBvbnMpLAogICAgLy8gICAgIGR1ZV9jb3Vwb25zPWFyYzQuVUludDY0KGR1ZV9jb3Vwb25zKSwKICAgIC8vICAgICBuZXh0X2NvdXBvbl9kdWVfZGF0ZT1hcmM0LlVJbnQ2NChuZXh0X2NvdXBvbl9kdWVfZGF0ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhbGxfZHVlX2NvdXBvbnNfcGFpZD1hcmM0LkJvb2woYWxsX2R1ZV9jb3Vwb25zX3BhaWQpLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfY3JlYXRlKGFycmFuZ2VyOiBieXRlcywgbWV0YWRhdGE6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jcmVhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTQtNDU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBhc3NldF9jcmVhdGUoc2VsZiwgYXJyYW5nZXI6IGFyYzQuQWRkcmVzcywgbWV0YWRhdGE6IHR5cC5Bc3NldE1ldGFkYXRhKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjMKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlci5uYXRpdmUKICAgIGJ5dGVjIDE4IC8vIDB4NTIzMjMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NAogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NvbmZpZyhkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGJ5dGVzLCBzZXR0bGVtZW50X2Fzc2V0X2lkOiBieXRlcywgcHJpbmNpcGFsOiBieXRlcywgbWluaW11bV9kZW5vbWluYXRpb246IGJ5dGVzLCBkYXlfY291bnRfY29udmVudGlvbjogYnl0ZXMsIGludGVyZXN0X3JhdGU6IGJ5dGVzLCBjb3Vwb25fcmF0ZXM6IGJ5dGVzLCB0aW1lX2V2ZW50czogYnl0ZXMsIHRpbWVfcGVyaW9kczogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NvbmZpZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3Ni00ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X2NvbmZpZygKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb246IGFyYzQuVUludDgsCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZTogYXJjNC5VSW50MTYsCiAgICAvLyAgICAgY291cG9uX3JhdGVzOiB0eXAuQ291cG9uUmF0ZXMsCiAgICAvLyAgICAgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzLAogICAgLy8gICAgIHRpbWVfcGVyaW9kczogdHlwLlRpbWVQZXJpb2RzLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gOSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUxNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTE4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTVBUWSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjAtNTIxCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC05CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gZGVub21pbmF0aW9uX2Fzc2V0X2lkICE9IFVJbnQ2NCgwKSBhbmQgQXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5jcmVhdG9yCiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUA0CiAgICBmcmFtZV9kaWcgMwogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc1LTE3OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBkZW5vbWluYXRpb24gd2l0aCBBU0EKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZGVub21pbmF0aW9uX2Fzc2V0X2lkICE9IFVJbnQ2NCgwKSBhbmQgQXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5jcmVhdG9yCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBEZW5vbWluYXRpb24gYXNzZXQgaXMgbm90IHByb3Blcmx5IHNldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTgyCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IGRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgYnl0ZWMgOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjQtNTI1CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTgKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICBkaWcgMQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4Ni0xODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0yMDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NgogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NwogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTgKICAgIC8vIGFzc2V0X2Ftb3VudD0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0xOTUKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk0LTIwMAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMAogICAgLy8gcHJpbmNpcGFsLm5hdGl2ZSAlIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZSA9PSAwCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtNgogICAgYnRvaQogICAgZHVwMgogICAgJQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI4LTUzMQogICAgLy8gIyBTZXQgUHJpbmNpcGFsIGFuZCBNaW5pbXVtIERlbm9taW5hdGlvbgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIC8vICksIGVyci5JTlZBTElEX01JTklNVU1fREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gTWluaW11bSBkZW5vbWluYXRpb24gaXMgbm90IGEgZGl2aXNvciBvZiBwcmluY2lwYWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMgogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gcHJpbmNpcGFsLm5hdGl2ZSAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIC8KICAgIGJ5dGVjIDE0IC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzUtNTM2CiAgICAvLyAjIFNldCBEYXktQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5hc3NlcnRfZGF5X2NvdW50X2NvbnZlbnRpb24oZGF5X2NvdW50X2NvbnZlbnRpb24ubmF0aXZlKQogICAgZnJhbWVfZGlnIC01CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA2CiAgICAvLyBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgaW50Y18zIC8vIDEwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA0LTIwOAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJueiBhc3NldF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBmcmFtZV9kaWcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA3CiAgICAvLyBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIGludGMgNSAvLyAyNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNwoKYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTIKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBkYXlfY291bnRfY29udmVudGlvbgogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzktNTQwCiAgICAvLyAjIFNldCBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLmFzc2VydF9pbnRlcmVzdF9yYXRlKGludGVyZXN0X3JhdGUubmF0aXZlKQogICAgZnJhbWVfZGlnIC00CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTYKICAgIC8vIGFzc2VydCBpbnRlcmVzdF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9JTlRFUkVTVF9SQVRFCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjAKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDI2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0OAogICAgLy8gYXNzZXJ0IGNvdXBvbl9yYXRlcy5sZW5ndGgsIGVyci5JTlZBTElEX0NPVVBPTl9SQVRFUwogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIENvdXBvbiByYXRlcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gY291cG9uX3JhdGVzLmxlbmd0aAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjkKICAgIC8vIGlmIHNlbGYudG90YWxfY291cG9uczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjMwCiAgICAvLyBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZSA9IGNvdXBvbl9yYXRlcy5jb3B5KCkKICAgIGJ5dGVjIDE3IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAxNyAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGZyYW1lX2RpZyAtMwogICAgYm94X3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzUKICAgIC8vIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgICsKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzQtMjM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDkKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjAKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDExIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTEgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEtMjYzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjYxLTI2MwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjQtMjY2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDIwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjQtMjY2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NwogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gdGltZV9ldmVudHNbY2ZnLklTU1VBTkNFX0RBVEVfSURYXS5uYXRpdmUKICAgIGV4dHJhY3QgMTYgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5LTI3MAogICAgLy8gIyBTb21lIEQtQVNBIG1heSBub3QgaGF2ZSBhIG1hdHVyaXR5IGRhdGUgKGUuZy4sIHBlcnBldHVhbHMpCiAgICAvLyBpZiB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgICsKICAgID09CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjcxCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzUKICAgIC8vIGFzc2VydCBub3QgdGltZV9wZXJpb2RzLmxlbmd0aCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1NgogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBpbnRjXzMgLy8gMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgphc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4Cgphc3NldF9jb25maWdfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE1LTExNgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5hcnJhbmdlci52YWx1ZSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzOC0yMzkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWxmLCB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDEKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDIKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MS0yNDIKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MC0yNDMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gICAgID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUUKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDQKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ2CiAgICAvLyByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9USU1FX0VWRU5UX1NPUlRJTkcpLAogICAgcHVzaGludCA2NSAvLyA2NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ3CiAgICAvLyBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuQXBwQWNjb3VudCwgICMgQXBwIGZ1bmRzIGFyZSBub3QgYXQgcmlzayBzaW5jZSBjYWxsZXIgaXMgdHJ1c3RlZAogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NS0yNDgKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PVVJbnQ2NChjZmcuT1BfVVBfVElNRV9FVkVOVF9TT1JUSU5HKSwKICAgIC8vICAgICBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuQXBwQWNjb3VudCwgICMgQXBwIGZ1bmRzIGFyZSBub3QgYXQgcmlzayBzaW5jZSBjYWxsZXIgaXMgdHJ1c3RlZAogICAgLy8gKQogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW190XS5uYXRpdmUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUwCiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tfdCArIDFdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUyCiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGludGMgNSAvLyAyNTUKICAgICE9CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUzLTI1NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUzLTI1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIC8vICAgICBjc3QuREFZXzJfU0VDCiAgICAvLyApID09IDAsIGVyci5JTlZBTElEX1RJTUVfUEVSSU9ECiAgICBpbnRjIDYgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTgtNTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU3OQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDcgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4MwogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODQKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODUKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODcKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4OC01OTAKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4Ny01OTAKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODYtNTkxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTItNTk0CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NQogICAgLy8gaWYgc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OQogICAgLy8gY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OC02MDAKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5Ny02MDAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYtNjAxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDItNjA0CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA3CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA2LTYwOAogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOS02MTEKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDUtNjEyCiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNC02MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzcKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM4CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzOQogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0MQogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0MgogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ2CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDUtNjc0CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OAogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzMgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjctNjY5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3MQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjcwLTY3MgogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNyAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjUKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjIKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU2CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI5IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1OAogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3LTY1OQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTAKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDMwIC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5LTY1MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTMKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1Mi02NTQKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ3CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgMTggLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NpZ25fcm9sZV9ib29sX21lcmdlQDgKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5yZXZva2Vfcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcykgLT4gYnl0ZXM6CnJldm9rZV9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc3LTY3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmV2b2tlX3JvbGUoc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTcKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk4CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk3LTcwMwogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2CgpyZXZva2Vfcm9sZV9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgpyZXZva2Vfcm9sZV9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDUtNzA2CiAgICAvLyAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAgLy8gNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDQtNzIyCiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAOCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDkgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMyAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjAKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNyAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTcKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjggLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE0CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTAKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOSAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTEKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzAgLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIHJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLm9wZW5fYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKb3Blbl9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1LTcyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3Blbl9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ1CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA3IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUzCiAgICAvLyB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MS03NTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTQKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU1CiAgICAvLyBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU2CiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICBieXRlYyA3IC8vIDB4MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MS03NTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTgKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTktMTIwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgYnl0ZWMgMzAgLy8gMHg1MjM0MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjMtMTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfbWFuYWdlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNQogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNC0xMjYKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfbWFuYWdlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEyNgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNC0xMjYKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgphc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjItMTI3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gICAgIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgphc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5jbG9zZV9hY2NvdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpjbG9zZV9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwLTc2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xvc2VfYWNjb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlR1cGxlW2FyYzQuVUludDY0LCBhcmM0LlVJbnQ2NF06CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3OAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MgogICAgLy8gY2xvc2VkX3VuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODMKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UICsgaG9sZGluZ19hZGRyZXNzLmJ5dGVzKQogICAgc3dhcAogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODQKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgLQogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg1CiAgICAvLyBzZWxmLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpCiAgICBjYWxsc3ViIGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg3CiAgICAvLyAoYXJjNC5VSW50NjQoY2xvc2VkX3VuaXRzKSwgYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApKQogICAgaXRvYgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg2LTc4OAogICAgLy8gcmV0dXJuIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIC8vICkKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EucHJpbWFyeV9kaXN0cmlidXRpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTAtNzkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODQtMjg3CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NS0yODYKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg3CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg2LTI4NwogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg3CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODMtMjg4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzMKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBieXRlYyAyOSAvLyAweDUyMzUzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzMtMTM2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM1CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNS0xMzYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNC0xMzYKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzItMTM3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgxOAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIwCiAgICAvLyBhc3NlcnQgdW5pdHMubmF0aXZlID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyMgogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjEtODIzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI1CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICs9IHVuaXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNi04MjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNi04MjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IGFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBzd2FwCiAgICByZXBsYWNlMiA0MAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMwCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyAtIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgLQogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYXNzZXRfc3VzcGVuc2lvbihzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzItODMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYXNzZXRfc3VzcGVuc2lvbihzZWxmLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0NgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDcKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KHN1c3BlbmRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDIxIC8vICJzdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ5LTE1MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNzMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzLTE1NgogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NC0xNTUKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU2CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NS0xNTYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU2CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUyLTE1NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vICAgICBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2FjY291bnRfc3VzcGVuc2lvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2FjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1MC04NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hY2NvdW50X3N1c3BlbnNpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHN1c3BlbmRlZDogYXJjNC5Cb29sCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGludGMgNCAvLyA0NDgKICAgIHN3YXAKICAgIHNldGJpdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfZGVmYXVsdF9zdGF0dXMoZGVmYXVsdGVkOiBieXRlcykgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODczLTg3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2RlZmF1bHRfc3RhdHVzKHNlbGYsIGRlZmF1bHRlZDogYXJjNC5Cb29sKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBieXRlYyAyOCAvLyAweDUyMzYzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDMtMTQ2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1LTE0NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Mi0xNDcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gICAgIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODUKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KGRlZmF1bHRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9pbmZvKCkgLT4gYnl0ZXM6CmdldF9hc3NldF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg3LTg4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2luZm8oc2VsZikgLT4gdHlwLkFzc2V0SW5mbzoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk4CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTkKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAwCiAgICAvLyB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMQogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAyCiAgICAvLyBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDMKICAgIC8vIHRvdGFsX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX3VuaXRzKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDQKICAgIC8vIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNS05MDcKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOC05MTAKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMQogICAgLy8gaXNzdWFuY2VfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLmlzc3VhbmNlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMgogICAgLy8gbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMwogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICBieXRlYyA3IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE0CiAgICAvLyBkZWZhdWx0ZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5kZWZhdWx0ZWQpKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgIGJ5dGVjIDcgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTctOTE1CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgLy8gKQogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBwdXNoaW50IDYwMSAvLyA2MDEKICAgIHN3YXAKICAgIHNldGJpdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNy05MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNC05MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQyCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIGJ5dGVjIDMyIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0MwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDQKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDExIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ1CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0Ny05NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTAKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1MQogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ5LTk1MgogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQtOTU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NgogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X3VwZGF0ZSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2Ni00NjcKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgYXNzZXRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MS00NzQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANwogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDM0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANjoKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDc6CiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLl9fYWxnb3B5X2VudHJ5cG9pbnRfd2l0aF9pbml0KCkgLT4gdWludDY0OgptYWluOgogICAgaW50Y2Jsb2NrIDAgMSA4IDEwMCA0NDggMjU1IDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NTIzMzMwMjMgImNpcmN1bGF0aW5nX3VuaXRzIiAic3RhdHVzIiAidG90YWxfY291cG9ucyIgImlzc3VhbmNlX2RhdGUiICJzZXR0bGVtZW50X2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgMHgwMCAweDAwMDAwMDAwMDAwMDAwMDAgInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIgMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MyAidW5pdF92YWx1ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAidG90YWxfdW5pdHMiICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIiAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMgMHg1MjMyMzAyMyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAic3VzcGVuZGVkIiAiZGVmYXVsdGVkIiAiZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIiAicGFpZF9jb3Vwb25fdW5pdHMiICJtZXRhZGF0YSIgImludGVyZXN0X3JhdGUiIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDEyIDB4MDAwMCAweDUyMzgzMDIzIDB4MDY4MTAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBSb2xlIEJhc2VkIEFjY2VzcyBDb250cm9sCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDE4IC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5LTYwCiAgICAvLyAjIEFzc2V0IENvbmZpZ3VyYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NS02NgogICAgLy8gIyBNZXRhZGF0YQogICAgLy8gc2VsZi5tZXRhZGF0YSA9IEJ5dGVzKCkKICAgIGJ5dGVjIDI1IC8vICJtZXRhZGF0YSIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4LTY5CiAgICAvLyAjIFN1cHBseQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3Mi03MwogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDI2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OS05MAogICAgLy8gIyBTdGF0dXMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU1QVFkpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAyMSAvLyAic3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MgogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjIgLy8gImRlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2LTM3CiAgICAvLyAjIFN0YXRlIHNjaGVtYSB2YWxpZGF0aW9uCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAxOSAvLyAxOQogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDAKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDItNDMKICAgIC8vICMgQ291cG9ucwogICAgLy8gc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgPSBVSW50NjQoKQogICAgYnl0ZWMgMjMgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBzZWxmLnBhaWRfY291cG9uX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDI0IC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMjgKICAgIHB1c2hieXRlc3MgMHg0ZmQ2YTNjYyAweDhjZjE0YjUxIDB4OWM3NmI2YTMgMHg0NDM2M2Q0OSAweDUzYmVmMDQ1IDB4NjdkYjRmMjAgMHhmNmE5NmM4ZCAweDYzZjk5NTg5IDB4ZDNhNGQ2YWIgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHg4MGJmY2RkMSAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGRkY2VjMDdiIC8vIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInBheV9jb3Vwb24oYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAicGF5X3ByaW5jaXBhbChhZGRyZXNzLGJ5dGVbXSkodWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKGFkZHJlc3MsdWludDY0KSh1aW50NjQsdWludDY0LCh1aW50NjQsdWludDY0KSkiLCBtZXRob2QgImdldF9jb3Vwb25fcmF0ZXMoKXVpbnQxNltdIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldF9jb3Vwb25zX3N0YXR1cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LCh1aW50NjQsdWludDY0KSxib29sKSIsIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNltdLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhc3NpZ25fcm9sZShhZGRyZXNzLHVpbnQ4LGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInJldm9rZV9yb2xlKGFkZHJlc3MsdWludDgpdWludDY0IiwgbWV0aG9kICJvcGVuX2FjY291bnQoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiY2xvc2VfYWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicHJpbWFyeV9kaXN0cmlidXRpb24oYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJzZXRfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2FjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfaW5mbygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sKSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9ldmVudHMoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpdWludDY0W10iLCBtZXRob2QgImdldF9hc3NldF9tZXRhZGF0YSgpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1IG1haW5fcGF5X2NvdXBvbl9yb3V0ZUA2IG1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA3IG1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA4IG1haW5fZ2V0X2NvdXBvbl9yYXRlc19yb3V0ZUA5IG1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDEwIG1haW5fZ2V0X2NvdXBvbnNfc3RhdHVzX3JvdXRlQDExIG1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyIG1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDEzIG1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUAxNCBtYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDE1IG1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTYgbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTcgbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDE4IG1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMTkgbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMCBtYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMjEgbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMjIgbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyMyBtYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMjQgbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjUgbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNiBtYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyNwoKbWFpbl9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWV0YWRhdGFfcm91dGVAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9tZXRhZGF0YQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3RpbWVfZXZlbnRzX3JvdXRlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9kZWZhdWx0X3N0YXR1cwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2FjY291bnRfc3VzcGVuc2lvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcHJpbWFyeV9kaXN0cmlidXRpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNsb3NlX2FjY291bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fb3Blbl9hY2NvdW50X3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcmV2b2tlX3JvbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzaWduX3JvbGVfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NpZ25fcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jb25maWdfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF9jb25maWcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgY2FsbHN1YiBhc3NldF9jcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2NvdXBvbnNfc3RhdHVzX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2NvdXBvbnNfc3RhdHVzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9wYXltZW50X2Ftb3VudF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X3BheW1lbnRfYW1vdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9jb3Vwb25fcmF0ZXNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9jb3Vwb25fcmF0ZXMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3BheV9wcmluY2lwYWxfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGF5X3ByaW5jaXBhbAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wYXlfY291cG9uX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHBheV9jb3Vwb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfdHJhbnNmZXJfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfdHJhbnNmZXIKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIG1haW5fYXNzZXRfdXBkYXRlQDI5CiAgICBiIG1haW5fYWZ0ZXJfaWZfZWxzZUAzMAoKbWFpbl9hc3NldF91cGRhdGVAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NC00NjUKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgYXNzZXRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBjYWxsc3ViIGFzc2V0X3VwZGF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuYXNzZXRfdHJhbnNmZXIoc2VuZGVyX2hvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2V0X3RyYW5zZmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE1My0xNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIHVuaXRzOiBhcmM0LlVJbnQ2NCwKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAzIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg0CiAgICAvLyB1bml0cy5uYXRpdmUsCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTMtMjk2CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk1CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk2CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTYKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NS0yOTYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyA0CiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk2CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkyLTI5NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjctMzY5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLm5hdGl2ZSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzcxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlLCBlcnIuU1VTUEVOREVECiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgOCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc1LTM3NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnN1c3BlbmRlZC5uYXRpdmUsIGVyci5TVVNQRU5ERUQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgOCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc5CiAgICAvLyB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyA1CiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc4LTM4MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4OAogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzg5CiAgICAvLyBpZiBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPiAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0LTMwNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0LTMwNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzAzLTMwNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gICAgIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5OT05fRlVOR0lCTEVfVU5JVFMKICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIHVuaXRzIGFyZSBub3QgZnVuZ2libGUKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg3LTE4OAogICAgLy8gIyBUcmFuc2ZlciBpcyBmb3JiaWRkZW4gaW4gY2FzZSBvZiBwZW5kaW5nIGNvdXBvbiBwYXltZW50cwogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODkKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTkxLTE5MgogICAgLy8gIyBUcmFuc2ZlcnJlZCB1bml0cyB2YWx1ZSAobXVzdCBiZSBjb21wdXRlZCBiZWZvcmUgdGhlIHRyYW5zZmVyKQogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5My0xOTUKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZSwgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMgogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI0LTQyNgogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjQKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjQtNDI2CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI4CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI3LTQyOQogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjctNDI5CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzUxCiAgICAvLyBpZiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPT0gMDoKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzUyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiA0MAogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gYXJjNC5VSW50NjQoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0Cgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHVuaXRzLm5hdGl2ZSAqIHNlbmRlcl91bml0X3ZhbHVlLm5hdGl2ZSArIGFjY3J1ZWRfaW50ZXJlc3QpCiAgICBmcmFtZV9kaWcgMAogICAgYnRvaQogICAgZnJhbWVfZGlnIDUKICAgICoKICAgIGZyYW1lX2RpZyAzCiAgICArCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMTUKCmFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk1LTM5NwogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0ucGFpZF9jb3Vwb25zCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NQogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTUtMzk3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5wYWlkX2NvdXBvbnMKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0CiAgICBiIGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTcKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDctMTA4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X3N1c3BlbmRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMS0xMTIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTEzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuY291bnRfZHVlX2NvdXBvbnMoKSAtPiB1aW50NjQ6CmNvdW50X2R1ZV9jb3Vwb25zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjUwLTUxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGNvdW50X2R1ZV9jb3Vwb25zKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NTIKICAgIC8vIGN1cnJlbnRfdHMgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NTMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAiZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR1ZV9jb3Vwb25zX3dhdGVybWFyayBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1NAogICAgLy8gaWYgY3VycmVudF90cyA+PSBzZWxmLm1hdHVyaXR5X2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGJ6IGNvdW50X2R1ZV9jb3Vwb25zX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NTUKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi50b3RhbF9jb3Vwb25zCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCgpjb3VudF9kdWVfY291cG9uc19hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjcKICAgIC8vIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrID0gZHVlX2NvdXBvbnMKICAgIGJ5dGVjIDIzIC8vICJkdWVfY291cG9uc193YXRlcm1hcmsiCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjY4CiAgICAvLyByZXR1cm4gZHVlX2NvdXBvbnMKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpjb3VudF9kdWVfY291cG9uc19lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1NgogICAgLy8gZWxpZiBjdXJyZW50X3RzID4gc2VsZi5pc3N1YW5jZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBjb3VudF9kdWVfY291cG9uc19hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1NwogICAgLy8gY291cG9uX2lkeCA9IFVJbnQ2NChjZmcuRklSU1RfQ09VUE9OX0RBVEVfSURYKSArIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgZXhpc3RzCiAgICBwdXNoaW50IDMgLy8gMwogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1OAogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZVtjb3Vwb25faWR4XS5uYXRpdmUKICAgIGJ5dGVjIDExIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfZXZlbnRzIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCgpjb3VudF9kdWVfY291cG9uc193aGlsZV90b3BANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1OQogICAgLy8gd2hpbGUgY3VycmVudF90cyA+PSBjb3Vwb25fZHVlX2RhdGU6CiAgICBmcmFtZV9kaWcgMQogICAgPD0KICAgIGJ6IGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX3doaWxlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2MQogICAgLy8gcmVxdWlyZWRfYnVkZ2V0PVVJbnQ2NChjZmcuT1BfVVBfQ09VUE9OX0RVRV9DT1VOVElORyksCiAgICBpbnRjIDUgLy8gMjU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjIKICAgIC8vIGZlZV9zb3VyY2U9T3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjAtNjMKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PVVJbnQ2NChjZmcuT1BfVVBfQ09VUE9OX0RVRV9DT1VOVElORyksCiAgICAvLyAgICAgZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0LAogICAgLy8gKQogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjQKICAgIC8vIGNvdXBvbl9pZHggKz0gMQogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjY1CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlW2NvdXBvbl9pZHhdLm5hdGl2ZQogICAgYnl0ZWMgMTEgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGIgY291bnRfZHVlX2NvdXBvbnNfd2hpbGVfdG9wQDQKCmNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX3doaWxlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjYKICAgIC8vIGR1ZV9jb3Vwb25zID0gY291cG9uX2lkeCAtIGNmZy5GSVJTVF9DT1VQT05fREFURV9JRFgKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDMgLy8gMwogICAgLQogICAgZnJhbWVfYnVyeSAyCiAgICBiIGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdm9pZDoKYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6OTItOTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIGR1ZV9jb3Vwb25zOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPT0gZHVlX2NvdXBvbnMKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojk2LTk4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgLy8gKSwgZXJyLlBFTkRJTkdfQ09VUE9OX1BBWU1FTlQKICAgIGFzc2VydCAvLyBQZW5kaW5nIGR1ZSBjb3Vwb24gcGF5bWVudAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5hY2NydWVkX2ludGVyZXN0X2Ftb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0LCBkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6CmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEzMi0xMzUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBVSW50NjQsIGR1ZV9jb3Vwb25zOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTM2LTEzNwogICAgLy8gIyBUaGUgZm9sbG93aW5nIGFzc2VydCBzYWZlZ3VhcmRzIHRoZSBzdWJyb3V0aW5lIGZyb20gZm9yYmlkZGVuIGludm9jYXRpb25zCiAgICAvLyBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KGhvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTM5CiAgICAvLyBjb3Vwb25fYWNjcnVlZF9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQwCiAgICAvLyBjb3Vwb25fcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gbmV4dF9jb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVsKICAgIGJ5dGVjIDE3IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3JhdGVzIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE0MS0xNDMKICAgIC8vIG5leHRfY291cG9uX3JhdGVfYnBzID0gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWVbCiAgICAvLyAgICAgZHVlX2NvdXBvbnMKICAgIC8vIF0ubmF0aXZlICAjIGR1ZV9jb3Vwb25zIGlzIGVxdWFsIHRvIHRoZSAwLWJhc2UgaWR4IG9mIG5leHQgY291cG9uCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDIgLy8gMgogICAgKgogICAgcHVzaGludCAyIC8vIDIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ1LTE0NgogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ1LTE0NwogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ5CiAgICAvLyBjc3QuQlBTICogY291cG9uX3BlcmlvZAogICAgcHVzaGludCAxMDAwMCAvLyAxMDAwMAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ1LTE1MAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gLy8gKAogICAgLy8gICAgIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICAvLyApICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQgY2hlY2tzCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ0LTE1MQogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAgICAgKiBjb3Vwb25fYWNjcnVlZF9wZXJpb2QKICAgIC8vICAgICAvLyAoCiAgICAvLyAgICAgICAgIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICAvLyAgICAgKSAgIyBkaXYtYnktemVybzogY291cG9uX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkIGNoZWNrcwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IGJ5dGVzOgpkYXlfY291bnRfZmFjdG9yOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwNy0xMDgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZGF5X2NvdW50X2ZhY3RvcihzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiB0eXAuRGF5Q291bnRGYWN0b3I6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBpZiBub3QgZHVlX2NvdXBvbnM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBkYXlfY291bnRfZmFjdG9yX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTExCiAgICAvLyBhY2NydWluZ19zdGFydF90aW1lID0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE0CiAgICAvLyBjb3Vwb25fYWNjcnVlZF9wZXJpb2QgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCAtIGFjY3J1aW5nX3N0YXJ0X3RpbWUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGRpZyAxCiAgICAtCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjExNQogICAgLy8gY291cG9uX3BlcmlvZCA9IHNlbGYubmV4dF9jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpIC0gYWNjcnVpbmdfc3RhcnRfdGltZQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG5leHRfY291cG9uX2R1ZV9kYXRlCiAgICBzd2FwCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjExNgogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9PSBVSW50NjQoY3N0LkRDQ19BX0EpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMQogICAgYnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0NwogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfZGlnIDMKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9idXJ5IDEKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTIwCiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQoY291cG9uX2FjY3J1ZWRfcGVyaW9kKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjEKICAgIC8vIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGNvdXBvbl9wZXJpb2QpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjExOS0xMjIKICAgIC8vIHJldHVybiB0eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KGNvdXBvbl9hY2NydWVkX3BlcmlvZCksCiAgICAvLyAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoY291cG9uX3BlcmlvZCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkYXlfY291bnRfZmFjdG9yX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBpZiBkdWVfY291cG9ucyA+PSBVSW50NjQoMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzgKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAyCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAyCiAgICBiIGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5jb3Vwb25fZHVlX2RhdGUoY291cG9uOiB1aW50NjQpIC0+IHVpbnQ2NDoKY291cG9uX2R1ZV9kYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjcwLTcxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGNvdXBvbl9kdWVfZGF0ZShzZWxmLCBjb3Vwb246IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzIKICAgIC8vIHJldHVybiBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlW2NmZy5GSVJTVF9DT1VQT05fREFURV9JRFggKyBjb3Vwb24gLSAxXS5uYXRpdmUKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBieXRlYyAxMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5uZXh0X2NvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6Cm5leHRfY291cG9uX2R1ZV9kYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG5leHRfY291cG9uX2R1ZV9kYXRlKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo4NAogICAgLy8gaWYgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBkdXAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYnogbmV4dF9jb3Vwb25fZHVlX2RhdGVfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODUKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zICsgMSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGNhbGxzdWIgY291cG9uX2R1ZV9kYXRlCiAgICBmcmFtZV9idXJ5IDAKCm5leHRfY291cG9uX2R1ZV9kYXRlX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo4NgogICAgLy8gcmV0dXJuIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMzLTMzNgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzM3CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlLm5hdGl2ZQogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5wYXlfY291cG9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfaW5mbzogYnl0ZXMpIC0+IGJ5dGVzOgpwYXlfY291cG9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwMi0yMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHBheV9jb3Vwb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfaW5mbzogYXJjNC5EeW5hbWljQnl0ZXMKICAgIC8vICkgLT4gdHlwLlBheW1lbnRSZXN1bHQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjI1LTIyNgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHJlc3RyaWN0IGNhbGxlciBhdXRob3JpemF0aW9uCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjI4CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwbiAyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjMwCiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjMxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzMKICAgIC8vIGFjY291bnRfcGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zLm5hdGl2ZQogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjM0CiAgICAvLyBhc3NlcnQgZHVlX2NvdXBvbnMgPiBhY2NvdW50X3BhaWRfY291cG9ucywgZXJyLk5PX0RVRV9DT1VQT04KICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNvdXBvbiB0byBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzUtMjM4CiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyB2ZXJpZnkgaWYgb3RoZXIgYWNjb3VudHMgYXJlIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSBwYXltZW50IG9mIHByZXZpb3VzIGNvdXBvbnMKICAgIC8vIGFzc2VydCBzZWxmLmFsbF9kdWVfY291cG9uc19wYWlkKAogICAgLy8gICAgIGFjY291bnRfcGFpZF9jb3Vwb25zCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQxCiAgICAvLyBpZiBzZWxmLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGlzX3BheW1lbnRfZXhlY3V0YWJsZQogICAgYnogcGF5X2NvdXBvbl9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0MwogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gYWNjb3VudF9wYWlkX2NvdXBvbnMgKyAxLAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQyLTI0NQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBzZWxmLmNvdXBvbl9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksCiAgICAvLyAgICAgYWNjb3VudF9wYWlkX2NvdXBvbnMgKyAxLAogICAgLy8gKQogICAgY2FsbHN1YiBjb3Vwb25faW50ZXJlc3RfYW1vdW50CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDYtMjQ3CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHBheW1lbnQgYWdlbnQKICAgIC8vIHNlbGYuYXNzZXJ0X2Vub3VnaF9mdW5kcyhwYXltZW50X2Ftb3VudCkKICAgIGNhbGxzdWIgYXNzZXJ0X2Vub3VnaF9mdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0OC0yNDkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGNhbGxzdWIgcGF5CgpwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNTQtMjU2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlICsgMQogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNTQtMjU2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlICsgMQogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNTcKICAgIC8vIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgYnl0ZWMgMjQgLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNTkKICAgIC8vIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjYwCiAgICAvLyB0aW1lc3RhbXA9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1OC0yNjIKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudFJlc3VsdCgKICAgIC8vICAgICBhbW91bnQ9YXJjNC5VSW50NjQocGF5bWVudF9hbW91bnQpLAogICAgLy8gICAgIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8uY29weSgpLCAgIyBUT0RPOiBBZGQgaW5mbyBvbiBmYWlsZWQgcGF5bWVudAogICAgLy8gKQogICAgY29uY2F0CiAgICBieXRlYyAzMSAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpwYXlfY291cG9uX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1MS0yNTIKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6CmFsbF9kdWVfY291cG9uc19wYWlkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojg4LTg5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFsbF9kdWVfY291cG9uc19wYWlkKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo5MAogICAgLy8gcmV0dXJuIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgPj0gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIGR1ZV9jb3Vwb25zCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjQgLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBhaWRfY291cG9uX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICA+PQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuaXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKaXNfcGF5bWVudF9leGVjdXRhYmxlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA4LTMwOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBpc19wYXltZW50X2V4ZWN1dGFibGUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMgogICAgLy8gQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMS0zMTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMS0zMTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBieiBpc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTQKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDggLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCmlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTAtMzE1CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgICAgIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkKICAgIC8vICAgICApCiAgICAvLyAgICAgYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICAvLyApCiAgICBzd2FwCiAgICByZXRzdWIKCmlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBpc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzktMzQwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQyCiAgICAvLyBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0MS0zNDMKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmNvdXBvbl9pbnRlcmVzdF9hbW91bnQocHJpbmNpcGFsX2Ftb3VudDogdWludDY0LCBjb3Vwb246IHVpbnQ2NCkgLT4gdWludDY0Ogpjb3Vwb25faW50ZXJlc3RfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwMC0xMDMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBwcmluY2lwYWxfYW1vdW50OiBVSW50NjQsIGNvdXBvbjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gY291cG9uX3JhdGVfYnBzID0gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWVbY291cG9uIC0gMV0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBieXRlYyAxNyAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9yYXRlcyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDIgLy8gMgogICAgKgogICAgcHVzaGludCAyIC8vIDIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gcmV0dXJuIHByaW5jaXBhbF9hbW91bnQgKiBjb3Vwb25fcmF0ZV9icHMgLy8gY3N0LkJQUwogICAgZnJhbWVfZGlnIC0yCiAgICAqCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICAvCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmFzc2VydF9lbm91Z2hfZnVuZHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTctMzE4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9lbm91Z2hfZnVuZHMoc2VsZiwgcGF5bWVudF9hbW91bnQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzIwCiAgICAvLyBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjAtMzIxCiAgICAvLyBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTktMzIyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5wYXkocmVjZWl2ZXI6IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKcGF5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI0LTMyNQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBwYXkoc2VsZiwgcmVjZWl2ZXI6IGFyYzQuQWRkcmVzcywgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyNi0zMzEKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMwCiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI3CiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjYtMzMxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLnBheV9wcmluY2lwYWwoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9pbmZvOiBieXRlcykgLT4gYnl0ZXM6CnBheV9wcmluY2lwYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjY0LTI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X3ByaW5jaXBhbCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzNC00MzUKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZXN0cmljdCBjYWxsZXIgYXV0aG9yaXphdGlvbgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzNgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzcKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzOQogICAgLy8gdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDAKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5OT19VTklUUwogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDEKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGUsIGVyci5OT1RfTUFUVVJFCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgbWF0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjkxCiAgICAvLyBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyODktMjkyCiAgICAvLyAjIFByaW5jaXBhbCBwYXltZW50IGlzIGZvcmJpZGRlbiBpbiBjYXNlIG9mIHBlbmRpbmcgY291cG9uIHBheW1lbnRzCiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZCgKICAgIC8vICAgICBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyOTUKICAgIC8vIGlmIHNlbGYuaXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgaXNfcGF5bWVudF9leGVjdXRhYmxlCiAgICBieiBwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mjk2CiAgICAvLyBwYXltZW50X2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mjk3LTI5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBwYXltZW50IGFnZW50CiAgICAvLyBzZWxmLmFzc2VydF9lbm91Z2hfZnVuZHMocGF5bWVudF9hbW91bnQpCiAgICBjYWxsc3ViIGFzc2VydF9lbm91Z2hfZnVuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyOTktMzAwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIHRoZSBzYW1lIGFzc2V0IGZvciBkZW5vbWluYXRpb24gYW5kIHNldHRsZW1lbnQsIG5vIGNvbnZlcnNpb24gbmVlZGVkCiAgICAvLyBzZWxmLnBheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHBheW1lbnRfYW1vdW50KQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBjYWxsc3ViIHBheQoKcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDgKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLQogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQ5CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KCkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiAzMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUwCiAgICAvLyBzZWxmLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpCiAgICBjYWxsc3ViIGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMwNwogICAgLy8gYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMDgKICAgIC8vIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzA2LTMxMAogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICAvLyAgICAgdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mby5jb3B5KCksICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBjb25jYXQKICAgIGJ5dGVjIDMxIC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgpwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMwMi0zMDMKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkgLT4gdm9pZDoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU1LTM1NgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU3CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IDA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBibnogZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU4CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50YyA3IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMTItMzE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlOgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzMzLTMzNAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzQKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzMtMzM0CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMzMi0zMzUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksIGVyci5OT19QUklNQVJZX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzgKICAgIC8vIDAgPCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI+CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANwogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGI+PQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzctMzM5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIDAgPCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1VOSVRTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhbW91bnQgb2YgdW5pdHMgZm9yIHRoZSBhY2NvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzQzCiAgICAvLyBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0MS0zNDQKICAgIC8vICMgVmFsdWUgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uIGFuZCBhdCBtYXR1cml0eQogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlID0gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzQ1LTM0NgogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdCBkdXJpbmcgcHJpbWFyeSBkaXN0cmlidXRpb24gYW5kIGF0IG1hdHVyaXR5CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNDcKICAgIC8vIG51bWVyYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzQ4CiAgICAvLyBkZW5vbWluYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzUwLTM1MQogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzUyCiAgICAvLyBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KGhvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzUzCiAgICAvLyBpZiBzZWxmLmlzX2FjY3J1aW5nX2ludGVyZXN0KGR1ZV9jb3Vwb25zKToKICAgIGNhbGxzdWIgaXNfYWNjcnVpbmdfaW50ZXJlc3QKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1NAogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1NS0zNTcKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlLCBkdWVfY291cG9ucwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgNgogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTgKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1OQogICAgLy8gZGVub21pbmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDMKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjEKICAgIC8vIHVuaXRzX3ZhbHVlPWFyYzQuVUludDY0KGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSksCiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2MgogICAgLy8gYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIGZyYW1lX2RpZyAyCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzY0CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIGZyYW1lX2RpZyA1CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzY1CiAgICAvLyBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2My0zNjYKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICksCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjAtMzY3CiAgICAvLyByZXR1cm4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlKAogICAgLy8gICAgIHVuaXRzX3ZhbHVlPWFyYzQuVUludDY0KGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSksCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA4CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6CmlzX2FjY3J1aW5nX2ludGVyZXN0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyNC0xMjUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaXNfYWNjcnVpbmdfaW50ZXJlc3Qoc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyNwogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI3LTEyOQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgYnogaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI4CiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMAogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gYW5kIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zCiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjkKICAgIC8vIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyNy0xMjkKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjYtMTMwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgLy8gKQogICAgcmV0c3ViCgppc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyNi0xMzAKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyAgICAgYW5kIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9jb3Vwb25fcmF0ZXMoKSAtPiBieXRlczoKZ2V0X2NvdXBvbl9yYXRlczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjktMzcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfY291cG9uX3JhdGVzKHNlbGYpIC0+IHR5cC5Db3Vwb25SYXRlczoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM3NwogICAgLy8gY291cG9uX3JhdGVzID0gdHlwLkNvdXBvblJhdGVzKCkKICAgIGJ5dGVjIDMyIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNzgKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X2NvdXBvbl9yYXRlc19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNzkKICAgIC8vIGNvdXBvbl9yYXRlcyA9IHNlbGYuY291cG9uX3JhdGVzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTcgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9yYXRlcyBleGlzdHMKCmdldF9jb3Vwb25fcmF0ZXNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM4MAogICAgLy8gcmV0dXJuIGNvdXBvbl9yYXRlcwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuZ2V0X3BheW1lbnRfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfcGF5bWVudF9hbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzgyLTM4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3BheW1lbnRfYW1vdW50KHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiB0eXAuUGF5bWVudEFtb3VudHM6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOTcKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM5Ny0zOTgKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gVUludDY0KCkKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTAwCiAgICA9PQogICAgc3dhcAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDAwCiAgICAvLyBwYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDAxCiAgICAvLyBpZiBwYWlkX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgPAogICAgYnogZ2V0X3BheW1lbnRfYW1vdW50X2Vsc2VfYm9keUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDA0CiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDA1CiAgICAvLyBwYWlkX2NvdXBvbnMgKyAxLAogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDAyLTQwNgogICAgLy8gIyBDb3Vwb24gUGF5bWVudAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5jb3Vwb25faW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpLAogICAgLy8gICAgIHBhaWRfY291cG9ucyArIDEsCiAgICAvLyApCiAgICBjYWxsc3ViIGNvdXBvbl9pbnRlcmVzdF9hbW91bnQKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDUKCmdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MTEKICAgIC8vIGludGVyZXN0PWFyYzQuVUludDY0KGludGVyZXN0X2Ftb3VudCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDEyCiAgICAvLyBwcmluY2lwYWw9YXJjNC5VSW50NjQocHJpbmNpcGFsX2Ftb3VudCksCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDEwLTQxMwogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50QW1vdW50cygKICAgIC8vICAgICBpbnRlcmVzdD1hcmM0LlVJbnQ2NChpbnRlcmVzdF9hbW91bnQpLAogICAgLy8gICAgIHByaW5jaXBhbD1hcmM0LlVJbnQ2NChwcmluY2lwYWxfYW1vdW50KSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9wYXltZW50X2Ftb3VudF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MDgtNDA5CiAgICAvLyAjIFByaW5jaXBhbCBQYXltZW50CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuZ2V0X2NvdXBvbnNfc3RhdHVzKCkgLT4gYnl0ZXM6CmdldF9jb3Vwb25zX3N0YXR1czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MTUtNDE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfY291cG9uc19zdGF0dXMoc2VsZikgLT4gdHlwLkNvdXBvbnNJbmZvOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDI0CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDI1CiAgICAvLyBuZXh0X2NvdXBvbl9kdWVfZGF0ZSA9IHNlbGYubmV4dF9jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpCiAgICBjYWxsc3ViIG5leHRfY291cG9uX2R1ZV9kYXRlCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDI2CiAgICAvLyBhbGxfZHVlX2NvdXBvbnNfcGFpZCA9IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoZHVlX2NvdXBvbnMpCiAgICBkdXAKICAgIGNhbGxzdWIgYWxsX2R1ZV9jb3Vwb25zX3BhaWQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MjcKICAgIC8vIG51bWVyYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyOAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MjkKICAgIC8vIGlmIHNlbGYuaXNfYWNjcnVpbmdfaW50ZXJlc3QoZHVlX2NvdXBvbnMpOgogICAgY2FsbHN1YiBpc19hY2NydWluZ19pbnRlcmVzdAogICAgYnogZ2V0X2NvdXBvbnNfc3RhdHVzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAwCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzEKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzMgogICAgLy8gZGVub21pbmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDQKCmdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDM0CiAgICAvLyB0b3RhbF9jb3Vwb25zPWFyYzQuVUludDY0KHNlbGYudG90YWxfY291cG9ucyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzNQogICAgLy8gZHVlX2NvdXBvbnM9YXJjNC5VSW50NjQoZHVlX2NvdXBvbnMpLAogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzYKICAgIC8vIG5leHRfY291cG9uX2R1ZV9kYXRlPWFyYzQuVUludDY0KG5leHRfY291cG9uX2R1ZV9kYXRlKSwKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDM4CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIGZyYW1lX2RpZyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDM5CiAgICAvLyBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICBmcmFtZV9kaWcgNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzNy00NDAKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICksCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0NDEKICAgIC8vIGFsbF9kdWVfY291cG9uc19wYWlkPWFyYzQuQm9vbChhbGxfZHVlX2NvdXBvbnNfcGFpZCksCiAgICBieXRlYyA4IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDMzLTQ0MgogICAgLy8gcmV0dXJuIHR5cC5Db3Vwb25zSW5mbygKICAgIC8vICAgICB0b3RhbF9jb3Vwb25zPWFyYzQuVUludDY0KHNlbGYudG90YWxfY291cG9ucyksCiAgICAvLyAgICAgZHVlX2NvdXBvbnM9YXJjNC5VSW50NjQoZHVlX2NvdXBvbnMpLAogICAgLy8gICAgIG5leHRfY291cG9uX2R1ZV9kYXRlPWFyYzQuVUludDY0KG5leHRfY291cG9uX2R1ZV9kYXRlKSwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIGFsbF9kdWVfY291cG9uc19wYWlkPWFyYzQuQm9vbChhbGxfZHVlX2NvdXBvbnNfcGFpZCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jcmVhdGUoYXJyYW5nZXI6IGJ5dGVzLCBtZXRhZGF0YTogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1Mi00NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGFzc2V0X2NyZWF0ZShzZWxmLCBhcnJhbmdlcjogYXJjNC5BZGRyZXNzLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyLm5hdGl2ZQogICAgYnl0ZWMgMTggLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYyCiAgICAvLyBzZWxmLm1ldGFkYXRhID0gbWV0YWRhdGEubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfY29uZmlnKGRlbm9taW5hdGlvbl9hc3NldF9pZDogYnl0ZXMsIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGJ5dGVzLCBwcmluY2lwYWw6IGJ5dGVzLCBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYnl0ZXMsIGRheV9jb3VudF9jb252ZW50aW9uOiBieXRlcywgaW50ZXJlc3RfcmF0ZTogYnl0ZXMsIGNvdXBvbl9yYXRlczogYnl0ZXMsIHRpbWVfZXZlbnRzOiBieXRlcywgdGltZV9wZXJpb2RzOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDc0LTQ4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzZXRfY29uZmlnKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwcmluY2lwYWw6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG1pbmltdW1fZGVub21pbmF0aW9uOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbjogYXJjNC5VSW50OCwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlOiBhcmM0LlVJbnQxNiwKICAgIC8vICAgICBjb3Vwb25fcmF0ZXM6IHR5cC5Db3Vwb25SYXRlcywKICAgIC8vICAgICB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMsCiAgICAvLyAgICAgdGltZV9wZXJpb2RzOiB0eXAuVGltZVBlcmlvZHMsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA5IDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTE1CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MTYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VNUFRZLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUxOC01MTkKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5hc3NlcnRfZGVub21pbmF0aW9uX2Fzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTkKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc3CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGZyYW1lX2RpZyAzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzUtMTc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIC8vICksIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODIKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjItNTIzCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTgKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODYtMTg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTkzCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA2IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0yMDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NgogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk3CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk0LTE5NQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTQtMjAwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI4CiAgICAvLyBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIGZyYW1lX2RpZyAtNwogICAgYnRvaQogICAgZnJhbWVfZGlnIC02CiAgICBidG9pCiAgICBkdXAyCiAgICAlCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjYtNTI5CiAgICAvLyAjIFNldCBQcmluY2lwYWwgYW5kIE1pbmltdW0gRGVub21pbmF0aW9uCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgLy8gKSwgZXJyLklOVkFMSURfTUlOSU1VTV9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBNaW5pbXVtIGRlbm9taW5hdGlvbiBpcyBub3QgYSBkaXZpc29yIG9mIHByaW5jaXBhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMwCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzEKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBwcmluY2lwYWwubmF0aXZlIC8vIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgLwogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMy01MzQKICAgIC8vICMgU2V0IERheS1Db3VudCBDb252ZW50aW9uCiAgICAvLyBzZWxmLmFzc2VydF9kYXlfY291bnRfY29udmVudGlvbihkYXlfY291bnRfY29udmVudGlvbi5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTUKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDYKICAgIC8vIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICBpbnRjXzMgLy8gMTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDQtMjA4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYm56IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDcKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgaW50YyA1IC8vIDI1NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA0LTIwOAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3Cgphc3NldF9jb25maWdfYm9vbF90cnVlQDE2OgogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA0LTIwOAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIxMgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IGRheV9jb3VudF9jb252ZW50aW9uCiAgICBieXRlYyAxMyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBmcmFtZV9kaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzNy01MzgKICAgIC8vICMgU2V0IEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYuYXNzZXJ0X2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZS5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gYXNzZXJ0IGludGVyZXN0X3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludGVyZXN0IHJhdGUgaXMgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgMjYgLy8gImludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBhc3NlcnQgY291cG9uX3JhdGVzLmxlbmd0aCwgZXJyLklOVkFMSURfQ09VUE9OX1JBVEVTCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBhc3NlcnQgLy8gQ291cG9uIHJhdGVzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI4CiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBjb3Vwb25fcmF0ZXMubGVuZ3RoCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gaWYgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzAKICAgIC8vIHNlbGYuY291cG9uX3JhdGVzLnZhbHVlID0gY291cG9uX3JhdGVzLmNvcHkoKQogICAgYnl0ZWMgMTcgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDE3IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgZnJhbWVfZGlnIC0zCiAgICBib3hfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNC0yMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUwogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0NwogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gc2VsZi50aW1lX2V2ZW50cy52YWx1ZSA9IHRpbWVfZXZlbnRzLmNvcHkoKQogICAgYnl0ZWMgMTEgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAxMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MS0yNjMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEtMjYzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY3CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuSVNTVUFOQ0VfREFURV9JRFhdLm5hdGl2ZQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjktMjcwCiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzEKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgNyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gYXNzZXJ0IG5vdCB0aW1lX3BlcmlvZHMubGVuZ3RoLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGludGNfMyAvLyAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTUtMTE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM4LTIzOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlbGYsIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cykgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MQogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MgogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQxLTI0MgogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQwLTI0MwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyAgICAgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRQogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDAKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ0CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDYKICAgIC8vIHJlcXVpcmVkX2J1ZGdldD1VSW50NjQoY2ZnLk9QX1VQX1RJTUVfRVZFTlRfU09SVElORyksCiAgICBwdXNoaW50IDY1IC8vIDY1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDcKICAgIC8vIGZlZV9zb3VyY2U9T3BVcEZlZVNvdXJjZS5BcHBBY2NvdW50LCAgIyBBcHAgZnVuZHMgYXJlIG5vdCBhdCByaXNrIHNpbmNlIGNhbGxlciBpcyB0cnVzdGVkCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ1LTI0OAogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9USU1FX0VWRU5UX1NPUlRJTkcpLAogICAgLy8gICAgIGZlZV9zb3VyY2U9T3BVcEZlZVNvdXJjZS5BcHBBY2NvdW50LCAgIyBBcHAgZnVuZHMgYXJlIG5vdCBhdCByaXNrIHNpbmNlIGNhbGxlciBpcyB0cnVzdGVkCiAgICAvLyApCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdGltZV9pID0gdGltZV9ldmVudHNbX3RdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTAKICAgIC8vIHRpbWVfZiA9IHRpbWVfZXZlbnRzW190ICsgMV0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUxCiAgICAvLyBhc3NlcnQgdGltZV9mID4gdGltZV9pLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTIKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gIT0gVUludDY0KGNzdC5EQ0NfQ09OVCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaW50YyA1IC8vIDI1NQogICAgIT0KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTMtMjU0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTMtMjU2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgLy8gICAgIGNzdC5EQVlfMl9TRUMKICAgIC8vICkgPT0gMCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0QKICAgIGludGMgNiAvLyA4NjQwMAogICAgJQogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBpbiBBY3R1YWwvQWN0dWFsIGRheSBjb3VudCBjb252ZW50aW9uIG11c3QgYmUgbXVsdGlwbGVzIG9mIGEgZGF5IChpbiBzZWNvbmRzKQogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANjoKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1Ni01NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMoCiAgICAvLyAgICAgc2VsZiwgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMKICAgIC8vICkgLT4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTc3CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNyAvLyAyMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NzgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NzkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgxCiAgICAvLyBhc3NlcnQgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPj0gMSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4MgogICAgLy8gaWYgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPiAxOgogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4MwogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0xCiAgICBmcmFtZV9idXJ5IDEKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTg2LTU4OAogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTg1LTU4OAogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBkaWcgMQogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NC01ODkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyAgICAgPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gICAgIF0ubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfT1BFTklOR19EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IG9wZW5pbmcgZGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkwCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MC01OTIKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkzCiAgICAvLyBpZiBzZWxmLm1hdHVyaXR5X2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NQogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk3CiAgICAvLyBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk2LTU5OAogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk1LTU5OAogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBkaWcgMQogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NC01OTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5tYXR1cml0eV9kYXRlCiAgICAvLyAgICAgPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gICAgIF0ubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfQ0xPU1VSRV9EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IGNsb3N1cmUgZGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAwCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMC02MDIKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDUKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDQtNjA2CiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA4CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA3LTYwOQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMy02MTAKICAgIC8vIHJldHVybiB0eXAuU2Vjb25kYXJ5TWFya2V0U2NoZWR1bGUoCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NpZ25fcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcywgY29uZmlnOiBieXRlcykgLT4gYnl0ZXM6CmFzc2lnbl9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEyLTYxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzaWduX3JvbGUoCiAgICAvLyAgICAgc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgsIGNvbmZpZzogYXJjNC5EeW5hbWljQnl0ZXMKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzMwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzYKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzgKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IGFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANwoKYXNzaWduX3JvbGVfYm9vbF90cnVlQDY6CiAgICBpbnRjXzEgLy8gMQoKYXNzaWduX3JvbGVfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDQKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwIC8vIDIwLCA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0My02NzIKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcy5uYXRpdmUKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgKAogICAgLy8gICAgICAgICAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgICAgICBjb25maWcubmF0aXZlCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgKAogICAgLy8gICAgICAgICAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgICAgICBjb25maWcubmF0aXZlCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5IGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTAgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8zQDEyIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzRAMTMgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjcyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV81QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY2CiAgICAvLyByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICBieXRlYyAzMyAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2NS02NjcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY5CiAgICAvLyBjb25maWcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjgtNjcwCiAgICAvLyBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjczCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICBzd2FwCiAgICByZXRzdWIKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzRAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2MwogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1OQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNjMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2MAogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjkgLy8gMHg1MjM1MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU2CiAgICAvLyBjb25maWcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTUtNjU3CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OAogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgYnl0ZWMgMzAgLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDctNjQ5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUwLTY1MgogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8wQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDUKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnJldm9rZV9yb2xlKHJvbGVfYWRkcmVzczogYnl0ZXMsIHJvbGU6IGJ5dGVzKSAtPiBieXRlczoKcmV2b2tlX3JvbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzUtNjc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiByZXZva2Vfcm9sZShzZWxmLCByb2xlX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcm9sZTogYXJjNC5VSW50OCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5MwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTYKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MCAvLyA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTcKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUtNzAxCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5OAogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTkKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MCAvLyA3MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiByZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDYKCnJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCnJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NS03MDEKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMy03MDQKICAgIC8vICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MCAvLyA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMi03MjAKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTEgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIwCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMzIC8vIDB4NTIzODMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzExCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTIKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI5IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMCAvLyAweDUyMzQzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDYKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Eub3Blbl9hY2NvdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpvcGVuX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjMtNzI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcGVuX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDcgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ1CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDcKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEKICAgIC8vIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MgogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTMKICAgIC8vIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTQKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIGJ5dGVjIDggLy8gMHgwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOS0xMjAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICBieXRlYyAzMCAvLyAweDUyMzQzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMy0xMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9tYW5hZ2VyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQtMTI1CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9tYW5hZ2VyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjUtMTI2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMi0xMjcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmNsb3NlX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmNsb3NlX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTgtNzYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbG9zZV9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVHVwbGVbYXJjNC5VSW50NjQsIGFyYzQuVUludDY0XToKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzc2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzgwCiAgICAvLyBjbG9zZWRfdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlQgKyBob2xkaW5nX2FkZHJlc3MuYnl0ZXMpCiAgICBzd2FwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MgogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBjbG9zZWRfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICAtCiAgICBieXRlY18yIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODMKICAgIC8vIHNlbGYuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkKICAgIGNhbGxzdWIgZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODUKICAgIC8vIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICBpdG9iCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODQtNzg2CiAgICAvLyByZXR1cm4gYXJjNC5UdXBsZSgKICAgIC8vICAgICAoYXJjNC5VSW50NjQoY2xvc2VkX3VuaXRzKSwgYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApKQogICAgLy8gKQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5wcmltYXJ5X2Rpc3RyaWJ1dGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4OC03OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHByaW1hcnlfZGlzdHJpYnV0aW9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NC0yODcKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1LTI4NgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NS0yODcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg3CiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODYtMjg3CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgZnJhbWVfZGlnIDIKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NS0yODcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4My0yODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIGJ5dGVjIDI5IC8vIDB4NTIzNTMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzMKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMy0xMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNC0xMzUKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNC0xMzYKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM2CiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2RlYWxlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM1LTEzNgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0LTEzNgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMi0xMzcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODE2CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgxNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MTgKICAgIC8vIGFzc2VydCB1bml0cy5uYXRpdmUgPiAwLCBlcnIuWkVST19VTklUUwogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMubmF0aXZlIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgxOS04MjEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjMKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI0LTgyNgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI0LTgyNgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDQwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjgKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5jaXJjdWxhdGluZ191bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICAtCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMjoKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTMKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9hc3NldF9zdXNwZW5zaW9uKHN1c3BlbmRlZDogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfYXNzZXRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMC04MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hc3NldF9zdXNwZW5zaW9uKHNlbGYsIHN1c3BlbmRlZDogYXJjNC5Cb29sKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ0CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0NQogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoc3VzcGVuZGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDYKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDktMTUwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgYnl0ZWMgMjcgLy8gMHg1MjM3MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTMtMTU2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmF1dGhvcml0eSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0LTE1NQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NC0xNTYKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmF1dGhvcml0eSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU1LTE1NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NC0xNTYKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTItMTU3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgLy8gICAgIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYWNjb3VudF9zdXNwZW5zaW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHN1c3BlbmRlZDogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfYWNjb3VudF9zdXNwZW5zaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4LTg1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2FjY291bnRfc3VzcGVuc2lvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgc3VzcGVuZGVkOiBhcmM0LkJvb2wKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2NgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgaW50YyA0IC8vIDQ0OAogICAgc3dhcAogICAgc2V0Yml0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9kZWZhdWx0X3N0YXR1cyhkZWZhdWx0ZWQ6IGJ5dGVzKSAtPiB2b2lkOgpzZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzEtODcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfZGVmYXVsdF9zdGF0dXMoc2VsZiwgZGVmYXVsdGVkOiBhcmM0LkJvb2wpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDMKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNjMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDMKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0My0xNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ1CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NC0xNDYKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDUtMTQ2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NC0xNDYKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQyLTE0NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyAgICAgYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4MwogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoZGVmYXVsdGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMjIgLy8gImRlZmF1bHRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2Fzc2V0X2luZm8oKSAtPiBieXRlczoKZ2V0X2Fzc2V0X2luZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODUtODg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfaW5mbyhzZWxmKSAtPiB0eXAuQXNzZXRJbmZvOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTYKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTcKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk5CiAgICAvLyB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMAogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAxCiAgICAvLyBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDIKICAgIC8vIHRvdGFsX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX3VuaXRzKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDMKICAgIC8vIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNC05MDYKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNy05MDkKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMAogICAgLy8gaXNzdWFuY2VfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLmlzc3VhbmNlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMQogICAgLy8gbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMgogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICBieXRlYyA4IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEzCiAgICAvLyBkZWZhdWx0ZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5kZWZhdWx0ZWQpKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgIGJ5dGVjIDggLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTUtOTE0CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKSwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgLy8gICAgIHRvdGFsX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX3VuaXRzKSwKICAgIC8vICAgICBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICAvLyAgICAgcHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyAgICAgcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyAgICAgaXNzdWFuY2VfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLmlzc3VhbmNlX2RhdGUpLAogICAgLy8gICAgIG1hdHVyaXR5X2RhdGU9YXJjNC5VSW50NjQoc2VsZi5tYXR1cml0eV9kYXRlKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5zdXNwZW5kZWQpKSwKICAgIC8vICAgICBkZWZhdWx0ZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5kZWZhdWx0ZWQpKSwKICAgIC8vICkKICAgIHVuY292ZXIgMTMKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBwdXNoaW50IDY2NSAvLyA2NjUKICAgIHN3YXAKICAgIHNldGJpdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNi05MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMy05MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQxCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIGJ5dGVjIDMyIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0MgogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDMKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDExIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ0CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0Ni05NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTUKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NgogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU0LTk1NwogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTktOTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2NwogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X3VwZGF0ZSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NC00NjUKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgYXNzZXRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2OS00NzIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANwogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDM0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANjoKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDc6CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { @@ -481,7 +485,7 @@ "readonly": false, "returns": { "type": "(uint64,uint64,byte[])", - "desc": "Paid coupon amount, Payment timestamp, Payment context" + "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context" }, "desc": "Pay due coupon to an account" }, @@ -502,7 +506,7 @@ "readonly": false, "returns": { "type": "(uint64,uint64,byte[])", - "desc": "Paid principal amount, Payment timestamp, Payment context" + "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment context" }, "desc": "Pay the outstanding principal to an account" }, @@ -816,8 +820,8 @@ "args": [], "readonly": true, "returns": { - "type": "(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", - "desc": "Denomination Asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary Distribution Opening Date, Primary Distribution Closure Date, Issuance Date, Maturity Date, Suspended, Defaulted" + "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", + "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Defaulted" }, "desc": "Get D-ASA info" }, @@ -833,7 +837,7 @@ "readonly": true, "returns": { "type": "(address,uint64,uint64,uint64,bool)", - "desc": "Payment Address, D-ASA units, Unit value, Paid coupons, Suspended" + "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" }, "desc": "Get account info" }, @@ -852,16 +856,20 @@ "args": [], "readonly": true, "returns": { - "type": "uint64[]" - } + "type": "uint64[]", + "desc": "Secondary market schedule" + }, + "desc": "Get secondary market schedule" }, { "name": "get_asset_metadata", "args": [], "readonly": true, "returns": { - "type": "byte[]" - } + "type": "byte[]", + "desc": "Asset metadata" + }, + "desc": "Get D-ASA metadata" } ], "networks": {} diff --git a/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py b/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py index 66473be..ee19efc 100644 --- a/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py +++ b/smart_contracts/artifacts/fixed_coupon_bond/fixed_coupon_bond_client.py @@ -231,7 +231,7 @@ "no_op": "CALL" } }, - "get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)": { + "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)": { "read_only": true, "structs": { "output": { @@ -241,6 +241,10 @@ "denomination_asset_id", "uint64" ], + [ + "settlement_asset_id", + "uint64" + ], [ "outstanding_principal", "uint64" @@ -349,7 +353,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLl9fYWxnb3B5X2VudHJ5cG9pbnRfd2l0aF9pbml0KCkgLT4gdWludDY0OgptYWluOgogICAgaW50Y2Jsb2NrIDAgMSA4IDEwMCA0NDggMjU1IDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NTIzMzMwMjMgImNpcmN1bGF0aW5nX3VuaXRzIiAic3RhdHVzIiAidG90YWxfY291cG9ucyIgImlzc3VhbmNlX2RhdGUiICJtYXR1cml0eV9kYXRlIiAweDAwIDB4MDAwMDAwMDAwMDAwMDAwMCAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczICJ1bml0X3ZhbHVlIiAiZGF5X2NvdW50X2NvbnZlbnRpb24iICJ0b3RhbF91bml0cyIgInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDUyMzIzMDIzICJzZXR0bGVtZW50X2Fzc2V0X2lkIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAic3VzcGVuZGVkIiAiZGVmYXVsdGVkIiAiZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIiAicGFpZF9jb3Vwb25fdW5pdHMiICJtZXRhZGF0YSIgImludGVyZXN0X3JhdGUiIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDEyIDB4MDAwMCAweDUyMzgzMDIzIDB4MDY4MTAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBSb2xlIEJhc2VkIEFjY2VzcyBDb250cm9sCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDE4IC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5LTYwCiAgICAvLyAjIEFzc2V0IENvbmZpZ3VyYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NS02NgogICAgLy8gIyBNZXRhZGF0YQogICAgLy8gc2VsZi5tZXRhZGF0YSA9IEJ5dGVzKCkKICAgIGJ5dGVjIDI1IC8vICJtZXRhZGF0YSIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4LTY5CiAgICAvLyAjIFN1cHBseQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3Mi03MwogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDI2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OS05MAogICAgLy8gIyBTdGF0dXMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU1QVFkpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAyMSAvLyAic3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MgogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjIgLy8gImRlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2LTM3CiAgICAvLyAjIFN0YXRlIHNjaGVtYSB2YWxpZGF0aW9uCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAxOSAvLyAxOQogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDAKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDItNDMKICAgIC8vICMgQ291cG9ucwogICAgLy8gc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgPSBVSW50NjQoKQogICAgYnl0ZWMgMjMgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBzZWxmLnBhaWRfY291cG9uX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDI0IC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMjgKICAgIHB1c2hieXRlc3MgMHg0ZmQ2YTNjYyAweDhjZjE0YjUxIDB4OWM3NmI2YTMgMHg0NDM2M2Q0OSAweDUzYmVmMDQ1IDB4NjdkYjRmMjAgMHhmNmE5NmM4ZCAweDYzZjk5NTg5IDB4ZDNhNGQ2YWIgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHgzMDFkZDkxOSAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGRkY2VjMDdiIC8vIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInBheV9jb3Vwb24oYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAicGF5X3ByaW5jaXBhbChhZGRyZXNzLGJ5dGVbXSkodWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKGFkZHJlc3MsdWludDY0KSh1aW50NjQsdWludDY0LCh1aW50NjQsdWludDY0KSkiLCBtZXRob2QgImdldF9jb3Vwb25fcmF0ZXMoKXVpbnQxNltdIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldF9jb3Vwb25zX3N0YXR1cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LCh1aW50NjQsdWludDY0KSxib29sKSIsIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNltdLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhc3NpZ25fcm9sZShhZGRyZXNzLHVpbnQ4LGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInJldm9rZV9yb2xlKGFkZHJlc3MsdWludDgpdWludDY0IiwgbWV0aG9kICJvcGVuX2FjY291bnQoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiY2xvc2VfYWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicHJpbWFyeV9kaXN0cmlidXRpb24oYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJzZXRfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2FjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfaW5mbygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wpIiwgbWV0aG9kICJnZXRfYWNjb3VudF9pbmZvKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCkiLCBtZXRob2QgImdldF90aW1lX2V2ZW50cygpdWludDY0W10iLCBtZXRob2QgImdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21ldGFkYXRhKClieXRlW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2Fzc2V0X3RyYW5zZmVyX3JvdXRlQDUgbWFpbl9wYXlfY291cG9uX3JvdXRlQDYgbWFpbl9wYXlfcHJpbmNpcGFsX3JvdXRlQDcgbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDggbWFpbl9nZXRfY291cG9uX3JhdGVzX3JvdXRlQDkgbWFpbl9nZXRfcGF5bWVudF9hbW91bnRfcm91dGVAMTAgbWFpbl9nZXRfY291cG9uc19zdGF0dXNfcm91dGVAMTEgbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAMTIgbWFpbl9hc3NldF9jb25maWdfcm91dGVAMTMgbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDE0IG1haW5fYXNzaWduX3JvbGVfcm91dGVAMTUgbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUAxNiBtYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxNyBtYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTggbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxOSBtYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDIwIG1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAyMSBtYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAyMiBtYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDIzIG1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAyNCBtYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAyNSBtYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDI2IG1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDI3CgptYWluX2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21ldGFkYXRhCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF9pbmZvX3JvdXRlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2FjY291bnRfaW5mbwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2RlZmF1bHRfc3RhdHVzX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2RlZmF1bHRfc3RhdHVzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2Fzc2V0X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY2xvc2VfYWNjb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBvcGVuX2FjY291bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiByZXZva2Vfcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2lnbl9yb2xlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X2NvbmZpZ19yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2V0X2NvbmZpZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGFzc2V0X2NyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfY291cG9uc19zdGF0dXNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfY291cG9uc19zdGF0dXMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfcGF5bWVudF9hbW91bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2NvdXBvbl9yYXRlc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2NvdXBvbl9yYXRlcwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwYXlfcHJpbmNpcGFsCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3BheV9jb3Vwb25fcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGF5X2NvdXBvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICBwdXNoaW50IDQgLy8gNAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgbWF0Y2ggbWFpbl9hc3NldF91cGRhdGVAMjkKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDMwCgptYWluX2Fzc2V0X3VwZGF0ZUAyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NgogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY2LTQ2NwogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiBhc3NldF91cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIGNhbGxzdWIgYXNzZXRfdXBkYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5hc3NldF90cmFuc2ZlcihzZW5kZXJfaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXRfdHJhbnNmZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTUzLTE1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzZXRfdHJhbnNmZXIoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgICAgcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM6IGFyYzQuVUludDY0LAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODQKICAgIC8vIHVuaXRzLm5hdGl2ZSwKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5My0yOTYKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NC0yOTUKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NC0yOTYKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NgogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk1LTI5NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgZnJhbWVfZGlnIDQKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NC0yOTYKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTItMjk3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLlNFQ09OREFSWV9NQVJLRVRfQ0xPU0VECiAgICBhc3NlcnQgLy8gU2Vjb25kYXJ5IG1hcmtldCBpcyBjbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM2OS0zNzEKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdHJhbnNmZXIgcmlnaHQgdG8gRC1BU0Egb3duZXJzLiBPdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IHJlbGF5IG9uIG90aGVyCiAgICAvLyAjIHJvbGVzLCBleHRlcm5hbCBBcHBzIHRocm91Z2ggQzJDIGNhbGxzIChlLmcuLCBhbiBvcmRlciBib29rKSwgb3Igb2ZmLWNoYWluIHRyYW5zZmVyIGFnZW50cy4KICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MubmF0aXZlLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgLTMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3MgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzMKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUsIGVyci5TVVNQRU5ERUQKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50YyA0IC8vIDQ0OAogICAgZ2V0Yml0CiAgICBieXRlYyA3IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzctMzc5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0uc3VzcGVuZGVkLm5hdGl2ZSwgZXJyLlNVU1BFTkRFRAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50YyA0IC8vIDQ0OAogICAgZ2V0Yml0CiAgICBieXRlYyA3IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODEKICAgIC8vIHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIDUKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODAtMzgyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICksIGVyci5PVkVSX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzkwCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTEKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSA+IDA6CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnogYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDQKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA1CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNAogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDMtMzA2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLk5PTl9GVU5HSUJMRV9VTklUUwogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgdW5pdHMgYXJlIG5vdCBmdW5naWJsZQoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODctMTg4CiAgICAvLyAjIFRyYW5zZmVyIGlzIGZvcmJpZGRlbiBpbiBjYXNlIG9mIHBlbmRpbmcgY291cG9uIHBheW1lbnRzCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4OQogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMwogICAgZGlnIDEKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOTEtMTkyCiAgICAvLyAjIFRyYW5zZmVycmVkIHVuaXRzIHZhbHVlIChtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSB0aGUgdHJhbnNmZXIpCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTkzLTE5NQogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlLCBkdWVfY291cG9ucwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI3CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjYtNDI4CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNgogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNi00MjgKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgLSB1bml0cwogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzAKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjktNDMxCiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjkKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyOS00MzEKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNTMKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSA9PSAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJueiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBhcmM0LlVJbnQ2NCgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA4IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAwCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQodW5pdHMubmF0aXZlICogc2VuZGVyX3VuaXRfdmFsdWUubmF0aXZlICsgYWNjcnVlZF9pbnRlcmVzdCkKICAgIGZyYW1lX2RpZyAwCiAgICBidG9pCiAgICBmcmFtZV9kaWcgNQogICAgKgogICAgZnJhbWVfZGlnIDMKICAgICsKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAxNQoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk2CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gc2VuZGVyX3VuaXRfdmFsdWUKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgcmVwbGFjZTIgNDAKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTctMzk5CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5wYWlkX2NvdXBvbnMKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5Ny0zOTkKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnBhaWRfY291cG9ucwogICAgc3dhcAogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNwoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2RlZmF1bHRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNy0xMDgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTExLTExMgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAic3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5jb3VudF9kdWVfY291cG9ucygpIC0+IHVpbnQ2NDoKY291bnRfZHVlX2NvdXBvbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NTAtNTEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291bnRfZHVlX2NvdXBvbnMoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1MgogICAgLy8gY3VycmVudF90cyA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1MwogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmR1ZV9jb3Vwb25zX3dhdGVybWFyawogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJkdWVfY291cG9uc193YXRlcm1hcmsiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBpZiBjdXJyZW50X3RzID49IHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICA+PQogICAgYnogY291bnRfZHVlX2NvdXBvbnNfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1NQogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKCmNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NwogICAgLy8gc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgPSBkdWVfY291cG9ucwogICAgYnl0ZWMgMjMgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjgKICAgIC8vIHJldHVybiBkdWVfY291cG9ucwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmNvdW50X2R1ZV9jb3Vwb25zX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBlbGlmIGN1cnJlbnRfdHMgPiBzZWxmLmlzc3VhbmNlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBjb3Vwb25faWR4ID0gVUludDY0KGNmZy5GSVJTVF9DT1VQT05fREFURV9JRFgpICsgc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAiZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR1ZV9jb3Vwb25zX3dhdGVybWFyayBleGlzdHMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlW2NvdXBvbl9pZHhdLm5hdGl2ZQogICAgYnl0ZWMgMTEgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKCmNvdW50X2R1ZV9jb3Vwb25zX3doaWxlX3RvcEA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU5CiAgICAvLyB3aGlsZSBjdXJyZW50X3RzID49IGNvdXBvbl9kdWVfZGF0ZToKICAgIGZyYW1lX2RpZyAxCiAgICA8PQogICAgYnogY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfd2hpbGVANgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjYxCiAgICAvLyByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9DT1VQT05fRFVFX0NPVU5USU5HKSwKICAgIGludGMgNSAvLyAyNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2MgogICAgLy8gZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0LAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2MC02MwogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9DT1VQT05fRFVFX0NPVU5USU5HKSwKICAgIC8vICAgICBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQsCiAgICAvLyApCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NAogICAgLy8gY291cG9uX2lkeCArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjUKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYudGltZV9ldmVudHMudmFsdWVbY291cG9uX2lkeF0ubmF0aXZlCiAgICBieXRlYyAxMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYiBjb3VudF9kdWVfY291cG9uc193aGlsZV90b3BANAoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfd2hpbGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NgogICAgLy8gZHVlX2NvdXBvbnMgPSBjb3Vwb25faWR4IC0gY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWAogICAgZnJhbWVfZGlnIDAKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAtCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUA4CgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBkdWVfY291cG9uczogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo5Mi05NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6OTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6OTYtOTgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID09IGR1ZV9jb3Vwb25zCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiB1aW50NjQsIGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTMyLTEzNQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IFVJbnQ2NCwgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgYXNzZXJ0IHNhZmVndWFyZHMgdGhlIHN1YnJvdXRpbmUgZnJvbSBmb3JiaWRkZW4gaW52b2NhdGlvbnMKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTM4CiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMzkKICAgIC8vIGNvdXBvbl9hY2NydWVkX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDAKICAgIC8vIGNvdXBvbl9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQxCiAgICAvLyBuZXh0X2NvdXBvbl9yYXRlX2JwcyA9IHNlbGYuY291cG9uX3JhdGVzLnZhbHVlWwogICAgYnl0ZWMgMTcgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcmF0ZXMgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQxLTE0MwogICAgLy8gbmV4dF9jb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVsKICAgIC8vICAgICBkdWVfY291cG9ucwogICAgLy8gXS5uYXRpdmUgICMgZHVlX2NvdXBvbnMgaXMgZXF1YWwgdG8gdGhlIDAtYmFzZSBpZHggb2YgbmV4dCBjb3Vwb24KICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ1CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUtMTQ2CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUtMTQ3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDkKICAgIC8vIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUtMTUwCiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICAvLyAvLyAoCiAgICAvLyAgICAgY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QKICAgIC8vICkgICMgZGl2LWJ5LXplcm86IGNvdXBvbl9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCBjaGVja3MKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDQtMTUxCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gICAgICogbmV4dF9jb3Vwb25fcmF0ZV9icHMKICAgIC8vICAgICAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gICAgIC8vICgKICAgIC8vICAgICAgICAgY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QKICAgIC8vICAgICApICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQgY2hlY2tzCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gYnl0ZXM6CmRheV9jb3VudF9mYWN0b3I6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTA3LTEwOAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBkYXlfY291bnRfZmFjdG9yKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IHR5cC5EYXlDb3VudEZhY3RvcjoKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMDktMTEwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGlmIG5vdCBkdWVfY291cG9uczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMTEKICAgIC8vIGFjY3J1aW5nX3N0YXJ0X3RpbWUgPSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMTQKICAgIC8vIGNvdXBvbl9hY2NydWVkX3BlcmlvZCA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIC0gYWNjcnVpbmdfc3RhcnRfdGltZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZGlnIDEKICAgIC0KICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE1CiAgICAvLyBjb3Vwb25fcGVyaW9kID0gc2VsZi5uZXh0X2NvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucykgLSBhY2NydWluZ19zdGFydF90aW1lCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgbmV4dF9jb3Vwb25fZHVlX2RhdGUKICAgIHN3YXAKICAgIC0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE2CiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID09IFVJbnQ2NChjc3QuRENDX0FfQSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgNAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAxCiAgICBieiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQ5CiAgICAvLyByZXR1cm4gdGltZV9wZXJpb2QgLy8gVUludDY0KGNzdC5EQVlfMl9TRUMpCiAgICBmcmFtZV9kaWcgMAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAvCiAgICBmcmFtZV9kaWcgMwogICAgaW50YyA2IC8vIDg2NDAwCiAgICAvCiAgICBmcmFtZV9idXJ5IDQKICAgIGZyYW1lX2J1cnkgMQoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjAKICAgIC8vIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChjb3Vwb25fYWNjcnVlZF9wZXJpb2QpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoY291cG9uX3BlcmlvZCksCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE5LTEyMgogICAgLy8gcmV0dXJuIHR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQoY291cG9uX2FjY3J1ZWRfcGVyaW9kKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChjb3Vwb25fcGVyaW9kKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzYKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzcKICAgIC8vIGlmIGR1ZV9jb3Vwb25zID49IFVJbnQ2NCgxKToKICAgIGZyYW1lX2RpZyAtMQogICAgYnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo3OAogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gc2VsZi5jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgY291cG9uX2R1ZV9kYXRlCiAgICBmcmFtZV9idXJ5IDIKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA4OgogICAgZnJhbWVfZGlnIDIKICAgIGIgZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmNvdXBvbl9kdWVfZGF0ZShjb3Vwb246IHVpbnQ2NCkgLT4gdWludDY0Ogpjb3Vwb25fZHVlX2RhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzAtNzEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291cG9uX2R1ZV9kYXRlKHNlbGYsIGNvdXBvbjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo3MgogICAgLy8gcmV0dXJuIHNlbGYudGltZV9ldmVudHMudmFsdWVbY2ZnLkZJUlNUX0NPVVBPTl9EQVRFX0lEWCArIGNvdXBvbiAtIDFdLm5hdGl2ZQogICAgcHVzaGludCAzIC8vIDMKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGJ5dGVjIDExIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfZXZlbnRzIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLm5leHRfY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKbmV4dF9jb3Vwb25fZHVlX2RhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODEtODIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbmV4dF9jb3Vwb25fZHVlX2RhdGUoc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODMKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBpZiBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9uczoKICAgIGR1cAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA+CiAgICBieiBuZXh0X2NvdXBvbl9kdWVfZGF0ZV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo4NQogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gc2VsZi5jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMgKyAxKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgY2FsbHN1YiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2J1cnkgMAoKbmV4dF9jb3Vwb25fZHVlX2RhdGVfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyByZXR1cm4gY291cG9uX2R1ZV9kYXRlCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY291bnRfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzUtMzM4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzkKICAgIC8vIHJldHVybiB1bml0cyAqIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUubmF0aXZlCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLnBheV9jb3Vwb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9pbmZvOiBieXRlcykgLT4gYnl0ZXM6CnBheV9jb3Vwb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAyLTIwNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X2NvdXBvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjUtMjI2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjI3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzAKICAgIC8vIHVuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzEKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5OT19VTklUUwogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjMyCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gYWNjb3VudF9wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzQKICAgIC8vIGFzc2VydCBkdWVfY291cG9ucyA+IGFjY291bnRfcGFpZF9jb3Vwb25zLCBlcnIuTk9fRFVFX0NPVVBPTgogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBObyBkdWUgY291cG9uIHRvIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzNS0yMzgKICAgIC8vICMgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHZlcmlmeSBpZiBvdGhlciBhY2NvdW50cyBhcmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHBheW1lbnQgb2YgcHJldmlvdXMgY291cG9ucwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgYWNjb3VudF9wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDEKICAgIC8vIGlmIHNlbGYuaXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgaXNfcGF5bWVudF9leGVjdXRhYmxlCiAgICBieiBwYXlfY291cG9uX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQzCiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQ0CiAgICAvLyBhY2NvdW50X3BhaWRfY291cG9ucyArIDEsCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDItMjQ1CiAgICAvLyBwYXltZW50X2Ftb3VudCA9IHNlbGYuY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIC8vICAgICBhY2NvdW50X3BhaWRfY291cG9ucyArIDEsCiAgICAvLyApCiAgICBjYWxsc3ViIGNvdXBvbl9pbnRlcmVzdF9hbW91bnQKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0Ni0yNDcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gcGF5bWVudCBhZ2VudAogICAgLy8gc2VsZi5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50KQogICAgY2FsbHN1YiBhc3NlcnRfZW5vdWdoX2Z1bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQ4LTI0OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgc2FtZSBhc3NldCBmb3IgZGVub21pbmF0aW9uIGFuZCBzZXR0bGVtZW50LCBubyBjb252ZXJzaW9uIG5lZWRlZAogICAgLy8gc2VsZi5wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCBwYXltZW50X2Ftb3VudCkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgY2FsbHN1YiBwYXkKCnBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zLm5hdGl2ZSArIDEKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NC0yNTYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjU0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NC0yNTYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiA0OAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NwogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYWlkX2NvdXBvbl91bml0cyBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBieXRlYyAyNCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1OQogICAgLy8gYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNjAKICAgIC8vIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjU4LTI2MgogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICAvLyAgICAgdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mby5jb3B5KCksICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBjb25jYXQKICAgIGJ5dGVjIDMxIC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnBheV9jb3Vwb25fZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjUxLTI1MgogICAgLy8gIyBBY2NvdW50cyBzdXNwZW5kZWQgb3Igbm90IG9wdGVkIGluIGF0IHRoZSB0aW1lIG9mIHBheW1lbnRzIG11c3Qgbm90IHN0YWxsIHRoZSBELUFTQQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X2NvdXBvbl9hZnRlcl9pZl9lbHNlQDMKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWxsX2R1ZV9jb3Vwb25zX3BhaWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODgtODkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWxsX2R1ZV9jb3Vwb25zX3BhaWQoc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjkwCiAgICAvLyByZXR1cm4gc2VsZi5wYWlkX2NvdXBvbl91bml0cyA+PSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogZHVlX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgID49CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdWludDY0Ogppc19wYXltZW50X2V4ZWN1dGFibGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDgtMzA5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGlzX3BheW1lbnRfZXhlY3V0YWJsZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzExCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzEyCiAgICAvLyBBc3NldChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzExLTMxMwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIC8vICAgICBBc3NldChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCkKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTEtMzE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgLy8gICAgIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBieiBpc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTQKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDcgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCmlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTAtMzE1CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgICAgIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgLy8gICAgICkKICAgIC8vICAgICBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUKICAgIC8vICkKICAgIHN3YXAKICAgIHJldHN1YgoKaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICBiIGlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKYWNjb3VudF90b3RhbF91bml0c192YWx1ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0MS0zNDIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWNjb3VudF90b3RhbF91bml0c192YWx1ZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDQKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQzLTM0NQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuY291cG9uX2ludGVyZXN0X2Ftb3VudChwcmluY2lwYWxfYW1vdW50OiB1aW50NjQsIGNvdXBvbjogdWludDY0KSAtPiB1aW50NjQ6CmNvdXBvbl9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTAwLTEwMwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjb3Vwb25faW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYsIHByaW5jaXBhbF9hbW91bnQ6IFVJbnQ2NCwgY291cG9uOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTA0CiAgICAvLyBjb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVtjb3Vwb24gLSAxXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGJ5dGVjIDE3IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3JhdGVzIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTA1CiAgICAvLyByZXR1cm4gcHJpbmNpcGFsX2Ftb3VudCAqIGNvdXBvbl9yYXRlX2JwcyAvLyBjc3QuQlBTCiAgICBmcmFtZV9kaWcgLTIKICAgICoKICAgIHB1c2hpbnQgMTAwMDAgLy8gMTAwMDAKICAgIC8KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9lbm91Z2hfZnVuZHMocGF5bWVudF9hbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKYXNzZXJ0X2Vub3VnaF9mdW5kczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxNy0zMTgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2Vub3VnaF9mdW5kcyhzZWxmLCBwYXltZW50X2Ftb3VudDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjEKICAgIC8vIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjAKICAgIC8vIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5iYWxhbmNlKAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjAtMzIyCiAgICAvLyBBc3NldChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCkuYmFsYW5jZSgKICAgIC8vICAgICBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyMC0zMjMKICAgIC8vIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5iYWxhbmNlKAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICkKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTktMzI0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5iYWxhbmNlKAogICAgLy8gICAgICAgICBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyAgICAgKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5wYXkocmVjZWl2ZXI6IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKcGF5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI2LTMyNwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBwYXkoc2VsZiwgcmVjZWl2ZXI6IGFyYzQuQWRkcmVzcywgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyOC0zMzMKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMyCiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI5CiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI4LTMzMwogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLm5hdGl2ZSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5wYXlfcHJpbmNpcGFsKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfaW5mbzogYnl0ZXMpIC0+IGJ5dGVzOgpwYXlfcHJpbmNpcGFsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI2NC0yNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHBheV9wcmluY2lwYWwoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfaW5mbzogYXJjNC5EeW5hbWljQnl0ZXMKICAgIC8vICkgLT4gdHlwLlBheW1lbnRSZXN1bHQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYtNDM3CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwbiAyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDEKICAgIC8vIHVuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQyCiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQzCiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5tYXR1cml0eV9kYXRlLCBlcnIuTk9UX01BVFVSRQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID49CiAgICBhc3NlcnQgLy8gTm90IG1hdHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI5MQogICAgLy8gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mjg5LTI5MgogICAgLy8gIyBQcmluY2lwYWwgcGF5bWVudCBpcyBmb3JiaWRkZW4gaW4gY2FzZSBvZiBwZW5kaW5nIGNvdXBvbiBwYXltZW50cwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mjk1CiAgICAvLyBpZiBzZWxmLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGlzX3BheW1lbnRfZXhlY3V0YWJsZQogICAgYnogcGF5X3ByaW5jaXBhbF9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI5NgogICAgLy8gcGF5bWVudF9hbW91bnQgPSBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI5Ny0yOTgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gcGF5bWVudCBhZ2VudAogICAgLy8gc2VsZi5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50KQogICAgY2FsbHN1YiBhc3NlcnRfZW5vdWdoX2Z1bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mjk5LTMwMAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgc2FtZSBhc3NldCBmb3IgZGVub21pbmF0aW9uIGFuZCBzZXR0bGVtZW50LCBubyBjb252ZXJzaW9uIG5lZWRlZAogICAgLy8gc2VsZi5wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCBwYXltZW50X2Ftb3VudCkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgY2FsbHN1YiBwYXkKCnBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC0KICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1MQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA4IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgMzIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1MgogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMDcKICAgIC8vIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzA4CiAgICAvLyB0aW1lc3RhbXA9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMwNi0zMTAKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudFJlc3VsdCgKICAgIC8vICAgICBhbW91bnQ9YXJjNC5VSW50NjQocGF5bWVudF9hbW91bnQpLAogICAgLy8gICAgIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8uY29weSgpLCAgIyBUT0RPOiBBZGQgaW5mbyBvbiBmYWlsZWQgcGF5bWVudAogICAgLy8gKQogICAgY29uY2F0CiAgICBieXRlYyAzMSAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKcGF5X3ByaW5jaXBhbF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMDItMzAzCiAgICAvLyAjIEFjY291bnRzIHN1c3BlbmRlZCBvciBub3Qgb3B0ZWQgaW4gYXQgdGhlIHRpbWUgb2YgcGF5bWVudHMgbXVzdCBub3Qgc3RhbGwgdGhlIEQtQVNBCiAgICAvLyBwYXltZW50X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYiBwYXlfcHJpbmNpcGFsX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpIC0+IHZvaWQ6CmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1Ny0zNTgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1OQogICAgLy8gaWYgc2VsZi5jaXJjdWxhdGluZ191bml0cyA9PSAwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgYm56IGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM2MAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGludGMgNyAvLyAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CgplbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzEyLTMxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IHR5cC5DdXJyZW50VW5pdHNWYWx1ZToKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzMzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMzMy0zMzQKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzM0CiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzMzLTMzNAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzItMzM1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyApLCBlcnIuTk9fUFJJTUFSWV9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzM4CiAgICAvLyAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDcKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBiPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzM3LTMzOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9VTklUUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYW1vdW50IG9mIHVuaXRzIGZvciB0aGUgYWNjb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0MwogICAgLy8gaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNDEtMzQ0CiAgICAvLyAjIFZhbHVlIGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSA9IHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0NS0zNDYKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uIGFuZCBhdCBtYXR1cml0eQogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzQ3CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0OAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1MC0zNTEKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1MgogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0yCiAgICBkaWcgMQogICAgY2FsbHN1YiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1MwogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9ucyk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTQKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTUtMzU3CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gc2VsZi5hY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZSwgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDYKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzU4CiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTkKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSAzCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzYxCiAgICAvLyB1bml0c192YWx1ZT1hcmM0LlVJbnQ2NChhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUpLAogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjIKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICBmcmFtZV9kaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICBmcmFtZV9kaWcgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2NQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjMtMzY2CiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzYwLTM2NwogICAgLy8gcmV0dXJuIHR5cC5DdXJyZW50VW5pdHNWYWx1ZSgKICAgIC8vICAgICB1bml0c192YWx1ZT1hcmM0LlVJbnQ2NChhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUpLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICAvLyAgICAgZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAOAoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuaXNfYWNjcnVpbmdfaW50ZXJlc3QoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0Ogppc19hY2NydWluZ19pbnRlcmVzdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjQtMTI1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGlzX2FjY3J1aW5nX2ludGVyZXN0KHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjcKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyNy0xMjkKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI3LTEyOQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgYnogaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI5CiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMAogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gYW5kIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zCiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI2LTEzMAogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMAogICAgLy8gICAgIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIC8vICkKICAgIHJldHN1YgoKaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjYtMTMwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5nZXRfY291cG9uX3JhdGVzKCkgLT4gYnl0ZXM6CmdldF9jb3Vwb25fcmF0ZXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzY5LTM3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2NvdXBvbl9yYXRlcyhzZWxmKSAtPiB0eXAuQ291cG9uUmF0ZXM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNzcKICAgIC8vIGNvdXBvbl9yYXRlcyA9IHR5cC5Db3Vwb25SYXRlcygpCiAgICBieXRlYyAzMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mzc4CiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF9jb3Vwb25fcmF0ZXNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mzc5CiAgICAvLyBjb3Vwb25fcmF0ZXMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDE3IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcmF0ZXMgZXhpc3RzCgpnZXRfY291cG9uX3JhdGVzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozODAKICAgIC8vIHJldHVybiBjb3Vwb25fcmF0ZXMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9wYXltZW50X2Ftb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3BheW1lbnRfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM4Mi0zODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wYXltZW50X2Ftb3VudChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLlBheW1lbnRBbW91bnRzOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mzk3CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOTctMzk4CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBVSW50NjQoKQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOTkKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwMAogICAgLy8gcGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zLm5hdGl2ZQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gaWYgcGFpZF9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIDwKICAgIGJ6IGdldF9wYXltZW50X2Ftb3VudF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwNQogICAgLy8gcGFpZF9jb3Vwb25zICsgMSwKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQwMi00MDYKICAgIC8vICMgQ291cG9uIFBheW1lbnQKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHNlbGYuY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnMgKyAxLAogICAgLy8gKQogICAgY2FsbHN1YiBjb3Vwb25faW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDIKCmdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDQ6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSA1CgpnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDExCiAgICAvLyBpbnRlcmVzdD1hcmM0LlVJbnQ2NChpbnRlcmVzdF9hbW91bnQpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQxMgogICAgLy8gcHJpbmNpcGFsPWFyYzQuVUludDY0KHByaW5jaXBhbF9hbW91bnQpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQxMC00MTMKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9YXJjNC5VSW50NjQoaW50ZXJlc3RfYW1vdW50KSwKICAgIC8vICAgICBwcmluY2lwYWw9YXJjNC5VSW50NjQocHJpbmNpcGFsX2Ftb3VudCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfcGF5bWVudF9hbW91bnRfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDA4LTQwOQogICAgLy8gIyBQcmluY2lwYWwgUGF5bWVudAogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgZnJhbWVfYnVyeSAzCiAgICBiIGdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDQKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9jb3Vwb25zX3N0YXR1cygpIC0+IGJ5dGVzOgpnZXRfY291cG9uc19zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDE1LTQxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2NvdXBvbnNfc3RhdHVzKHNlbGYpIC0+IHR5cC5Db3Vwb25zSW5mbzoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyNAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cG4gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyNQogICAgLy8gbmV4dF9jb3Vwb25fZHVlX2RhdGUgPSBzZWxmLm5leHRfY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zKQogICAgY2FsbHN1YiBuZXh0X2NvdXBvbl9kdWVfZGF0ZQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyNgogICAgLy8gYWxsX2R1ZV9jb3Vwb25zX3BhaWQgPSBzZWxmLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zKQogICAgZHVwCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDI3CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MjgKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDI5CiAgICAvLyBpZiBzZWxmLmlzX2FjY3J1aW5nX2ludGVyZXN0KGR1ZV9jb3Vwb25zKToKICAgIGNhbGxzdWIgaXNfYWNjcnVpbmdfaW50ZXJlc3QKICAgIGJ6IGdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzAKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgMAogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDMxCiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzIKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSA0CgpnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzNAogICAgLy8gdG90YWxfY291cG9ucz1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX2NvdXBvbnMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzUKICAgIC8vIGR1ZV9jb3Vwb25zPWFyYzQuVUludDY0KGR1ZV9jb3Vwb25zKSwKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDM2CiAgICAvLyBuZXh0X2NvdXBvbl9kdWVfZGF0ZT1hcmM0LlVJbnQ2NChuZXh0X2NvdXBvbl9kdWVfZGF0ZSksCiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzOAogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzOQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzctNDQwCiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDQxCiAgICAvLyBhbGxfZHVlX2NvdXBvbnNfcGFpZD1hcmM0LkJvb2woYWxsX2R1ZV9jb3Vwb25zX3BhaWQpLAogICAgYnl0ZWMgNyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzMy00NDIKICAgIC8vIHJldHVybiB0eXAuQ291cG9uc0luZm8oCiAgICAvLyAgICAgdG90YWxfY291cG9ucz1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX2NvdXBvbnMpLAogICAgLy8gICAgIGR1ZV9jb3Vwb25zPWFyYzQuVUludDY0KGR1ZV9jb3Vwb25zKSwKICAgIC8vICAgICBuZXh0X2NvdXBvbl9kdWVfZGF0ZT1hcmM0LlVJbnQ2NChuZXh0X2NvdXBvbl9kdWVfZGF0ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBhbGxfZHVlX2NvdXBvbnNfcGFpZD1hcmM0LkJvb2woYWxsX2R1ZV9jb3Vwb25zX3BhaWQpLAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfY3JlYXRlKGFycmFuZ2VyOiBieXRlcywgbWV0YWRhdGE6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jcmVhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTQtNDU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBhc3NldF9jcmVhdGUoc2VsZiwgYXJyYW5nZXI6IGFyYzQuQWRkcmVzcywgbWV0YWRhdGE6IHR5cC5Bc3NldE1ldGFkYXRhKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjMKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlci5uYXRpdmUKICAgIGJ5dGVjIDE4IC8vIDB4NTIzMjMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NAogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NvbmZpZyhkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGJ5dGVzLCBzZXR0bGVtZW50X2Fzc2V0X2lkOiBieXRlcywgcHJpbmNpcGFsOiBieXRlcywgbWluaW11bV9kZW5vbWluYXRpb246IGJ5dGVzLCBkYXlfY291bnRfY29udmVudGlvbjogYnl0ZXMsIGludGVyZXN0X3JhdGU6IGJ5dGVzLCBjb3Vwb25fcmF0ZXM6IGJ5dGVzLCB0aW1lX2V2ZW50czogYnl0ZXMsIHRpbWVfcGVyaW9kczogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NvbmZpZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3Ni00ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X2NvbmZpZygKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb246IGFyYzQuVUludDgsCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZTogYXJjNC5VSW50MTYsCiAgICAvLyAgICAgY291cG9uX3JhdGVzOiB0eXAuQ291cG9uUmF0ZXMsCiAgICAvLyAgICAgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzLAogICAgLy8gICAgIHRpbWVfcGVyaW9kczogdHlwLlRpbWVQZXJpb2RzLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gOSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUxNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTE4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTVBUWSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjAtNTIxCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC05CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gZGVub21pbmF0aW9uX2Fzc2V0X2lkICE9IFVJbnQ2NCgwKSBhbmQgQXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5jcmVhdG9yCiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUA0CiAgICBmcmFtZV9kaWcgMwogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc1LTE3OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBkZW5vbWluYXRpb24gd2l0aCBBU0EKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZGVub21pbmF0aW9uX2Fzc2V0X2lkICE9IFVJbnQ2NCgwKSBhbmQgQXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5jcmVhdG9yCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBEZW5vbWluYXRpb24gYXNzZXQgaXMgbm90IHByb3Blcmx5IHNldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTgyCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IGRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgYnl0ZWMgOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjQtNTI1CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTgKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICBkaWcgMQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4Ni0xODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0yMDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NgogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NwogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTgKICAgIC8vIGFzc2V0X2Ftb3VudD0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0xOTUKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk0LTIwMAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMAogICAgLy8gcHJpbmNpcGFsLm5hdGl2ZSAlIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZSA9PSAwCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtNgogICAgYnRvaQogICAgZHVwMgogICAgJQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI4LTUzMQogICAgLy8gIyBTZXQgUHJpbmNpcGFsIGFuZCBNaW5pbXVtIERlbm9taW5hdGlvbgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIC8vICksIGVyci5JTlZBTElEX01JTklNVU1fREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gTWluaW11bSBkZW5vbWluYXRpb24gaXMgbm90IGEgZGl2aXNvciBvZiBwcmluY2lwYWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMgogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gcHJpbmNpcGFsLm5hdGl2ZSAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIC8KICAgIGJ5dGVjIDE0IC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzUtNTM2CiAgICAvLyAjIFNldCBEYXktQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5hc3NlcnRfZGF5X2NvdW50X2NvbnZlbnRpb24oZGF5X2NvdW50X2NvbnZlbnRpb24ubmF0aXZlKQogICAgZnJhbWVfZGlnIC01CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA2CiAgICAvLyBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgaW50Y18zIC8vIDEwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA0LTIwOAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJueiBhc3NldF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBmcmFtZV9kaWcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA3CiAgICAvLyBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIGludGMgNSAvLyAyNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNwoKYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTIKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBkYXlfY291bnRfY29udmVudGlvbgogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzktNTQwCiAgICAvLyAjIFNldCBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLmFzc2VydF9pbnRlcmVzdF9yYXRlKGludGVyZXN0X3JhdGUubmF0aXZlKQogICAgZnJhbWVfZGlnIC00CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTYKICAgIC8vIGFzc2VydCBpbnRlcmVzdF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9JTlRFUkVTVF9SQVRFCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjAKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDI2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0OAogICAgLy8gYXNzZXJ0IGNvdXBvbl9yYXRlcy5sZW5ndGgsIGVyci5JTlZBTElEX0NPVVBPTl9SQVRFUwogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIENvdXBvbiByYXRlcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gY291cG9uX3JhdGVzLmxlbmd0aAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjkKICAgIC8vIGlmIHNlbGYudG90YWxfY291cG9uczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjMwCiAgICAvLyBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZSA9IGNvdXBvbl9yYXRlcy5jb3B5KCkKICAgIGJ5dGVjIDE3IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAxNyAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGZyYW1lX2RpZyAtMwogICAgYm94X3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzUKICAgIC8vIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgICsKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzQtMjM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDkKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjAKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDExIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTEgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEtMjYzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjYxLTI2MwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjQtMjY2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDIwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjQtMjY2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NwogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gdGltZV9ldmVudHNbY2ZnLklTU1VBTkNFX0RBVEVfSURYXS5uYXRpdmUKICAgIGV4dHJhY3QgMTYgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5LTI3MAogICAgLy8gIyBTb21lIEQtQVNBIG1heSBub3QgaGF2ZSBhIG1hdHVyaXR5IGRhdGUgKGUuZy4sIHBlcnBldHVhbHMpCiAgICAvLyBpZiB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgICsKICAgID09CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjcxCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzUKICAgIC8vIGFzc2VydCBub3QgdGltZV9wZXJpb2RzLmxlbmd0aCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1NgogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBpbnRjXzMgLy8gMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgphc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4Cgphc3NldF9jb25maWdfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE1LTExNgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5hcnJhbmdlci52YWx1ZSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzOC0yMzkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWxmLCB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDEKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDIKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MS0yNDIKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MC0yNDMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gICAgID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUUKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDQKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ2CiAgICAvLyByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9USU1FX0VWRU5UX1NPUlRJTkcpLAogICAgcHVzaGludCA2NSAvLyA2NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ3CiAgICAvLyBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuQXBwQWNjb3VudCwgICMgQXBwIGZ1bmRzIGFyZSBub3QgYXQgcmlzayBzaW5jZSBjYWxsZXIgaXMgdHJ1c3RlZAogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NS0yNDgKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PVVJbnQ2NChjZmcuT1BfVVBfVElNRV9FVkVOVF9TT1JUSU5HKSwKICAgIC8vICAgICBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuQXBwQWNjb3VudCwgICMgQXBwIGZ1bmRzIGFyZSBub3QgYXQgcmlzayBzaW5jZSBjYWxsZXIgaXMgdHJ1c3RlZAogICAgLy8gKQogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW190XS5uYXRpdmUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUwCiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tfdCArIDFdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUyCiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGludGMgNSAvLyAyNTUKICAgICE9CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUzLTI1NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUzLTI1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIC8vICAgICBjc3QuREFZXzJfU0VDCiAgICAvLyApID09IDAsIGVyci5JTlZBTElEX1RJTUVfUEVSSU9ECiAgICBpbnRjIDYgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTgtNTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU3OQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDcgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4MwogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODQKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODUKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODcKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4OC01OTAKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4Ny01OTAKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODYtNTkxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTItNTk0CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NQogICAgLy8gaWYgc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OQogICAgLy8gY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OC02MDAKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5Ny02MDAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYtNjAxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDItNjA0CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA3CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA2LTYwOAogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOS02MTEKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDUtNjEyCiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNC02MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzcKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM4CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzOQogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0MQogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0MgogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ2CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDUtNjc0CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OAogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzMgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjctNjY5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3MQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjcwLTY3MgogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNyAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjUKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjIKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU2CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI5IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1OAogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3LTY1OQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTAKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDMwIC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5LTY1MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTMKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1Mi02NTQKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ3CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgMTggLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NpZ25fcm9sZV9ib29sX21lcmdlQDgKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5yZXZva2Vfcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcykgLT4gYnl0ZXM6CnJldm9rZV9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc3LTY3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmV2b2tlX3JvbGUoc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTcKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk4CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk3LTcwMwogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2CgpyZXZva2Vfcm9sZV9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgpyZXZva2Vfcm9sZV9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDUtNzA2CiAgICAvLyAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAgLy8gNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDQtNzIyCiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAOCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDkgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMyAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjAKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNyAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTcKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjggLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE0CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTAKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOSAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTEKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzAgLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIHJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLm9wZW5fYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKb3Blbl9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1LTcyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3Blbl9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ1CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA3IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUzCiAgICAvLyB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MS03NTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTQKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU1CiAgICAvLyBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU2CiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICBieXRlYyA3IC8vIDB4MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MS03NTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTgKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTktMTIwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgYnl0ZWMgMzAgLy8gMHg1MjM0MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjMtMTI2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNAogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfbWFuYWdlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNQogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNC0xMjYKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnRfbWFuYWdlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI1LTEyNgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNC0xMjYKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgphc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjItMTI3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gICAgIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgphc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcl9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5jbG9zZV9hY2NvdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpjbG9zZV9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwLTc2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xvc2VfYWNjb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlR1cGxlW2FyYzQuVUludDY0LCBhcmM0LlVJbnQ2NF06CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3OAogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MgogICAgLy8gY2xvc2VkX3VuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODMKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UICsgaG9sZGluZ19hZGRyZXNzLmJ5dGVzKQogICAgc3dhcAogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODQKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgLQogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg1CiAgICAvLyBzZWxmLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpCiAgICBjYWxsc3ViIGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg3CiAgICAvLyAoYXJjNC5VSW50NjQoY2xvc2VkX3VuaXRzKSwgYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApKQogICAgaXRvYgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg2LTc4OAogICAgLy8gcmV0dXJuIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIC8vICkKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EucHJpbWFyeV9kaXN0cmlidXRpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTAtNzkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODQtMjg3CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NS0yODYKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg3CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg2LTI4NwogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg3CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODMtMjg4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzMKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBieXRlYyAyOSAvLyAweDUyMzUzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzMtMTM2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM1CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNS0xMzYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNC0xMzYKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzItMTM3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgxOAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIwCiAgICAvLyBhc3NlcnQgdW5pdHMubmF0aXZlID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyMgogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjEtODIzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI1CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICs9IHVuaXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNi04MjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNi04MjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IGFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBzd2FwCiAgICByZXBsYWNlMiA0MAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMwCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyAtIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgLQogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYXNzZXRfc3VzcGVuc2lvbihzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzItODMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYXNzZXRfc3VzcGVuc2lvbihzZWxmLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0NgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDcKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KHN1c3BlbmRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDIxIC8vICJzdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ5LTE1MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNzMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzLTE1NgogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NC0xNTUKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU2CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NS0xNTYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU2CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUyLTE1NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vICAgICBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2FjY291bnRfc3VzcGVuc2lvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2FjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1MC04NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hY2NvdW50X3N1c3BlbnNpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHN1c3BlbmRlZDogYXJjNC5Cb29sCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGludGMgNCAvLyA0NDgKICAgIHN3YXAKICAgIHNldGJpdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfZGVmYXVsdF9zdGF0dXMoZGVmYXVsdGVkOiBieXRlcykgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODczLTg3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2RlZmF1bHRfc3RhdHVzKHNlbGYsIGRlZmF1bHRlZDogYXJjNC5Cb29sKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBieXRlYyAyOCAvLyAweDUyMzYzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDMtMTQ2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1LTE0NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Mi0xNDcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gICAgIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODUKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KGRlZmF1bHRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9pbmZvKCkgLT4gYnl0ZXM6CmdldF9hc3NldF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg3LTg4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2luZm8oc2VsZikgLT4gdHlwLkFzc2V0SW5mbzoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk4CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTkKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAwCiAgICAvLyB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMQogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAyCiAgICAvLyBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDMKICAgIC8vIHRvdGFsX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX3VuaXRzKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDQKICAgIC8vIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNS05MDcKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOC05MTAKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMQogICAgLy8gaXNzdWFuY2VfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLmlzc3VhbmNlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMgogICAgLy8gbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMwogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICBieXRlYyA3IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE0CiAgICAvLyBkZWZhdWx0ZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5kZWZhdWx0ZWQpKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgIGJ5dGVjIDcgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTctOTE1CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgLy8gKQogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBwdXNoaW50IDYwMSAvLyA2MDEKICAgIHN3YXAKICAgIHNldGJpdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNy05MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNC05MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQyCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIGJ5dGVjIDMyIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0MwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDQKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDExIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ1CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0Ny05NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTAKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1MQogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ5LTk1MgogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQtOTU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NgogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X3VwZGF0ZSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2Ni00NjcKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgYXNzZXRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MS00NzQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANwogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDM0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANjoKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDc6CiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLl9fYWxnb3B5X2VudHJ5cG9pbnRfd2l0aF9pbml0KCkgLT4gdWludDY0OgptYWluOgogICAgaW50Y2Jsb2NrIDAgMSA4IDEwMCA0NDggMjU1IDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NTIzMzMwMjMgImNpcmN1bGF0aW5nX3VuaXRzIiAic3RhdHVzIiAidG90YWxfY291cG9ucyIgImlzc3VhbmNlX2RhdGUiICJzZXR0bGVtZW50X2Fzc2V0X2lkIiAibWF0dXJpdHlfZGF0ZSIgMHgwMCAweDAwMDAwMDAwMDAwMDAwMDAgInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIgMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MyAidW5pdF92YWx1ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAidG90YWxfdW5pdHMiICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIiAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMgMHg1MjMyMzAyMyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIiAic3VzcGVuZGVkIiAiZGVmYXVsdGVkIiAiZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIiAicGFpZF9jb3Vwb25fdW5pdHMiICJtZXRhZGF0YSIgImludGVyZXN0X3JhdGUiIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDEyIDB4MDAwMCAweDUyMzgzMDIzIDB4MDY4MTAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyBSb2xlIEJhc2VkIEFjY2VzcyBDb250cm9sCiAgICAvLyBzZWxmLmFycmFuZ2VyID0gR2xvYmFsU3RhdGUoQWNjb3VudCgpLCBrZXk9Y3N0LlBSRUZJWF9JRF9BUlJBTkdFUikKICAgIGJ5dGVjIDE4IC8vIDB4NTIzMjMwMjMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5LTYwCiAgICAvLyAjIEFzc2V0IENvbmZpZ3VyYXRpb24KICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjMKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBVSW50NjQoKQogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NS02NgogICAgLy8gIyBNZXRhZGF0YQogICAgLy8gc2VsZi5tZXRhZGF0YSA9IEJ5dGVzKCkKICAgIGJ5dGVjIDI1IC8vICJtZXRhZGF0YSIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY4LTY5CiAgICAvLyAjIFN1cHBseQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAidG90YWxfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3Mi03MwogICAgLy8gIyBJbnRlcmVzdAogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDI2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gVUludDY0KCkKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA3IC8vICJtYXR1cml0eV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OS05MAogICAgLy8gIyBTdGF0dXMKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU1QVFkpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxCiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAyMSAvLyAic3VzcGVuZGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MgogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjIgLy8gImRlZmF1bHRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2LTM3CiAgICAvLyAjIFN0YXRlIHNjaGVtYSB2YWxpZGF0aW9uCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fdWludCA9PSBjZmcuR0xPQkFMX1VJTlRTLCBlcnIuV1JPTkdfR0xPQkFMX1VJTlRTCiAgICB0eG4gR2xvYmFsTnVtVWludAogICAgcHVzaGludCAxOSAvLyAxOQogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV9ieXRlX3NsaWNlID09IGNmZy5MT0NBTF9CWVRFUywgZXJyLldST05HX0xPQ0FMX0JZVEVTCiAgICB0eG4gTG9jYWxOdW1CeXRlU2xpY2UKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBCeXRlcyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDAKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDItNDMKICAgIC8vICMgQ291cG9ucwogICAgLy8gc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgPSBVSW50NjQoKQogICAgYnl0ZWMgMjMgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBzZWxmLnBhaWRfY291cG9uX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDI0IC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMjgKICAgIHB1c2hieXRlc3MgMHg0ZmQ2YTNjYyAweDhjZjE0YjUxIDB4OWM3NmI2YTMgMHg0NDM2M2Q0OSAweDUzYmVmMDQ1IDB4NjdkYjRmMjAgMHhmNmE5NmM4ZCAweDYzZjk5NTg5IDB4ZDNhNGQ2YWIgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHg4MGJmY2RkMSAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGRkY2VjMDdiIC8vIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInBheV9jb3Vwb24oYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAicGF5X3ByaW5jaXBhbChhZGRyZXNzLGJ5dGVbXSkodWludDY0LHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKGFkZHJlc3MsdWludDY0KSh1aW50NjQsdWludDY0LCh1aW50NjQsdWludDY0KSkiLCBtZXRob2QgImdldF9jb3Vwb25fcmF0ZXMoKXVpbnQxNltdIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldF9jb3Vwb25zX3N0YXR1cygpKHVpbnQ2NCx1aW50NjQsdWludDY0LCh1aW50NjQsdWludDY0KSxib29sKSIsIG1ldGhvZCAiYXNzZXRfY3JlYXRlKGFkZHJlc3MsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQxNltdLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiLCBtZXRob2QgInNldF9zZWNvbmRhcnlfdGltZV9ldmVudHModWludDY0W10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhc3NpZ25fcm9sZShhZGRyZXNzLHVpbnQ4LGJ5dGVbXSl1aW50NjQiLCBtZXRob2QgInJldm9rZV9yb2xlKGFkZHJlc3MsdWludDgpdWludDY0IiwgbWV0aG9kICJvcGVuX2FjY291bnQoYWRkcmVzcyxhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAiY2xvc2VfYWNjb3VudChhZGRyZXNzKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicHJpbWFyeV9kaXN0cmlidXRpb24oYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJzZXRfYXNzZXRfc3VzcGVuc2lvbihib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2FjY291bnRfc3VzcGVuc2lvbihhZGRyZXNzLGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfZGVmYXVsdF9zdGF0dXMoYm9vbCl2b2lkIiwgbWV0aG9kICJnZXRfYXNzZXRfaW5mbygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sKSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9ldmVudHMoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpdWludDY0W10iLCBtZXRob2QgImdldF9hc3NldF9tZXRhZGF0YSgpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1IG1haW5fcGF5X2NvdXBvbl9yb3V0ZUA2IG1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA3IG1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA4IG1haW5fZ2V0X2NvdXBvbl9yYXRlc19yb3V0ZUA5IG1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDEwIG1haW5fZ2V0X2NvdXBvbnNfc3RhdHVzX3JvdXRlQDExIG1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyIG1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDEzIG1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUAxNCBtYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDE1IG1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTYgbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTcgbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDE4IG1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMTkgbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMCBtYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMjEgbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMjIgbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyMyBtYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMjQgbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjUgbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNiBtYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyNwoKbWFpbl9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWV0YWRhdGFfcm91dGVAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9tZXRhZGF0YQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3RpbWVfZXZlbnRzX3JvdXRlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9kZWZhdWx0X3N0YXR1cwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2FjY291bnRfc3VzcGVuc2lvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcHJpbWFyeV9kaXN0cmlidXRpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNsb3NlX2FjY291bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fb3Blbl9hY2NvdW50X3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcmV2b2tlX3JvbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzaWduX3JvbGVfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NpZ25fcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jb25maWdfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF9jb25maWcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgY2FsbHN1YiBhc3NldF9jcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2NvdXBvbnNfc3RhdHVzX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2NvdXBvbnNfc3RhdHVzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9wYXltZW50X2Ftb3VudF9yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X3BheW1lbnRfYW1vdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9jb3Vwb25fcmF0ZXNfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9jb3Vwb25fcmF0ZXMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMC0yOAogICAgLy8gY2xhc3MgRml4ZWRDb3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3BheV9wcmluY2lwYWxfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGF5X3ByaW5jaXBhbAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wYXlfY291cG9uX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHBheV9jb3Vwb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfdHJhbnNmZXJfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAtMjgKICAgIC8vIGNsYXNzIEZpeGVkQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfdHJhbnNmZXIKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwLTI4CiAgICAvLyBjbGFzcyBGaXhlZENvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIG1haW5fYXNzZXRfdXBkYXRlQDI5CiAgICBiIG1haW5fYWZ0ZXJfaWZfZWxzZUAzMAoKbWFpbl9hc3NldF91cGRhdGVAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NC00NjUKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgYXNzZXRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBjYWxsc3ViIGFzc2V0X3VwZGF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuYXNzZXRfdHJhbnNmZXIoc2VuZGVyX2hvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2V0X3RyYW5zZmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE1My0xNTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIHVuaXRzOiBhcmM0LlVJbnQ2NCwKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAzIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg0CiAgICAvLyB1bml0cy5uYXRpdmUsCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTMtMjk2CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk1CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk2CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTYKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NS0yOTYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyA0CiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk2CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkyLTI5NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjctMzY5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLm5hdGl2ZSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzcxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlLCBlcnIuU1VTUEVOREVECiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgOCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc1LTM3NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnN1c3BlbmRlZC5uYXRpdmUsIGVyci5TVVNQRU5ERUQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgOCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc5CiAgICAvLyB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyA1CiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc4LTM4MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4OAogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzg5CiAgICAvLyBpZiBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPiAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0LTMwNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0LTMwNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzAzLTMwNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gICAgIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5OT05fRlVOR0lCTEVfVU5JVFMKICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIHVuaXRzIGFyZSBub3QgZnVuZ2libGUKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg3LTE4OAogICAgLy8gIyBUcmFuc2ZlciBpcyBmb3JiaWRkZW4gaW4gY2FzZSBvZiBwZW5kaW5nIGNvdXBvbiBwYXltZW50cwogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODkKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTkxLTE5MgogICAgLy8gIyBUcmFuc2ZlcnJlZCB1bml0cyB2YWx1ZSAobXVzdCBiZSBjb21wdXRlZCBiZWZvcmUgdGhlIHRyYW5zZmVyKQogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5My0xOTUKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZSwgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMgogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI0LTQyNgogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjQKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjQtNDI2CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI4CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI3LTQyOQogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjctNDI5CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzUxCiAgICAvLyBpZiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPT0gMDoKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzUyCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiA0MAogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gYXJjNC5VSW50NjQoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0Cgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHVuaXRzLm5hdGl2ZSAqIHNlbmRlcl91bml0X3ZhbHVlLm5hdGl2ZSArIGFjY3J1ZWRfaW50ZXJlc3QpCiAgICBmcmFtZV9kaWcgMAogICAgYnRvaQogICAgZnJhbWVfZGlnIDUKICAgICoKICAgIGZyYW1lX2RpZyAzCiAgICArCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMTUKCmFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk1LTM5NwogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0ucGFpZF9jb3Vwb25zCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NQogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTUtMzk3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5wYWlkX2NvdXBvbnMKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0CiAgICBiIGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTcKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDctMTA4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X3N1c3BlbmRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMS0xMTIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTEzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuY291bnRfZHVlX2NvdXBvbnMoKSAtPiB1aW50NjQ6CmNvdW50X2R1ZV9jb3Vwb25zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjUwLTUxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGNvdW50X2R1ZV9jb3Vwb25zKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NTIKICAgIC8vIGN1cnJlbnRfdHMgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NTMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAiZHVlX2NvdXBvbnNfd2F0ZXJtYXJrIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmR1ZV9jb3Vwb25zX3dhdGVybWFyayBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1NAogICAgLy8gaWYgY3VycmVudF90cyA+PSBzZWxmLm1hdHVyaXR5X2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGJ6IGNvdW50X2R1ZV9jb3Vwb25zX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NTUKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi50b3RhbF9jb3Vwb25zCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCgpjb3VudF9kdWVfY291cG9uc19hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjcKICAgIC8vIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrID0gZHVlX2NvdXBvbnMKICAgIGJ5dGVjIDIzIC8vICJkdWVfY291cG9uc193YXRlcm1hcmsiCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjY4CiAgICAvLyByZXR1cm4gZHVlX2NvdXBvbnMKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpjb3VudF9kdWVfY291cG9uc19lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1NgogICAgLy8gZWxpZiBjdXJyZW50X3RzID4gc2VsZi5pc3N1YW5jZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiBjb3VudF9kdWVfY291cG9uc19hZnRlcl9pZl9lbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1NwogICAgLy8gY291cG9uX2lkeCA9IFVJbnQ2NChjZmcuRklSU1RfQ09VUE9OX0RBVEVfSURYKSArIHNlbGYuZHVlX2NvdXBvbnNfd2F0ZXJtYXJrCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gImR1ZV9jb3Vwb25zX3dhdGVybWFyayIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kdWVfY291cG9uc193YXRlcm1hcmsgZXhpc3RzCiAgICBwdXNoaW50IDMgLy8gMwogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1OAogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZVtjb3Vwb25faWR4XS5uYXRpdmUKICAgIGJ5dGVjIDExIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfZXZlbnRzIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCgpjb3VudF9kdWVfY291cG9uc193aGlsZV90b3BANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1OQogICAgLy8gd2hpbGUgY3VycmVudF90cyA+PSBjb3Vwb25fZHVlX2RhdGU6CiAgICBmcmFtZV9kaWcgMQogICAgPD0KICAgIGJ6IGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX3doaWxlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2MQogICAgLy8gcmVxdWlyZWRfYnVkZ2V0PVVJbnQ2NChjZmcuT1BfVVBfQ09VUE9OX0RVRV9DT1VOVElORyksCiAgICBpbnRjIDUgLy8gMjU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjIKICAgIC8vIGZlZV9zb3VyY2U9T3BVcEZlZVNvdXJjZS5Hcm91cENyZWRpdCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjAtNjMKICAgIC8vIGVuc3VyZV9idWRnZXQoCiAgICAvLyAgICAgcmVxdWlyZWRfYnVkZ2V0PVVJbnQ2NChjZmcuT1BfVVBfQ09VUE9OX0RVRV9DT1VOVElORyksCiAgICAvLyAgICAgZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0LAogICAgLy8gKQogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjQKICAgIC8vIGNvdXBvbl9pZHggKz0gMQogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjY1CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlW2NvdXBvbl9pZHhdLm5hdGl2ZQogICAgYnl0ZWMgMTEgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGIgY291bnRfZHVlX2NvdXBvbnNfd2hpbGVfdG9wQDQKCmNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX3doaWxlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NjYKICAgIC8vIGR1ZV9jb3Vwb25zID0gY291cG9uX2lkeCAtIGNmZy5GSVJTVF9DT1VQT05fREFURV9JRFgKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDMgLy8gMwogICAgLQogICAgZnJhbWVfYnVyeSAyCiAgICBiIGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdm9pZDoKYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6OTItOTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIGR1ZV9jb3Vwb25zOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPT0gZHVlX2NvdXBvbnMKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojk2LTk4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgLy8gKSwgZXJyLlBFTkRJTkdfQ09VUE9OX1BBWU1FTlQKICAgIGFzc2VydCAvLyBQZW5kaW5nIGR1ZSBjb3Vwb24gcGF5bWVudAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5hY2NydWVkX2ludGVyZXN0X2Ftb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0LCBkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6CmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEzMi0xMzUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBVSW50NjQsIGR1ZV9jb3Vwb25zOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTM2LTEzNwogICAgLy8gIyBUaGUgZm9sbG93aW5nIGFzc2VydCBzYWZlZ3VhcmRzIHRoZSBzdWJyb3V0aW5lIGZyb20gZm9yYmlkZGVuIGludm9jYXRpb25zCiAgICAvLyBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KGhvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTM5CiAgICAvLyBjb3Vwb25fYWNjcnVlZF9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQwCiAgICAvLyBjb3Vwb25fcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gbmV4dF9jb3Vwb25fcmF0ZV9icHMgPSBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZVsKICAgIGJ5dGVjIDE3IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3JhdGVzIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE0MS0xNDMKICAgIC8vIG5leHRfY291cG9uX3JhdGVfYnBzID0gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWVbCiAgICAvLyAgICAgZHVlX2NvdXBvbnMKICAgIC8vIF0ubmF0aXZlICAjIGR1ZV9jb3Vwb25zIGlzIGVxdWFsIHRvIHRoZSAwLWJhc2UgaWR4IG9mIG5leHQgY291cG9uCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDIgLy8gMgogICAgKgogICAgcHVzaGludCAyIC8vIDIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ1LTE0NgogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ1LTE0NwogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ5CiAgICAvLyBjc3QuQlBTICogY291cG9uX3BlcmlvZAogICAgcHVzaGludCAxMDAwMCAvLyAxMDAwMAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ1LTE1MAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gLy8gKAogICAgLy8gICAgIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICAvLyApICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQgY2hlY2tzCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ0LTE1MQogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIG5leHRfY291cG9uX3JhdGVfYnBzCiAgICAvLyAgICAgKiBjb3Vwb25fYWNjcnVlZF9wZXJpb2QKICAgIC8vICAgICAvLyAoCiAgICAvLyAgICAgICAgIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICAvLyAgICAgKSAgIyBkaXYtYnktemVybzogY291cG9uX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkIGNoZWNrcwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IGJ5dGVzOgpkYXlfY291bnRfZmFjdG9yOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwNy0xMDgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZGF5X2NvdW50X2ZhY3RvcihzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiB0eXAuRGF5Q291bnRGYWN0b3I6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTA5LTExMAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBpZiBub3QgZHVlX2NvdXBvbnM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBkYXlfY291bnRfZmFjdG9yX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTExCiAgICAvLyBhY2NydWluZ19zdGFydF90aW1lID0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE0CiAgICAvLyBjb3Vwb25fYWNjcnVlZF9wZXJpb2QgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCAtIGFjY3J1aW5nX3N0YXJ0X3RpbWUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGRpZyAxCiAgICAtCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjExNQogICAgLy8gY291cG9uX3BlcmlvZCA9IHNlbGYubmV4dF9jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpIC0gYWNjcnVpbmdfc3RhcnRfdGltZQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG5leHRfY291cG9uX2R1ZV9kYXRlCiAgICBzd2FwCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjExNgogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9PSBVSW50NjQoY3N0LkRDQ19BX0EpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMQogICAgYnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0NwogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfZGlnIDMKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9idXJ5IDEKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTIwCiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQoY291cG9uX2FjY3J1ZWRfcGVyaW9kKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjEKICAgIC8vIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGNvdXBvbl9wZXJpb2QpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjExOS0xMjIKICAgIC8vIHJldHVybiB0eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KGNvdXBvbl9hY2NydWVkX3BlcmlvZCksCiAgICAvLyAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoY291cG9uX3BlcmlvZCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkYXlfY291bnRfZmFjdG9yX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyBpZiBkdWVfY291cG9ucyA+PSBVSW50NjQoMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzgKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAyCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAyCiAgICBiIGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5jb3Vwb25fZHVlX2RhdGUoY291cG9uOiB1aW50NjQpIC0+IHVpbnQ2NDoKY291cG9uX2R1ZV9kYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjcwLTcxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGNvdXBvbl9kdWVfZGF0ZShzZWxmLCBjb3Vwb246IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NzIKICAgIC8vIHJldHVybiBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlW2NmZy5GSVJTVF9DT1VQT05fREFURV9JRFggKyBjb3Vwb24gLSAxXS5uYXRpdmUKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBieXRlYyAxMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5uZXh0X2NvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6Cm5leHRfY291cG9uX2R1ZV9kYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjgxLTgyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG5leHRfY291cG9uX2R1ZV9kYXRlKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo4NAogICAgLy8gaWYgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBkdXAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYnogbmV4dF9jb3Vwb25fZHVlX2RhdGVfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6ODUKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zICsgMSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGNhbGxzdWIgY291cG9uX2R1ZV9kYXRlCiAgICBmcmFtZV9idXJ5IDAKCm5leHRfY291cG9uX2R1ZV9kYXRlX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo4NgogICAgLy8gcmV0dXJuIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMzLTMzNgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzM3CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlLm5hdGl2ZQogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5wYXlfY291cG9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfaW5mbzogYnl0ZXMpIC0+IGJ5dGVzOgpwYXlfY291cG9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwMi0yMDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHBheV9jb3Vwb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfaW5mbzogYXJjNC5EeW5hbWljQnl0ZXMKICAgIC8vICkgLT4gdHlwLlBheW1lbnRSZXN1bHQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMyAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjI1LTIyNgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHJlc3RyaWN0IGNhbGxlciBhdXRob3JpemF0aW9uCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjI4CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwbiAyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjMwCiAgICAvLyB1bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjMxCiAgICAvLyBhc3NlcnQgdW5pdHMgPiAwLCBlcnIuTk9fVU5JVFMKICAgIGFzc2VydCAvLyBObyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIzMgogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzMKICAgIC8vIGFjY291bnRfcGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zLm5hdGl2ZQogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjM0CiAgICAvLyBhc3NlcnQgZHVlX2NvdXBvbnMgPiBhY2NvdW50X3BhaWRfY291cG9ucywgZXJyLk5PX0RVRV9DT1VQT04KICAgIGRpZyAxCiAgICA+CiAgICBhc3NlcnQgLy8gTm8gZHVlIGNvdXBvbiB0byBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMzUtMjM4CiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyB2ZXJpZnkgaWYgb3RoZXIgYWNjb3VudHMgYXJlIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSBwYXltZW50IG9mIHByZXZpb3VzIGNvdXBvbnMKICAgIC8vIGFzc2VydCBzZWxmLmFsbF9kdWVfY291cG9uc19wYWlkKAogICAgLy8gICAgIGFjY291bnRfcGFpZF9jb3Vwb25zCiAgICAvLyApLCBlcnIuUEVORElOR19DT1VQT05fUEFZTUVOVAogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgYXNzZXJ0IC8vIFBlbmRpbmcgZHVlIGNvdXBvbiBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQxCiAgICAvLyBpZiBzZWxmLmlzX3BheW1lbnRfZXhlY3V0YWJsZShob2xkaW5nX2FkZHJlc3MpOgogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGlzX3BheW1lbnRfZXhlY3V0YWJsZQogICAgYnogcGF5X2NvdXBvbl9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0MwogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gYWNjb3VudF9wYWlkX2NvdXBvbnMgKyAxLAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQyLTI0NQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBzZWxmLmNvdXBvbl9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcyksCiAgICAvLyAgICAgYWNjb3VudF9wYWlkX2NvdXBvbnMgKyAxLAogICAgLy8gKQogICAgY2FsbHN1YiBjb3Vwb25faW50ZXJlc3RfYW1vdW50CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDYtMjQ3CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHBheW1lbnQgYWdlbnQKICAgIC8vIHNlbGYuYXNzZXJ0X2Vub3VnaF9mdW5kcyhwYXltZW50X2Ftb3VudCkKICAgIGNhbGxzdWIgYXNzZXJ0X2Vub3VnaF9mdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0OC0yNDkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGNhbGxzdWIgcGF5CgpwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNTQtMjU2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlICsgMQogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1NAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNTQtMjU2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlICsgMQogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNTcKICAgIC8vIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNCAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgYnl0ZWMgMjQgLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNTkKICAgIC8vIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjYwCiAgICAvLyB0aW1lc3RhbXA9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1OC0yNjIKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudFJlc3VsdCgKICAgIC8vICAgICBhbW91bnQ9YXJjNC5VSW50NjQocGF5bWVudF9hbW91bnQpLAogICAgLy8gICAgIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8uY29weSgpLCAgIyBUT0RPOiBBZGQgaW5mbyBvbiBmYWlsZWQgcGF5bWVudAogICAgLy8gKQogICAgY29uY2F0CiAgICBieXRlYyAzMSAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpwYXlfY291cG9uX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1MS0yNTIKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6CmFsbF9kdWVfY291cG9uc19wYWlkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojg4LTg5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFsbF9kdWVfY291cG9uc19wYWlkKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo5MAogICAgLy8gcmV0dXJuIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgPj0gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIGR1ZV9jb3Vwb25zCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjQgLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBhaWRfY291cG9uX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICA+PQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuaXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKaXNfcGF5bWVudF9leGVjdXRhYmxlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA4LTMwOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBpc19wYXltZW50X2V4ZWN1dGFibGUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMgogICAgLy8gQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMS0zMTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMS0zMTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKQogICAgLy8gKQogICAgLy8gYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICBieiBpc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTQKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDggLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogaXNfcGF5bWVudF9leGVjdXRhYmxlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCmlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTAtMzE1CiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgICAgIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkKICAgIC8vICAgICApCiAgICAvLyAgICAgYW5kIG5vdCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlCiAgICAvLyApCiAgICBzd2FwCiAgICByZXRzdWIKCmlzX3BheW1lbnRfZXhlY3V0YWJsZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBpc19wYXltZW50X2V4ZWN1dGFibGVfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzktMzQwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQyCiAgICAvLyBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0MS0zNDMKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmNvdXBvbl9pbnRlcmVzdF9hbW91bnQocHJpbmNpcGFsX2Ftb3VudDogdWludDY0LCBjb3Vwb246IHVpbnQ2NCkgLT4gdWludDY0Ogpjb3Vwb25faW50ZXJlc3RfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwMC0xMDMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291cG9uX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBwcmluY2lwYWxfYW1vdW50OiBVSW50NjQsIGNvdXBvbjogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gY291cG9uX3JhdGVfYnBzID0gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWVbY291cG9uIC0gMV0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBieXRlYyAxNyAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9yYXRlcyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBwdXNoaW50IDIgLy8gMgogICAgKgogICAgcHVzaGludCAyIC8vIDIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gcmV0dXJuIHByaW5jaXBhbF9hbW91bnQgKiBjb3Vwb25fcmF0ZV9icHMgLy8gY3N0LkJQUwogICAgZnJhbWVfZGlnIC0yCiAgICAqCiAgICBwdXNoaW50IDEwMDAwIC8vIDEwMDAwCiAgICAvCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfZW5vdWdoX2Z1bmRzKHBheW1lbnRfYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmFzc2VydF9lbm91Z2hfZnVuZHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTctMzE4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9lbm91Z2hfZnVuZHMoc2VsZiwgcGF5bWVudF9hbW91bnQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzIwCiAgICAvLyBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjAtMzIxCiAgICAvLyBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTktMzIyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5wYXkocmVjZWl2ZXI6IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKcGF5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI0LTMyNQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBwYXkoc2VsZiwgcmVjZWl2ZXI6IGFyYzQuQWRkcmVzcywgYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyNi0zMzEKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMwCiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI3CiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjYtMzMxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLnBheV9wcmluY2lwYWwoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9pbmZvOiBieXRlcykgLT4gYnl0ZXM6CnBheV9wcmluY2lwYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjY0LTI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X3ByaW5jaXBhbCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzNC00MzUKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZXN0cmljdCBjYWxsZXIgYXV0aG9yaXphdGlvbgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzNgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzcKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzOQogICAgLy8gdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDAKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5OT19VTklUUwogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDEKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGUsIGVyci5OT1RfTUFUVVJFCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgbWF0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MjkxCiAgICAvLyBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyODktMjkyCiAgICAvLyAjIFByaW5jaXBhbCBwYXltZW50IGlzIGZvcmJpZGRlbiBpbiBjYXNlIG9mIHBlbmRpbmcgY291cG9uIHBheW1lbnRzCiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZCgKICAgIC8vICAgICBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyOTUKICAgIC8vIGlmIHNlbGYuaXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgaXNfcGF5bWVudF9leGVjdXRhYmxlCiAgICBieiBwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mjk2CiAgICAvLyBwYXltZW50X2Ftb3VudCA9IHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6Mjk3LTI5OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBwYXltZW50IGFnZW50CiAgICAvLyBzZWxmLmFzc2VydF9lbm91Z2hfZnVuZHMocGF5bWVudF9hbW91bnQpCiAgICBjYWxsc3ViIGFzc2VydF9lbm91Z2hfZnVuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToyOTktMzAwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIHRoZSBzYW1lIGFzc2V0IGZvciBkZW5vbWluYXRpb24gYW5kIHNldHRsZW1lbnQsIG5vIGNvbnZlcnNpb24gbmVlZGVkCiAgICAvLyBzZWxmLnBheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHBheW1lbnRfYW1vdW50KQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBjYWxsc3ViIHBheQoKcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDgKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLQogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQ5CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KCkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDkgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiAzMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUwCiAgICAvLyBzZWxmLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpCiAgICBjYWxsc3ViIGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMwNwogICAgLy8gYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMDgKICAgIC8vIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzA2LTMxMAogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICAvLyAgICAgdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mby5jb3B5KCksICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBjb25jYXQKICAgIGJ5dGVjIDMxIC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgpwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMwMi0zMDMKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkgLT4gdm9pZDoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU1LTM1NgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU3CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IDA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBibnogZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU4CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50YyA3IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMTItMzE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlOgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzMzLTMzNAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzQKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzMtMzM0CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjMzMi0zMzUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksIGVyci5OT19QUklNQVJZX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzgKICAgIC8vIDAgPCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI+CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANwogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGI+PQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozMzctMzM5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIDAgPCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1VOSVRTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhbW91bnQgb2YgdW5pdHMgZm9yIHRoZSBhY2NvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzQzCiAgICAvLyBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM0MS0zNDQKICAgIC8vICMgVmFsdWUgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uIGFuZCBhdCBtYXR1cml0eQogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlID0gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzQ1LTM0NgogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdCBkdXJpbmcgcHJpbWFyeSBkaXN0cmlidXRpb24gYW5kIGF0IG1hdHVyaXR5CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNDcKICAgIC8vIG51bWVyYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzQ4CiAgICAvLyBkZW5vbWluYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzUwLTM1MQogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzUyCiAgICAvLyBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KGhvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzUzCiAgICAvLyBpZiBzZWxmLmlzX2FjY3J1aW5nX2ludGVyZXN0KGR1ZV9jb3Vwb25zKToKICAgIGNhbGxzdWIgaXNfYWNjcnVpbmdfaW50ZXJlc3QKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1NAogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1NS0zNTcKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlLCBkdWVfY291cG9ucwogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgNgogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNTgKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1OQogICAgLy8gZGVub21pbmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDMKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjEKICAgIC8vIHVuaXRzX3ZhbHVlPWFyYzQuVUludDY0KGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSksCiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2MgogICAgLy8gYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIGZyYW1lX2RpZyAyCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzY0CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIGZyYW1lX2RpZyA1CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzY1CiAgICAvLyBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM2My0zNjYKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICksCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjAtMzY3CiAgICAvLyByZXR1cm4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlKAogICAgLy8gICAgIHVuaXRzX3ZhbHVlPWFyYzQuVUludDY0KGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSksCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA4CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmZpeGVkX2NvdXBvbl9ib25kLmNvbnRyYWN0LkZpeGVkQ291cG9uQm9uZC5pc19hY2NydWluZ19pbnRlcmVzdChkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6CmlzX2FjY3J1aW5nX2ludGVyZXN0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyNC0xMjUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaXNfYWNjcnVpbmdfaW50ZXJlc3Qoc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyNwogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI3LTEyOQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgYnogaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MTI4CiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjctMTI5CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMAogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gYW5kIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zCiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjkKICAgIC8vIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyNy0xMjkKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyBhbmQgZHVlX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnMKICAgIGJ6IGlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMjYtMTMwCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIGFuZCBkdWVfY291cG9ucyA8IHNlbGYudG90YWxfY291cG9ucwogICAgLy8gKQogICAgcmV0c3ViCgppc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEyNi0xMzAKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyAgICAgYW5kIGR1ZV9jb3Vwb25zIDwgc2VsZi50b3RhbF9jb3Vwb25zCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuZml4ZWRfY291cG9uX2JvbmQuY29udHJhY3QuRml4ZWRDb3Vwb25Cb25kLmdldF9jb3Vwb25fcmF0ZXMoKSAtPiBieXRlczoKZ2V0X2NvdXBvbl9yYXRlczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNjktMzcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfY291cG9uX3JhdGVzKHNlbGYpIC0+IHR5cC5Db3Vwb25SYXRlczoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM3NwogICAgLy8gY291cG9uX3JhdGVzID0gdHlwLkNvdXBvblJhdGVzKCkKICAgIGJ5dGVjIDMyIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNzgKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X2NvdXBvbl9yYXRlc19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozNzkKICAgIC8vIGNvdXBvbl9yYXRlcyA9IHNlbGYuY291cG9uX3JhdGVzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMTcgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9yYXRlcyBleGlzdHMKCmdldF9jb3Vwb25fcmF0ZXNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM4MAogICAgLy8gcmV0dXJuIGNvdXBvbl9yYXRlcwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuZ2V0X3BheW1lbnRfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfcGF5bWVudF9hbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6MzgyLTM4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3BheW1lbnRfYW1vdW50KHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiB0eXAuUGF5bWVudEFtb3VudHM6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOTcKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM5Ny0zOTgKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gVUludDY0KCkKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzMgLy8gMTAwCiAgICA9PQogICAgc3dhcAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDAwCiAgICAvLyBwYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDAxCiAgICAvLyBpZiBwYWlkX2NvdXBvbnMgPCBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgPAogICAgYnogZ2V0X3BheW1lbnRfYW1vdW50X2Vsc2VfYm9keUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDA0CiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKSwKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDA1CiAgICAvLyBwYWlkX2NvdXBvbnMgKyAxLAogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDAyLTQwNgogICAgLy8gIyBDb3Vwb24gUGF5bWVudAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gc2VsZi5jb3Vwb25faW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpLAogICAgLy8gICAgIHBhaWRfY291cG9ucyArIDEsCiAgICAvLyApCiAgICBjYWxsc3ViIGNvdXBvbl9pbnRlcmVzdF9hbW91bnQKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VANDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDQKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDUKCmdldF9wYXltZW50X2Ftb3VudF9hZnRlcl9pZl9lbHNlQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MTEKICAgIC8vIGludGVyZXN0PWFyYzQuVUludDY0KGludGVyZXN0X2Ftb3VudCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDEyCiAgICAvLyBwcmluY2lwYWw9YXJjNC5VSW50NjQocHJpbmNpcGFsX2Ftb3VudCksCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDEwLTQxMwogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50QW1vdW50cygKICAgIC8vICAgICBpbnRlcmVzdD1hcmM0LlVJbnQ2NChpbnRlcmVzdF9hbW91bnQpLAogICAgLy8gICAgIHByaW5jaXBhbD1hcmM0LlVJbnQ2NChwcmluY2lwYWxfYW1vdW50KSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9wYXltZW50X2Ftb3VudF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MDgtNDA5CiAgICAvLyAjIFByaW5jaXBhbCBQYXltZW50CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5maXhlZF9jb3Vwb25fYm9uZC5jb250cmFjdC5GaXhlZENvdXBvbkJvbmQuZ2V0X2NvdXBvbnNfc3RhdHVzKCkgLT4gYnl0ZXM6CmdldF9jb3Vwb25zX3N0YXR1czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MTUtNDE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfY291cG9uc19zdGF0dXMoc2VsZikgLT4gdHlwLkNvdXBvbnNJbmZvOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDI0CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDI1CiAgICAvLyBuZXh0X2NvdXBvbl9kdWVfZGF0ZSA9IHNlbGYubmV4dF9jb3Vwb25fZHVlX2RhdGUoZHVlX2NvdXBvbnMpCiAgICBjYWxsc3ViIG5leHRfY291cG9uX2R1ZV9kYXRlCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDI2CiAgICAvLyBhbGxfZHVlX2NvdXBvbnNfcGFpZCA9IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoZHVlX2NvdXBvbnMpCiAgICBkdXAKICAgIGNhbGxzdWIgYWxsX2R1ZV9jb3Vwb25zX3BhaWQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MjcKICAgIC8vIG51bWVyYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQyOAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MjkKICAgIC8vIGlmIHNlbGYuaXNfYWNjcnVpbmdfaW50ZXJlc3QoZHVlX2NvdXBvbnMpOgogICAgY2FsbHN1YiBpc19hY2NydWluZ19pbnRlcmVzdAogICAgYnogZ2V0X2NvdXBvbnNfc3RhdHVzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAwCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzEKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzMgogICAgLy8gZGVub21pbmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDQKCmdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDM0CiAgICAvLyB0b3RhbF9jb3Vwb25zPWFyYzQuVUludDY0KHNlbGYudG90YWxfY291cG9ucyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzNQogICAgLy8gZHVlX2NvdXBvbnM9YXJjNC5VSW50NjQoZHVlX2NvdXBvbnMpLAogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0MzYKICAgIC8vIG5leHRfY291cG9uX2R1ZV9kYXRlPWFyYzQuVUludDY0KG5leHRfY291cG9uX2R1ZV9kYXRlKSwKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDM4CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIGZyYW1lX2RpZyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDM5CiAgICAvLyBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICBmcmFtZV9kaWcgNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzNy00NDAKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICksCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9maXhlZF9jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0NDEKICAgIC8vIGFsbF9kdWVfY291cG9uc19wYWlkPWFyYzQuQm9vbChhbGxfZHVlX2NvdXBvbnNfcGFpZCksCiAgICBieXRlYyA4IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZml4ZWRfY291cG9uX2JvbmQvY29udHJhY3QucHk6NDMzLTQ0MgogICAgLy8gcmV0dXJuIHR5cC5Db3Vwb25zSW5mbygKICAgIC8vICAgICB0b3RhbF9jb3Vwb25zPWFyYzQuVUludDY0KHNlbGYudG90YWxfY291cG9ucyksCiAgICAvLyAgICAgZHVlX2NvdXBvbnM9YXJjNC5VSW50NjQoZHVlX2NvdXBvbnMpLAogICAgLy8gICAgIG5leHRfY291cG9uX2R1ZV9kYXRlPWFyYzQuVUludDY0KG5leHRfY291cG9uX2R1ZV9kYXRlKSwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIGFsbF9kdWVfY291cG9uc19wYWlkPWFyYzQuQm9vbChhbGxfZHVlX2NvdXBvbnNfcGFpZCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jcmVhdGUoYXJyYW5nZXI6IGJ5dGVzLCBtZXRhZGF0YTogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1Mi00NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGFzc2V0X2NyZWF0ZShzZWxmLCBhcnJhbmdlcjogYXJjNC5BZGRyZXNzLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyLm5hdGl2ZQogICAgYnl0ZWMgMTggLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYyCiAgICAvLyBzZWxmLm1ldGFkYXRhID0gbWV0YWRhdGEubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfY29uZmlnKGRlbm9taW5hdGlvbl9hc3NldF9pZDogYnl0ZXMsIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGJ5dGVzLCBwcmluY2lwYWw6IGJ5dGVzLCBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYnl0ZXMsIGRheV9jb3VudF9jb252ZW50aW9uOiBieXRlcywgaW50ZXJlc3RfcmF0ZTogYnl0ZXMsIGNvdXBvbl9yYXRlczogYnl0ZXMsIHRpbWVfZXZlbnRzOiBieXRlcywgdGltZV9wZXJpb2RzOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDc0LTQ4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzZXRfY29uZmlnKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwcmluY2lwYWw6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG1pbmltdW1fZGVub21pbmF0aW9uOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbjogYXJjNC5VSW50OCwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlOiBhcmM0LlVJbnQxNiwKICAgIC8vICAgICBjb3Vwb25fcmF0ZXM6IHR5cC5Db3Vwb25SYXRlcywKICAgIC8vICAgICB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMsCiAgICAvLyAgICAgdGltZV9wZXJpb2RzOiB0eXAuVGltZVBlcmlvZHMsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA5IDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTE1CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MTYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VNUFRZLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUxOC01MTkKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5hc3NlcnRfZGVub21pbmF0aW9uX2Fzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTkKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc3CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGZyYW1lX2RpZyAzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzUtMTc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIC8vICksIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODIKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjItNTIzCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTgKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODYtMTg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTkzCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA2IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0yMDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NgogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk3CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk0LTE5NQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTQtMjAwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI4CiAgICAvLyBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIGZyYW1lX2RpZyAtNwogICAgYnRvaQogICAgZnJhbWVfZGlnIC02CiAgICBidG9pCiAgICBkdXAyCiAgICAlCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjYtNTI5CiAgICAvLyAjIFNldCBQcmluY2lwYWwgYW5kIE1pbmltdW0gRGVub21pbmF0aW9uCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgLy8gKSwgZXJyLklOVkFMSURfTUlOSU1VTV9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBNaW5pbXVtIGRlbm9taW5hdGlvbiBpcyBub3QgYSBkaXZpc29yIG9mIHByaW5jaXBhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMwCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzEKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBwcmluY2lwYWwubmF0aXZlIC8vIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgLwogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMy01MzQKICAgIC8vICMgU2V0IERheS1Db3VudCBDb252ZW50aW9uCiAgICAvLyBzZWxmLmFzc2VydF9kYXlfY291bnRfY29udmVudGlvbihkYXlfY291bnRfY29udmVudGlvbi5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTUKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDYKICAgIC8vIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICBpbnRjXzMgLy8gMTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDQtMjA4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYm56IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDcKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgaW50YyA1IC8vIDI1NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA0LTIwOAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3Cgphc3NldF9jb25maWdfYm9vbF90cnVlQDE2OgogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA0LTIwOAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIxMgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IGRheV9jb3VudF9jb252ZW50aW9uCiAgICBieXRlYyAxMyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBmcmFtZV9kaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzNy01MzgKICAgIC8vICMgU2V0IEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYuYXNzZXJ0X2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZS5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gYXNzZXJ0IGludGVyZXN0X3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludGVyZXN0IHJhdGUgaXMgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgMjYgLy8gImludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2ZpeGVkX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBhc3NlcnQgY291cG9uX3JhdGVzLmxlbmd0aCwgZXJyLklOVkFMSURfQ09VUE9OX1JBVEVTCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBhc3NlcnQgLy8gQ291cG9uIHJhdGVzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI4CiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBjb3Vwb25fcmF0ZXMubGVuZ3RoCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gaWYgc2VsZi50b3RhbF9jb3Vwb25zOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzAKICAgIC8vIHNlbGYuY291cG9uX3JhdGVzLnZhbHVlID0gY291cG9uX3JhdGVzLmNvcHkoKQogICAgYnl0ZWMgMTcgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDE3IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgZnJhbWVfZGlnIC0zCiAgICBib3hfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNC0yMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUwogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0NwogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gc2VsZi50aW1lX2V2ZW50cy52YWx1ZSA9IHRpbWVfZXZlbnRzLmNvcHkoKQogICAgYnl0ZWMgMTEgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAxMSAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MS0yNjMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEtMjYzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY3CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuSVNTVUFOQ0VfREFURV9JRFhdLm5hdGl2ZQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjktMjcwCiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzEKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgNyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gYXNzZXJ0IG5vdCB0aW1lX3BlcmlvZHMubGVuZ3RoLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGludGNfMyAvLyAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTUtMTE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM4LTIzOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlbGYsIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cykgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MQogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MgogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQxLTI0MgogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQwLTI0MwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyAgICAgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRQogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDAKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ0CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDYKICAgIC8vIHJlcXVpcmVkX2J1ZGdldD1VSW50NjQoY2ZnLk9QX1VQX1RJTUVfRVZFTlRfU09SVElORyksCiAgICBwdXNoaW50IDY1IC8vIDY1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDcKICAgIC8vIGZlZV9zb3VyY2U9T3BVcEZlZVNvdXJjZS5BcHBBY2NvdW50LCAgIyBBcHAgZnVuZHMgYXJlIG5vdCBhdCByaXNrIHNpbmNlIGNhbGxlciBpcyB0cnVzdGVkCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ1LTI0OAogICAgLy8gZW5zdXJlX2J1ZGdldCgKICAgIC8vICAgICByZXF1aXJlZF9idWRnZXQ9VUludDY0KGNmZy5PUF9VUF9USU1FX0VWRU5UX1NPUlRJTkcpLAogICAgLy8gICAgIGZlZV9zb3VyY2U9T3BVcEZlZVNvdXJjZS5BcHBBY2NvdW50LCAgIyBBcHAgZnVuZHMgYXJlIG5vdCBhdCByaXNrIHNpbmNlIGNhbGxlciBpcyB0cnVzdGVkCiAgICAvLyApCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdGltZV9pID0gdGltZV9ldmVudHNbX3RdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTAKICAgIC8vIHRpbWVfZiA9IHRpbWVfZXZlbnRzW190ICsgMV0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUxCiAgICAvLyBhc3NlcnQgdGltZV9mID4gdGltZV9pLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTIKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gIT0gVUludDY0KGNzdC5EQ0NfQ09OVCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaW50YyA1IC8vIDI1NQogICAgIT0KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTMtMjU0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTMtMjU2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgLy8gICAgIGNzdC5EQVlfMl9TRUMKICAgIC8vICkgPT0gMCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0QKICAgIGludGMgNiAvLyA4NjQwMAogICAgJQogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBpbiBBY3R1YWwvQWN0dWFsIGRheSBjb3VudCBjb252ZW50aW9uIG11c3QgYmUgbXVsdGlwbGVzIG9mIGEgZGF5IChpbiBzZWNvbmRzKQogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANjoKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1Ni01NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMoCiAgICAvLyAgICAgc2VsZiwgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMKICAgIC8vICkgLT4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTc3CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNyAvLyAyMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NzgKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NzkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgxCiAgICAvLyBhc3NlcnQgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPj0gMSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4MgogICAgLy8gaWYgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPiAxOgogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4MwogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0xCiAgICBmcmFtZV9idXJ5IDEKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NQogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTg2LTU4OAogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTg1LTU4OAogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBkaWcgMQogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NC01ODkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyAgICAgPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gICAgIF0ubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfT1BFTklOR19EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IG9wZW5pbmcgZGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkwCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MC01OTIKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkzCiAgICAvLyBpZiBzZWxmLm1hdHVyaXR5X2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NQogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk3CiAgICAvLyBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk2LTU5OAogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk1LTU5OAogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBkaWcgMQogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NC01OTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5tYXR1cml0eV9kYXRlCiAgICAvLyAgICAgPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gICAgIF0ubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfQ0xPU1VSRV9EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IGNsb3N1cmUgZGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAwCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMC02MDIKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDUKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDQtNjA2CiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA4CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA3LTYwOQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMy02MTAKICAgIC8vIHJldHVybiB0eXAuU2Vjb25kYXJ5TWFya2V0U2NoZWR1bGUoCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NpZ25fcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcywgY29uZmlnOiBieXRlcykgLT4gYnl0ZXM6CmFzc2lnbl9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEyLTYxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzaWduX3JvbGUoCiAgICAvLyAgICAgc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgsIGNvbmZpZzogYXJjNC5EeW5hbWljQnl0ZXMKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzMwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzYKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzgKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IGFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANwoKYXNzaWduX3JvbGVfYm9vbF90cnVlQDY6CiAgICBpbnRjXzEgLy8gMQoKYXNzaWduX3JvbGVfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDQKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwIC8vIDIwLCA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0My02NzIKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcy5uYXRpdmUKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgKAogICAgLy8gICAgICAgICAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgICAgICBjb25maWcubmF0aXZlCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgKAogICAgLy8gICAgICAgICAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgICAgICBjb25maWcubmF0aXZlCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5IGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTAgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8zQDEyIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzRAMTMgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjcyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV81QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY2CiAgICAvLyByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICBieXRlYyAzMyAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2NS02NjcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY5CiAgICAvLyBjb25maWcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjgtNjcwCiAgICAvLyBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjczCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICBzd2FwCiAgICByZXRzdWIKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzRAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2MwogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1OQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNjMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2MAogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjkgLy8gMHg1MjM1MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU2CiAgICAvLyBjb25maWcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTUtNjU3CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OAogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgYnl0ZWMgMzAgLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDctNjQ5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUwLTY1MgogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8wQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDUKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnJldm9rZV9yb2xlKHJvbGVfYWRkcmVzczogYnl0ZXMsIHJvbGU6IGJ5dGVzKSAtPiBieXRlczoKcmV2b2tlX3JvbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzUtNjc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiByZXZva2Vfcm9sZShzZWxmLCByb2xlX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcm9sZTogYXJjNC5VSW50OCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5MwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTYKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MCAvLyA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTcKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUtNzAxCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5OAogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTkKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MCAvLyA3MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiByZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDYKCnJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCnJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NS03MDEKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMy03MDQKICAgIC8vICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MCAvLyA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMi03MjAKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTEgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIwCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMzIC8vIDB4NTIzODMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzExCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOCAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTIKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI5IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMCAvLyAweDUyMzQzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDYKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Eub3Blbl9hY2NvdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpvcGVuX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjMtNzI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcGVuX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDcgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ1CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDcKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEKICAgIC8vIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MgogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTMKICAgIC8vIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgOSAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTQKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIGJ5dGVjIDggLy8gMHgwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOS0xMjAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICBieXRlYyAzMCAvLyAweDUyMzQzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMy0xMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9tYW5hZ2VyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQtMTI1CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9tYW5hZ2VyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjUtMTI2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMi0xMjcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmNsb3NlX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmNsb3NlX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTgtNzYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbG9zZV9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVHVwbGVbYXJjNC5VSW50NjQsIGFyYzQuVUludDY0XToKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzc2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzgwCiAgICAvLyBjbG9zZWRfdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlQgKyBob2xkaW5nX2FkZHJlc3MuYnl0ZXMpCiAgICBzd2FwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MgogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBjbG9zZWRfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICAtCiAgICBieXRlY18yIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODMKICAgIC8vIHNlbGYuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkKICAgIGNhbGxzdWIgZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODUKICAgIC8vIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICBpdG9iCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODQtNzg2CiAgICAvLyByZXR1cm4gYXJjNC5UdXBsZSgKICAgIC8vICAgICAoYXJjNC5VSW50NjQoY2xvc2VkX3VuaXRzKSwgYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApKQogICAgLy8gKQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5wcmltYXJ5X2Rpc3RyaWJ1dGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4OC03OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHByaW1hcnlfZGlzdHJpYnV0aW9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NC0yODcKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1LTI4NgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NS0yODcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg3CiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODYtMjg3CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgZnJhbWVfZGlnIDIKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NS0yODcKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4My0yODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TRUQKICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBpcyBjbG9zZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIGJ5dGVjIDI5IC8vIDB4NTIzNTMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMQogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzMKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMy0xMzYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNC0xMzUKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNC0xMzYKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM2CiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2RlYWxlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM1LTEzNgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0LTEzNgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMi0xMzcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIC8vICAgICBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODE2CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgxNwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MTgKICAgIC8vIGFzc2VydCB1bml0cy5uYXRpdmUgPiAwLCBlcnIuWkVST19VTklUUwogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIGFzc2VydCAvLyBDYW4gbm90IGRpc3RyaWJ1dGUgemVybyB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIwCiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMubmF0aXZlIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgxOS04MjEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICAvLyApLCBlcnIuT1ZFUl9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgcmVtYWluaW5nIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjMKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKz0gdW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI0LTgyNgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI0LTgyNgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICBpdG9iCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIHN3YXAKICAgIHJlcGxhY2UyIDQwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjgKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChzZWxmLnRvdGFsX3VuaXRzIC0gc2VsZi5jaXJjdWxhdGluZ191bml0cykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICAtCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMjoKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTMKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9hc3NldF9zdXNwZW5zaW9uKHN1c3BlbmRlZDogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfYXNzZXRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMC04MzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hc3NldF9zdXNwZW5zaW9uKHNlbGYsIHN1c3BlbmRlZDogYXJjNC5Cb29sKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ0CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0NQogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoc3VzcGVuZGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDYKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDktMTUwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgYnl0ZWMgMjcgLy8gMHg1MjM3MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTMtMTU2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NAogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmF1dGhvcml0eSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0LTE1NQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NC0xNTYKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmF1dGhvcml0eSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU1LTE1NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NC0xNTYKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTItMTU3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgLy8gICAgIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eV9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYWNjb3VudF9zdXNwZW5zaW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHN1c3BlbmRlZDogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfYWNjb3VudF9zdXNwZW5zaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4LTg1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2FjY291bnRfc3VzcGVuc2lvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgc3VzcGVuZGVkOiBhcmM0LkJvb2wKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2NgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODY4CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQgPSBzdXNwZW5kZWQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgaW50YyA0IC8vIDQ0OAogICAgc3dhcAogICAgc2V0Yml0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjkKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9kZWZhdWx0X3N0YXR1cyhkZWZhdWx0ZWQ6IGJ5dGVzKSAtPiB2b2lkOgpzZXRfZGVmYXVsdF9zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzEtODcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfZGVmYXVsdF9zdGF0dXMoc2VsZiwgZGVmYXVsdGVkOiBhcmM0LkJvb2wpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDMKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNjMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0MQogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDMKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0My0xNDYKICAgIC8vIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ1CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NC0xNDYKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cnVzdGVlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDUtMTQ2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NC0xNDYKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQyLTE0NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyAgICAgYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4MwogICAgLy8gc2VsZi5kZWZhdWx0ZWQgPSBVSW50NjQoZGVmYXVsdGVkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYnl0ZWMgMjIgLy8gImRlZmF1bHRlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2Fzc2V0X2luZm8oKSAtPiBieXRlczoKZ2V0X2Fzc2V0X2luZm86CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODUtODg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfaW5mbyhzZWxmKSAtPiB0eXAuQXNzZXRJbmZvOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTYKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTcKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTgKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk5CiAgICAvLyB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMAogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAxCiAgICAvLyBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjYgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDIKICAgIC8vIHRvdGFsX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX3VuaXRzKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDMKICAgIC8vIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNC05MDYKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNy05MDkKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMAogICAgLy8gaXNzdWFuY2VfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLmlzc3VhbmNlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMQogICAgLy8gbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMgogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICBieXRlYyA4IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEzCiAgICAvLyBkZWZhdWx0ZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5kZWZhdWx0ZWQpKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgIGJ5dGVjIDggLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTUtOTE0CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKSwKICAgIC8vICAgICBvdXRzdGFuZGluZ19wcmluY2lwYWw9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpLAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uPWFyYzQuVUludDgoc2VsZi5kYXlfY291bnRfY29udmVudGlvbiksCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZT1hcmM0LlVJbnQxNihzZWxmLmludGVyZXN0X3JhdGUpLAogICAgLy8gICAgIHRvdGFsX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX3VuaXRzKSwKICAgIC8vICAgICBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICAvLyAgICAgcHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyAgICAgcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyAgICAgaXNzdWFuY2VfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLmlzc3VhbmNlX2RhdGUpLAogICAgLy8gICAgIG1hdHVyaXR5X2RhdGU9YXJjNC5VSW50NjQoc2VsZi5tYXR1cml0eV9kYXRlKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5zdXNwZW5kZWQpKSwKICAgIC8vICAgICBkZWZhdWx0ZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5kZWZhdWx0ZWQpKSwKICAgIC8vICkKICAgIHVuY292ZXIgMTMKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBwdXNoaW50IDY2NSAvLyA2NjUKICAgIHN3YXAKICAgIHNldGJpdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNi05MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMy05MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQxCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIGJ5dGVjIDMyIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0MgogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDMKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDExIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ0CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0Ni05NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTUKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NgogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU0LTk1NwogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTktOTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2NwogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X3VwZGF0ZSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NC00NjUKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgYXNzZXRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2OS00NzIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANwogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDM0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANjoKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDc6CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { @@ -501,7 +505,7 @@ ], "returns": { "type": "(uint64,uint64,byte[])", - "desc": "Paid coupon amount, Payment timestamp, Payment context" + "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context" }, "desc": "Pay due coupon to an account" }, @@ -521,7 +525,7 @@ ], "returns": { "type": "(uint64,uint64,byte[])", - "desc": "Paid principal amount, Payment timestamp, Payment context" + "desc": "Paid principal amount in denomination asset, Payment timestamp, Payment context" }, "desc": "Pay the outstanding principal to an account" }, @@ -819,8 +823,8 @@ "name": "get_asset_info", "args": [], "returns": { - "type": "(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", - "desc": "Denomination Asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary Distribution Opening Date, Primary Distribution Closure Date, Issuance Date, Maturity Date, Suspended, Defaulted" + "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", + "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Defaulted" }, "desc": "Get D-ASA info" }, @@ -835,7 +839,7 @@ ], "returns": { "type": "(address,uint64,uint64,uint64,bool)", - "desc": "Payment Address, D-ASA units, Unit value, Paid coupons, Suspended" + "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" }, "desc": "Get account info" }, @@ -852,15 +856,19 @@ "name": "get_secondary_market_schedule", "args": [], "returns": { - "type": "uint64[]" - } + "type": "uint64[]", + "desc": "Secondary market schedule" + }, + "desc": "Get secondary market schedule" }, { "name": "get_asset_metadata", "args": [], "returns": { - "type": "byte[]" - } + "type": "byte[]", + "desc": "Asset metadata" + }, + "desc": "Get D-ASA metadata" } ], "networks": {}, @@ -1222,6 +1230,7 @@ def method() -> str: @dataclasses.dataclass(kw_only=True) class AssetInfo: denomination_asset_id: int + settlement_asset_id: int outstanding_principal: int unit_value: int day_count_convention: int @@ -1242,7 +1251,7 @@ class GetAssetInfoArgs(_ArgsBase[AssetInfo]): @staticmethod def method() -> str: - return "get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)" + return "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)" @dataclasses.dataclass(kw_only=True) @@ -1277,6 +1286,8 @@ def method() -> str: @dataclasses.dataclass(kw_only=True) class GetSecondaryMarketScheduleArgs(_ArgsBase[list[int]]): + """Get secondary market schedule""" + @staticmethod def method() -> str: return "get_secondary_market_schedule()uint64[]" @@ -1284,6 +1295,8 @@ def method() -> str: @dataclasses.dataclass(kw_only=True) class GetAssetMetadataArgs(_ArgsBase[bytes | bytearray]): + """Get D-ASA metadata""" + @staticmethod def method() -> str: return "get_asset_metadata()byte[]" @@ -1861,7 +1874,7 @@ def get_asset_info( ) -> "Composer": """Get D-ASA info - Adds a call to `get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)` ABI method + Adds a call to `get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters :returns Composer: This Composer instance""" @@ -1926,7 +1939,9 @@ def get_secondary_market_schedule( *, transaction_parameters: algokit_utils.TransactionParameters | None = None, ) -> "Composer": - """Adds a call to `get_secondary_market_schedule()uint64[]` ABI method + """Get secondary market schedule + + Adds a call to `get_secondary_market_schedule()uint64[]` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters :returns Composer: This Composer instance""" @@ -1945,7 +1960,9 @@ def get_asset_metadata( *, transaction_parameters: algokit_utils.TransactionParameters | None = None, ) -> "Composer": - """Adds a call to `get_asset_metadata()byte[]` ABI method + """Get D-ASA metadata + + Adds a call to `get_asset_metadata()byte[]` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters :returns Composer: This Composer instance""" @@ -2200,7 +2217,7 @@ def pay_coupon( :param str holding_address: Account Holding Address :param bytes | bytearray payment_info: Additional payment information (Optional) :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[PaymentResult]: Paid coupon amount, Payment timestamp, Payment context""" + :returns algokit_utils.ABITransactionResponse[PaymentResult]: Paid coupon amount in denomination asset, Payment timestamp, Payment context""" args = PayCouponArgs( holding_address=holding_address, @@ -2230,7 +2247,7 @@ def pay_principal( :param str holding_address: Account Holding Address :param bytes | bytearray payment_info: Additional payment information (Optional) :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[PaymentResult]: Paid principal amount, Payment timestamp, Payment context""" + :returns algokit_utils.ABITransactionResponse[PaymentResult]: Paid principal amount in denomination asset, Payment timestamp, Payment context""" args = PayPrincipalArgs( holding_address=holding_address, @@ -2638,10 +2655,10 @@ def get_asset_info( ) -> algokit_utils.ABITransactionResponse[AssetInfo]: """Get D-ASA info - Calls `get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)` ABI method + Calls `get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[AssetInfo]: Denomination Asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary Distribution Opening Date, Primary Distribution Closure Date, Issuance Date, Maturity Date, Suspended, Defaulted""" + :returns algokit_utils.ABITransactionResponse[AssetInfo]: Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Defaulted""" args = GetAssetInfoArgs() result = self.app_client.call( @@ -2666,7 +2683,7 @@ def get_account_info( :param str holding_address: Account Holding Address :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[AccountInfo]: Payment Address, D-ASA units, Unit value, Paid coupons, Suspended""" + :returns algokit_utils.ABITransactionResponse[AccountInfo]: Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended""" args = GetAccountInfoArgs( holding_address=holding_address, @@ -2706,10 +2723,12 @@ def get_secondary_market_schedule( *, transaction_parameters: algokit_utils.TransactionParameters | None = None, ) -> algokit_utils.ABITransactionResponse[list[int]]: - """Calls `get_secondary_market_schedule()uint64[]` ABI method + """Get secondary market schedule + + Calls `get_secondary_market_schedule()uint64[]` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[list[int]]: The result of the transaction""" + :returns algokit_utils.ABITransactionResponse[list[int]]: Secondary market schedule""" args = GetSecondaryMarketScheduleArgs() result = self.app_client.call( @@ -2724,10 +2743,12 @@ def get_asset_metadata( *, transaction_parameters: algokit_utils.TransactionParameters | None = None, ) -> algokit_utils.ABITransactionResponse[bytes | bytearray]: - """Calls `get_asset_metadata()byte[]` ABI method + """Get D-ASA metadata + + Calls `get_asset_metadata()byte[]` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[bytes | bytearray]: The result of the transaction""" + :returns algokit_utils.ABITransactionResponse[bytes | bytearray]: Asset metadata""" args = GetAssetMetadataArgs() result = self.app_client.call( diff --git a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.puya.map b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.puya.map index 933419a..a596990 100644 --- a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.puya.map +++ b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.puya.map @@ -4,7 +4,7 @@ "../../base_d_asa/contract.py", "../../perpetual_bond/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCmD;;AAAf;;AAA5B;AAkBA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AACA;;AAAkB;AAAlB;AACA;;AAA4B;AAA5B;AAGA;;AAAgB;;AAAhB;AAGA;;AAAmB;AAAnB;AACA;AAAyB;AAAzB;AAGA;;AAAqB;AAArB;AAIA;;AAAqB;AAArB;AAKA;;AAAyC;AAAzC;AACA;;AAAyC;AAAzC;AACA;;AAAqB;AAArB;AACA;;AAAqC;AAArC;AACA;;AAAqC;AAArC;AACA;;AAAqB;AAArB;AAGA;AAAc;AAAd;AACA;;AAAiB;AAAjB;AACA;;AAAiB;AAAjB;ACxDO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAGA;;AAAqB;AAArB;AACA;;AAAyB;AAAzB;AAxBR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;ADu6BK;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAPA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjBA;;AAAA;AAAA;AAAA;;AAAA;ACl4BL;;;ADk4BK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9BA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAdA;;AAAA;AAAA;AAAA;;AAAA;ACt1BL;;;ADs1BK;;;AAAA;;AAvBA;;AAAA;AAAA;AAAA;;AAAA;AC/zBL;;;AAAA;;;AD+zBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlBA;;AAAA;AAAA;AAAA;;AAAA;AC7yBL;;;AD6yBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA1CA;;AAAA;AAAA;AAAA;;AAAA;ACnwBL;;;AAAA;;;ADmwBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9BA;;AAAA;AAAA;AAAA;;AAAA;ACruBL;;;ADquBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAnCA;;AAAA;AAAA;AAAA;;AAAA;AClsBL;;;AAAA;;;ADksBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhDA;;AAAA;AAAA;AAAA;;AAAA;AClpBL;;;AAAA;;;ADkpBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/DA;;AAAA;AAAA;AAAA;;AAAA;ACnlBL;;;AAAA;;;AAAA;;;ADmlBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAxDA;;AAAA;AAAA;AAAA;;AAAA;AC3hBL;;;AD2hBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlFA;;AAAA;AAAA;AAAA;;AAAA;ACzcL;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;ADycK;;;AAAA;;AAtBA;;AAAA;AAAA;AAAA;;AAAA;AAAA;ACnbL;;;AAAA;;;ADmbK;;;AAAA;;AC7DA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA7BA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAzBA;;AAAA;AAAA;AAAA;;AAAA;AAhUL;;;AAgUK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAzDA;;AAAA;AAAA;AAAA;;AAAA;AAvQL;;;AAAA;;;AAuQK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA3BA;;AAAA;AAAA;AAAA;;AAAA;AA5OL;;;AA4OK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA7DA;;AAAA;AAAA;AAAA;;AAAA;AA/KL;;;AAAA;;;AA+KK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjDA;;AAAA;AAAA;AAAA;;AAAA;AA9HL;;;AAAA;;;AAAA;;;AA8HK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9HL;;AAAA;;AAAA;;;;AAAA;;;AD+bK;;AAAA;AAAL;;;AAAA;;ACjUA;;;;;;;;;AA+BY;;AAAA;AD3EG;AAAA;AAAA;AAAA;AAAe;AAAf;AAgMH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AA+EO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AA1M0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AA6MW;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;AAAP;AACW;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;AAAP;AAIa;;AAAA;AAAA;AAAA;;;AAAA;AAAT;;AAAA;AADJ;AAUoB;AAAA;AAAA;AAAA;;;AAApB;;AACG;AAAA;AAAA;;;AAAA;AAAX;;;AAvFY;;AAAA;AAAA;AAAA;;;AAAmC;;AAAA;AAAA;AAAA;;;AAAnC;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AAAqC;;AAAA;AAAA;AAAA;;;AAArC;AADJ;;;;AADJ;AC3Hc;;;AACd;;AAAA;;AAAA;;;AAGoB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAApB;;AACA;;AAAA;;AAAA;AAAA;;AAAA;;AAAmB;;;AAAnB;;ADkPI;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AADyC;AAA7C;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAII;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAD2C;AAA/C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AA5EG;AAAA;AAAA;;;AAAA;AAAX;;;AACY;;AAAA;AAAA;AAAA;AAA2C;;AAA3C;;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAA6C;;AAA7C;;AAAA;ACnK8B;;AAAA;AAAf;;AAAA;AAAA;;AAAA;AAAZ;AAAP;;AAAA;;;;;AD4MI;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AACsD;;AAAA;AAAA;AAAtD;;AAAA;AAAA;AAAA;AAAsD;;;AAAtD;;AAAA;;;;;;;;AAlSZ;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAER;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AC/CR;;;AAEsB;AACD;;AAAb;AACgB;AAAA;;AAAA;AAAA;AAAb;AAAX;;;AACwC;AAAA;;AAAA;AAAA;AAAb;;AAAA;AAAA;AAAoC;AAAA;;AAAA;AAAA;AAArC;AAAd;;AAEJ;AAqBR;;;AAKY;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AADJ;;AA6BR;;;AAKQ;;AAAA;;AAAA;;;AACA;;AAAmB;;;AACK;AAAA;;;AAAA;AACR;AAAA;;;AAAA;AAEZ;;AAAA;;AAAA;;;AACE;AAAA;;AAAA;AAAA;AADF;AAAA;;AAAA;AAII;;AAAA;;AAAA;AAJJ;AADJ;AA9BR;;;;;;;AAGA;;AAAA;;;AACkC;AAAA;;AAAA;AAAA;AAGF;;AAAxB;AAAwB;AAAxB;AAAA;;AACgB;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACb;AAAA;;AAAA;AAAA;AAA6B;AAA7B;;;;;;;AAAX;;;AD0Oe;;AAAe;;AAAf;AAAA;;AAAe;;AAAf;;;;;;;;;ACtOO;AACE;AAAA;AAFT;AAAP;;AAAA;AArCkB;AAAlB;;AACR;;AAAA;;;AACY;;AAAkB;;;AAAlB;;;;;;;AARZ;;;AAEe;AAAA;;AAAA;AAAA;AAA8B;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAArB;AAAP;ADkQR;;;AAIuB;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAR;;AAAA;AAAP;ACjJR;;;AD7Fe;AAAA;AAAA;AAAA;AAAe;AAAf;ACqHP;AACA;;;AACA;;;ADjD0B;AAAnB;;AAAA;AAAA;;AAAA;AAAA;;AAAP;ACmDQ;AAAA;AAAA;AAAA;;;AAAA;AAAR;AAAA;;AACA;AACc;;;AACS;;AAAA;AAAA;AAAA;;;AAAA;AAChB;AAAA;;AAAA;AAAP;AAEO;;;AAAP;ADmFI;AAAA;AAAA;;;AACU;AAAA;;AAAA;AAAA;AADV;;AAAA;;AAAA;;;AAGQ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;;;;ACjFhB;;;AAEgB;;AAAA;;;AAnIkB;AAAA;;AAAA;AAAA;AAAnB;AAAyC;;AAAzC;AAAA;ADyNC;;AADE;AAAA;;AAAA;AAAA;AAAN;;AAAA;AAAA;;AAAA;AADJ;AC/Ea;;AAAA;AAAA;AAAA;;;ADwFb;AAIQ;;AAHO;AAAA;;AAAA;AAAA;;;;;;;;;;;AADf;;;;;;AAAA;AClFI;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAoD;AAApD;AADyC;AAA7C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAEW;AACe;;AAAZ;AAFP;AAAA;;;;AAAA;AAAA;;AAAA;AAAP;;AAAA;AANqB;;;;;;;;AAzJ7B;;;AAEe;AAAA;;AAAA;AAAA;AAA0B;AAAA;AAAA;AAAA;AAAA;;AAAA;AAA1B;AAAP;ADyPR;;;AAG6B;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AADd;;AAAA;AAAA;;;AAAP;ACxFR;;;;AD5FsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AC+GA;;;AACA;;;AACc;;;AACP;;;AAAP;AAGqB;;AAAA;AAArB;;AAAA;AAAA;AACmB;;AAAZ;AAAP;;AAAA;;;;;AAER;;;;;;;;AAqBY;AAAA;;AAAA;AAAA;AAAA;;;AACI;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;;;;AADJ;ADnI0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;ACyII;;AAAA;;AAAA;AAAA;;;AAAa;;AAAA;AAAA;AAAA;;;AAAA;AAAT;AAAA;;AAAA;AAAJ;;;;AADJ;AAMqB;;AAAA;AAAA;AAAA;;AADrB;;AAAA;AAA8B;;;AAA9B;;AAImB;AAAnB;;AACY;AAAZ;;AACc;AAAd;;AAGc;;;AAAd;AAAA;;AACA;;AAAA;AAAA;;;AACG;;;AAAX;;;AACY;;AAAA;AAAmB;;;AACnB;;AAAA;;AAAA;;AAAmB;;;AAAnB;;AAGY;AAAA;;;AAAA;AAAZ;;AACc;;;AAAA;AAAd;;AAEY;;AAAA;AACK;;AAAA;AAEH;;AAAA;AACE;;AAAA;AAFC;AAHd;;AAAA;AAAA;AAAA;AAAP;;AAAA;;;;;;;;;AA/MR;;;AAEe;AAAA;;AAAA;AAAA;AAAA;;;AAA4B;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AAA5B;;;;AAAP;;AAAA;AAsNR;;;ADxKkC;AAAnB;;AAAA;AAAA;AAAA;;AAAP;ACwLI;;AAAA;;;AACE;AAAA;;AAAA;AAAA;AADF;AAEG;;AAFH;AAKS;AACC;;AAFP;AAAP;AAKR;;;;;;;ADvQe;AAAA;AAAA;AAAA;AAAe;AAAf;ACgRO;;;AAAA;;;;;AA7Rc;;AAAA;AAAc;AAAd;AAArB;;;AAAA;;AA+RgB;;;AAAvB;;AACY;AAAZ;;AACc;AAAd;;AACG;;;AAAX;;;AACY;;AAAmB;;;AACP;AAAA;;;AAAA;AAAZ;;AACc;;;AAAA;AAAd;;AAE0B;AAAA;;AAAA;AAAA;AAAZ;AACF;;AAAA;AACS;;AAAA;AAEP;;AAAA;AACE;;AAAA;AAFC;AAII;;AAAA;AAAA;;AAAA;AARlB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAP;;AAAA;AATuE;;;;;;AAoB/E;;;AAQuB;;AD5SR;AAAA;AAAA;AAAA;AAAe;AAAf;AC6Sf;;;AAC2B;;AAAA;AAAA;AAAA;;AAAA;AACnB;;AAAA;AAAA;ADkDR;;;AASQ;;AAAA;;AAAA;AACgB;;AAAA;;;AAAhB;;AAAA;AAAA;;AAYR;;;;;;;AAyCQ;;;AACO;AAAA;AAAA;AAAA;AAAA;AAAP;AAG+B;;AAAA;AAAA;AAxV3B;;;AAAuC;;AAAA;;AAAA;AAAA;;AAAA;AAAvC;;;;AADJ;AAMA;;AAAA;;AAAA;AAuV6B;;AAAA;AAjVF;AAAA;;AAAA;AAAA;AAAvB;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAEA;AAIQ;;AAHO;AAAA;;AAAA;AAAA;AACI;;AACF;;;;;;;AAHjB;;;;;;AAAA;AA+UI;;AAAA;AAAmB;;AAAA;AAAnB;AAAA;AAAA;AADJ;AAGA;;AAAA;;AAAA;AACmB;AAAnB;;AAAA;AAAA;AAGiC;;AAAA;AAAA;AAAA;;AA1U7B;AADG;AAAA;;;AAAA;;AAEH;;;AAFG;AAAA;;;;AAAP;AAOA;;AAAA;;AAAA;AAwU0B;;AAAA;AApU1B;AAAA;AAIA;;AAAA;AAAA;AAIW;;AAAA;AAAA;AAAJ;AAAA;AAAP;AAIA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AAAX;;;AACY;;AAAA;;AAAA;;AAAA;;AAAA;ACrLA;;AAAA;AAAA;AAAsB;AAAA;;AAAA;AAAA;AAAqB;;AAArB;AAAtB;AADJ;ADqfA;;AAAA;;;AAAA;;AAjSA;;AAAA;;AAAA;;AAAA;;AAAA;AACyC;;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGyC;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGqB;;;AAAA;AAArB;;AAAA;AAAA;AAGG;;AAAA;AAAA;AAAA;AAAA;;AAAsB;AAAA;;AAAA;AAAA;AAAqB;;AAArB;AAAtB;AAAX;;;AACiC;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAArB;;AAAA;AAAA;ACxNG;;AAAA;AAAA;AAAuB;AAAvB;AAAP;AACyB;;AAAA;;;AAAA;;;AAAA;AAAA;;;AAAA;AACX;AAAA;;;AAAA;AACd;AAAA;AACO;AAAP;AAIA;;AAAA;;AAAA;;AAAA;;AAAA;AACqB;;AAAA;AAAA;AAAA;;;AAAA;;;AAAA;;;AAAA;AAArB;;AAAA;AAAA;AD4eA;AAAc;AAAd;;;;;;;;;;AAzbR;;;AAEe;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAP;;AAyHR;;;;;;AAGY;;AAAA;;;AAAA;AAAA;;;AAAA;AACE;;AADF;AADJ;AAIiB;;AAAA;AAAA;AAAqB;AAArB;AAAP;AAAA;;AAAA;;AAAA;AAAlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKqB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AAAA;;AAC0B;AAAL;AAAA;AAAA;;AAAZ;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AACO;AAAP;AACG;AAAA;;AAAA;AAAA;AAA6B;;;AAA7B;AAAf;;;AAEwB;;AAAA;;AAAA;AAAmB;;AAApB;AAAA;AAAP;;;;;;;;;AAgThB;;;;AAqBQ;;;AA1dO;AAAA;AAAA;AAAA;AAAe;;AAAf;AA2dA;AAAP;AACA;;;AAEO;;AAAA;AAAA;AAAP;AAAA;AACyC;AAAtC;;;;AAAX;;;AACY;;AAAA;;;;AAAA;;;;;;;;AAEA;AAAA;;AAAA;AAAA;AACG;;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAEI;;AAAA;AAAA;AADD;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAKI;AAAA;;AAAA;AAAA;AAD0B;AAI1B;AAAA;;AAAA;AAAA;AAD0B;AAJ3B;AAAP;;AAAA;AASR;;;AAqBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;AASS;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA6BQ;AANwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;AAKW;;AAAZ;AAAP;AAAA;AAXmC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACyD;;AAAA;;;AAAzD;;;;AAJ2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACuD;;AAAA;;;AAAvD;;;;AAN2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEI;;AAAA;;;AADJ;;;;AAPwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;;;;AALA;;AAAA;;AAAA;;;;;;;;AA8BhB;;;AAkBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAAP;AASS;;;;;;;AAFT;;AAAA;;;;;;;;;;;;AAkBQ;AAHuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAGW;;AAAZ;AAAP;AAAA;AAP+B;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;;;;;AAiBhB;;;AAoBQ;;;AAhoBO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAioBA;AAAP;AACA;;;AACA;;;AAC8B;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEgC;;AAEtB;;AAFsB;AAGjB;;AAHiB;AAIf;;AAJe;AAKlB;;AALkB;AAAhC;AAOmB;;AAAZ;AAAP;AA/nBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AA8nBR;;;AAkBQ;;;AACA;;;AAhmB0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAmmBe;AAAA;AAAA;AAAA;;;AAAA;AAAf;AAAA;;AACA;;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzaG;AAAA;AAAA;AAAA;AAAX;;;AACY;AAAc;;AAAd;AA2aC;;AAAA;AAAuC;;AAAZ;AADzB;AAAP;AAAA;AAIR;;;;;;;AAjrBe;AAAA;AAAA;AAAA;AAAe;AAAf;AAuLH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AAtJc;;AAFQ;;AAElB;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAuC0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAuoBA;;;AACA;;;AACO;;AAAA;AAAP;AAAA;AAEI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAyC;AAAA;;AAAA;AAAA;AAAzC;AADJ;AAIA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAEI;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AADkC;AAAtC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAGuD;AAAA;;AAAA;AAAA;AAAZ;AAA3C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AACmB;AAAA;;AAAA;AAAA;AAAmB;AAAA;AAAA;AAAA;AAAnB;AAAZ;AAAP;;AAAA;;;;;;;;;AAER;;;AAcQ;;;AACiB;;;AAAO;AAAxB;;AAAA;AAAA;AACmB;;AAAZ;AAAP;AA3rBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AA0rBR;;;AAkBQ;;;AAzrB0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2rBA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AACmB;;AAAZ;AAAP;AAER;;;;AA1tBsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAuuBiB;;;AAAO;AAAxB;;AAAA;AAAA;;;;;;AAER;;;AAW8C;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AAAZ;AACC;AAAA;;AAAA;AAAA;AAAZ;AACqB;AAAA;;AAAA;AAAA;AAAX;AAAA;;;AACK;AAAA;;AAAA;AAAA;AAAZ;AAAA;;;AACW;AAAA;;AAAA;AAAA;AAAZ;AACkB;AAAA;AAAA;AAAA;AAAZ;AAEf;AAAA;;AAAA;AAAA;AAD8B;AAI9B;AAAA;;AAAA;AAAA;AAD8B;AAGR;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AACW;AAAA;;AAAA;AAAA;AAAf;;AAAA;AAAA;;AAAA;AACe;AAAA;;AAAA;AAAA;AAAf;;AAAA;AAAA;;AAAA;AAjBP;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAP;AAoBR;;;AA1uBkC;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAyvBO;AAAA;AAAP;AAER;;;AAQsB;;AAz0BP;AAAA;AAAA;AAAA;AAAe;AAAf;AA00Bf;;;AAC0B;;AAAA;AAAA;AAAA;;AAAA;AAClB;;AAAA;AAAA;AAER;;;AAGwB;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AAFG;AAAA;;;;AAAA;AAAA;AAAP;AAKR;;;AAEiC;AAAA;;AAAA;AAAA;AAAlB;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAP;AA1eR;;;AAQQ;;;", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCmD;;AAAf;;AAA5B;AAkBA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AACA;;AAAkB;AAAlB;AACA;;AAA4B;AAA5B;AAGA;;AAAgB;;AAAhB;AAGA;;AAAmB;AAAnB;AACA;AAAyB;AAAzB;AAGA;;AAAqB;AAArB;AAIA;;AAAqB;AAArB;AAKA;;AAAyC;AAAzC;AACA;;AAAyC;AAAzC;AACA;;AAAqB;AAArB;AACA;;AAAqC;AAArC;AACA;;AAAqC;AAArC;AACA;;AAAqB;AAArB;AAGA;AAAc;AAAd;AACA;;AAAiB;AAAjB;AACA;;AAAiB;AAAjB;ACxDO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AAGA;;AAAqB;AAArB;AACA;;AAAyB;AAAzB;AAxBR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AD46BK;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjBA;;AAAA;AAAA;AAAA;;AAAA;ACj4BL;;;ADi4BK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAdA;;AAAA;AAAA;AAAA;;AAAA;ACp1BL;;;ADo1BK;;;AAAA;;AAvBA;;AAAA;AAAA;AAAA;;AAAA;AC7zBL;;;AAAA;;;AD6zBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlBA;;AAAA;AAAA;AAAA;;AAAA;AC3yBL;;;AD2yBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA1CA;;AAAA;AAAA;AAAA;;AAAA;ACjwBL;;;AAAA;;;ADiwBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9BA;;AAAA;AAAA;AAAA;;AAAA;ACnuBL;;;ADmuBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAnCA;;AAAA;AAAA;AAAA;;AAAA;AChsBL;;;AAAA;;;ADgsBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhDA;;AAAA;AAAA;AAAA;;AAAA;AChpBL;;;AAAA;;;ADgpBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/DA;;AAAA;AAAA;AAAA;;AAAA;ACjlBL;;;AAAA;;;AAAA;;;ADilBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAxDA;;AAAA;AAAA;AAAA;;AAAA;ACzhBL;;;ADyhBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlFA;;AAAA;AAAA;AAAA;;AAAA;ACvcL;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;ADucK;;;AAAA;;AAtBA;;AAAA;AAAA;AAAA;;AAAA;AAAA;ACjbL;;;AAAA;;;ADibK;;;AAAA;;AC3DA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA7BA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAzBA;;AAAA;AAAA;AAAA;;AAAA;AAhUL;;;AAgUK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAzDA;;AAAA;AAAA;AAAA;;AAAA;AAvQL;;;AAAA;;;AAuQK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA3BA;;AAAA;AAAA;AAAA;;AAAA;AA5OL;;;AA4OK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA7DA;;AAAA;AAAA;AAAA;;AAAA;AA/KL;;;AAAA;;;AA+KK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjDA;;AAAA;AAAA;AAAA;;AAAA;AA9HL;;;AAAA;;;AAAA;;;AA8HK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9HL;;AAAA;;AAAA;;;;AAAA;;;AD6bK;;AAAA;AAAL;;;AAAA;;AC/TA;;;;;;;;;AA+BY;;AAAA;AD3EG;AAAA;AAAA;AAAA;AAAe;AAAf;AAgMH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AA6EO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AAxM0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AA2MW;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;AAAP;AACW;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;AAAP;AAIa;;AAAA;AAAA;AAAA;;;AAAA;AAAT;;AAAA;AADJ;AAUoB;AAAA;AAAA;AAAA;;;AAApB;;AACG;AAAA;AAAA;;;AAAA;AAAX;;;AArFY;;AAAA;AAAA;AAAA;;;AAAmC;;AAAA;AAAA;AAAA;;;AAAnC;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AAAqC;;AAAA;AAAA;AAAA;;;AAArC;AADJ;;;;AADJ;AC3Hc;;;AACd;;AAAA;;AAAA;;;AAGoB;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAApB;;AACA;;AAAA;;AAAA;AAAA;;AAAA;;AAAmB;;;AAAnB;;ADgPI;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AADyC;AAA7C;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAII;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAD2C;AAA/C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AA5EG;AAAA;AAAA;;;AAAA;AAAX;;;AACY;;AAAA;AAAA;AAAA;AAA2C;;AAA3C;;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAA6C;;AAA7C;;AAAA;ACjK8B;;AAAA;AAAf;;AAAA;AAAA;;AAAA;AAAZ;AAAP;;AAAA;;;;;AD0MI;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AACsD;;AAAA;AAAA;AAAtD;;AAAA;AAAA;AAAA;AAAsD;;;AAAtD;;AAAA;;;;;;;;AAhSZ;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAER;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AC/CR;;;AAEsB;AACD;;AAAb;AACgB;AAAA;;AAAA;AAAA;AAAb;AAAX;;;AACwC;AAAA;;AAAA;AAAA;AAAb;;AAAA;AAAA;AAAoC;AAAA;;AAAA;AAAA;AAArC;AAAd;;AAEJ;AAqBR;;;AAKY;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;;AAAA;AAAA;AADJ;;AA6BR;;;AAKQ;;AAAA;;AAAA;;;AACA;;AAAmB;;;AACK;AAAA;;;AAAA;AACR;AAAA;;;AAAA;AAEZ;;AAAA;;AAAA;;;AACE;AAAA;;AAAA;AAAA;AADF;AAAA;;AAAA;AAII;;AAAA;;AAAA;AAJJ;AADJ;AA9BR;;;;;;;AAGA;;AAAA;;;AACkC;AAAA;;AAAA;AAAA;AAGF;;AAAxB;AAAwB;AAAxB;AAAA;;AACgB;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AACb;AAAA;;AAAA;AAAA;AAA6B;AAA7B;;;;;;;AAAX;;;ADwOe;;AAAe;;AAAf;AAAA;;AAAe;;AAAf;;;;;;;;;ACpOO;AACE;AAAA;AAFT;AAAP;;AAAA;AArCkB;AAAlB;;AACR;;AAAA;;;AACY;;AAAkB;;;AAAlB;;;;;;;AARZ;;;AAEe;AAAA;;AAAA;AAAA;AAA8B;AAAA;;AAAA;AAAA;AAAT;;AAAA;AAArB;AAAP;ADgQR;;;AAIuB;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAR;;AAAA;AAAP;AC/IR;;;AD7Fe;AAAA;AAAA;AAAA;AAAe;AAAf;ACqHP;AACA;;;AACA;;;ADjD0B;AAAnB;;AAAA;AAAA;;AAAA;AAAA;;AAAP;ACmDQ;AAAA;AAAA;AAAA;;;AAAA;AAAR;AAAA;;AACA;AACc;;;AACS;;AAAA;AAAA;AAAA;;;AAAA;AAChB;AAAA;;AAAA;AAAP;AAEO;;;AAAP;ADmFI;AAAA;AAAA;;;AACU;AAAA;;AAAA;AAAA;AADV;;AAAA;;AAAA;;;AAGQ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;;;;ACjFhB;;;AAEgB;;AAAA;;;AAnIkB;AAAA;;AAAA;AAAA;AAAnB;AAAyC;;AAAzC;AAAA;ADwNqC;;AAAlC;AAAA;;AAAA;AAAA;AAAN;;AAAA;AAAA;;AAAA;AADJ;AC/Ea;;AAAA;AAAA;AAAA;;;ADsFb;AAIQ;;AAHO;AAAA;;AAAA;AAAA;;;;;;;;;;;AADf;;;;;;AAAA;AChFI;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAoD;AAApD;AADyC;AAA7C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAGA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAEW;AACe;;AAAZ;AAFP;AAAA;;;;AAAA;AAAA;;AAAA;AAAP;;AAAA;AANqB;;;;;;;;AAzJ7B;;;AAEe;AAAA;;AAAA;AAAA;AAA0B;AAAA;AAAA;AAAA;AAAA;;AAAA;AAA1B;AAAP;ADuPR;;;AAG6B;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AADd;;AAAA;AAAA;;;AAAP;ACtFR;;;;AD5FsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AC+GA;;;AACA;;;AACc;;;AACP;;;AAAP;AAGqB;;AAAA;AAArB;;AAAA;AAAA;AACmB;;AAAZ;AAAP;;AAAA;;;;;AAER;;;;;;;;AAqBY;AAAA;;AAAA;AAAA;AAAA;;;AACI;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;;;;AADJ;ADnI0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;ACyII;;AAAA;;AAAA;AAAA;;;AAAa;;AAAA;AAAA;AAAA;;;AAAA;AAAT;AAAA;;AAAA;AAAJ;;;;AADJ;AAMqB;;AAAA;AAAA;AAAA;;AADrB;;AAAA;AAA8B;;;AAA9B;;AAImB;AAAnB;;AACY;AAAZ;;AACc;AAAd;;AAGc;;;AAAd;AAAA;;AACA;;AAAA;AAAA;;;AACG;;;AAAX;;;AACY;;AAAA;AAAmB;;;AACnB;;AAAA;;AAAA;;AAAmB;;;AAAnB;;AAGY;AAAA;;;AAAA;AAAZ;;AACc;;;AAAA;AAAd;;AAEY;;AAAA;AACK;;AAAA;AAEH;;AAAA;AACE;;AAAA;AAFC;AAHd;;AAAA;AAAA;AAAA;AAAP;;AAAA;;;;;;;;;AA/MR;;;AAEe;AAAA;;AAAA;AAAA;AAAA;;;AAA4B;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AAA5B;;;;AAAP;;AAAA;AAsNR;;;ADxKkC;AAAnB;;AAAA;AAAA;AAAA;;AAAP;ACwLI;;AAAA;;;AACE;AAAA;;AAAA;AAAA;AADF;AAEG;;AAFH;AAKS;AACC;;AAFP;AAAP;AAKR;;;;;;;ADvQe;AAAA;AAAA;AAAA;AAAe;AAAf;ACgRO;;;AAAA;;;;;AA7Rc;;AAAA;AAAc;AAAd;AAArB;;;AAAA;;AA+RgB;;;AAAvB;;AACY;AAAZ;;AACc;AAAd;;AACG;;;AAAX;;;AACY;;AAAmB;;;AACP;AAAA;;;AAAA;AAAZ;;AACc;;;AAAA;AAAd;;AAE0B;AAAA;;AAAA;AAAA;AAAZ;AACF;;AAAA;AACS;;AAAA;AAEP;;AAAA;AACE;;AAAA;AAFC;AAII;;AAAA;AAAA;;AAAA;AARlB;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAP;;AAAA;AATuE;;;;;;AAoB/E;;;AAQuB;;AD5SR;AAAA;AAAA;AAAA;AAAe;AAAf;AC6Sf;;;AAC2B;;AAAA;AAAA;AAAA;;AAAA;AACnB;;AAAA;AAAA;ADgDR;;;AASQ;;AAAA;;AAAA;AACgB;;AAAA;;;AAAhB;;AAAA;AAAA;;AAYR;;;;;;;AAyCQ;;;AACO;AAAA;AAAA;AAAA;AAAA;AAAP;AAG+B;;AAAA;AAAA;AAtV3B;;;AAAuC;;AAAA;;AAAA;AAAA;;AAAA;AAAvC;;;;AADJ;AAMA;;AAAA;;AAAA;AAqV6B;;AAAA;AA/UF;AAAA;;AAAA;AAAA;AAAvB;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAEA;AAIQ;;AAHO;AAAA;;AAAA;AAAA;AACI;;AACF;;;;;;;AAHjB;;;;;;AAAA;AA6UI;;AAAA;AAAmB;;AAAA;AAAnB;AAAA;AAAA;AADJ;AAGA;;AAAA;;AAAA;AACmB;AAAnB;;AAAA;AAAA;AAGiC;;AAAA;AAAA;AAAA;;AAxU7B;AADG;AAAA;;;AAAA;;AAEH;;;AAFG;AAAA;;;;AAAP;AAOA;;AAAA;;AAAA;AAsU0B;;AAAA;AAlU1B;AAAA;AAIA;;AAAA;AAAA;AAIW;;AAAA;AAAA;AAAJ;AAAA;AAAP;AAIA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AAAX;;;AACY;;AAAA;;AAAA;;AAAA;;AAAA;ACrLA;;AAAA;AAAA;AAAsB;AAAA;;AAAA;AAAA;AAAqB;;AAArB;AAAtB;AADJ;ADmfA;;AAAA;;;AAAA;;AA/RA;;AAAA;;AAAA;;AAAA;;AAAA;AACyC;;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGyC;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGqB;;;AAAA;AAArB;;AAAA;AAAA;AAGG;;AAAA;AAAA;AAAA;AAAA;;AAAsB;AAAA;;AAAA;AAAA;AAAqB;;AAArB;AAAtB;AAAX;;;AACiC;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAArB;;AAAA;AAAA;ACxNG;;AAAA;AAAA;AAAuB;AAAvB;AAAP;AACyB;;AAAA;;;AAAA;;;AAAA;AAAA;;;AAAA;AACX;AAAA;;;AAAA;AACd;AAAA;AACO;AAAP;AAIA;;AAAA;;AAAA;;AAAA;;AAAA;AACqB;;AAAA;AAAA;AAAA;;;AAAA;;;AAAA;;;AAAA;AAArB;;AAAA;AAAA;AD0eA;AAAc;AAAd;;;;;;;;;;AAvbR;;;AAEe;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAP;;AAyHR;;;;;;AAGY;;AAAA;;;AAAA;AAAA;;;AAAA;AACE;;AADF;AADJ;AAIiB;;AAAA;AAAA;AAAqB;AAArB;AAAP;AAAA;;AAAA;;AAAA;AAAlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKqB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AAAA;;AAC0B;AAAL;AAAA;AAAA;;AAAZ;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AACO;AAAP;AACG;AAAA;;AAAA;AAAA;AAA6B;;;AAA7B;AAAf;;;AAEwB;;AAAA;;AAAA;AAAmB;;AAApB;AAAA;AAAP;;;;;;;;;AA8ShB;;;;AAqBQ;;;AAxdO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAydA;AAAP;AACA;;;AAEO;;AAAA;AAAA;AAAP;AAAA;AACyC;AAAtC;;;;AAAX;;;AACY;;AAAA;;;;AAAA;;;;;;;;AAEA;AAAA;;AAAA;AAAA;AACG;;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAEI;;AAAA;AAAA;AADD;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAKI;AAAA;;AAAA;AAAA;AAD0B;AAI1B;AAAA;;AAAA;AAAA;AAD0B;AAJ3B;AAAP;;AAAA;AASR;;;AAqBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;AASS;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA6BQ;AANwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;AAKW;;AAAZ;AAAP;AAAA;AAXmC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACyD;;AAAA;;;AAAzD;;;;AAJ2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACuD;;AAAA;;;AAAvD;;;;AAN2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEI;;AAAA;;;AADJ;;;;AAPwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;;;;AALA;;AAAA;;AAAA;;;;;;;;AA8BhB;;;AAkBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAAP;AASS;;;;;;;AAFT;;AAAA;;;;;;;;;;;;AAkBQ;AAHuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAGW;;AAAZ;AAAP;AAAA;AAP+B;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;;;;;AAiBhB;;;AAoBQ;;;AA9nBO;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+nBA;AAAP;AACA;;;AACA;;;AAC8B;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEgC;;AAEtB;;AAFsB;AAGjB;;AAHiB;AAIf;;AAJe;AAKlB;;AALkB;AAAhC;AAOmB;;AAAZ;AAAP;AA7nBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AA4nBR;;;AAkBQ;;;AACA;;;AA9lB0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAimBe;AAAA;AAAA;AAAA;;;AAAA;AAAf;AAAA;;AACA;;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAzaG;AAAA;AAAA;AAAA;AAAX;;;AACY;AAAc;;AAAd;AA2aC;;AAAA;AAAuC;;AAAZ;AADzB;AAAP;AAAA;AAIR;;;;;;;AA/qBe;AAAA;AAAA;AAAA;AAAe;AAAf;AAuLH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AAtJc;;AAFQ;;AAElB;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAuC0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqoBA;;;AACA;;;AACO;;AAAA;AAAP;AAAA;AAEI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAyC;AAAA;;AAAA;AAAA;AAAzC;AADJ;AAIA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAEI;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AADkC;AAAtC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAGuD;AAAA;;AAAA;AAAA;AAAZ;AAA3C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AACmB;AAAA;;AAAA;AAAA;AAAmB;AAAA;AAAA;AAAA;AAAnB;AAAZ;AAAP;;AAAA;;;;;;;;;AAER;;;AAcQ;;;AACiB;;;AAAO;AAAxB;;AAAA;AAAA;AACmB;;AAAZ;AAAP;AAzrBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AAwrBR;;;AAkBQ;;;AAvrB0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAyrBA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AACmB;;AAAZ;AAAP;AAER;;;;AAxtBsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAquBiB;;;AAAO;AAAxB;;AAAA;AAAA;;;;;;AAER;;;AAW8C;AAAA;;AAAA;AAAA;AAAZ;AACU;AAAA;;AAAA;AAAA;AAAZ;AACc;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AAAZ;AACC;AAAA;;AAAA;AAAA;AAAZ;AACqB;AAAA;;AAAA;AAAA;AAAX;AAAA;;;AACK;AAAA;;AAAA;AAAA;AAAZ;AAAA;;;AACW;AAAA;;AAAA;AAAA;AAAZ;AACkB;AAAA;AAAA;AAAA;AAAZ;AAEf;AAAA;;AAAA;AAAA;AAD8B;AAI9B;AAAA;;AAAA;AAAA;AAD8B;AAGR;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AACW;AAAA;;AAAA;AAAA;AAAf;;AAAA;AAAA;;AAAA;AACe;AAAA;;AAAA;AAAA;AAAf;;AAAA;AAAA;;AAAA;AAlBP;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAP;AAqBR;;;AAzuBkC;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAwvBO;AAAA;AAAP;AAER;;;AAQsB;;AAx0BP;AAAA;AAAA;AAAA;AAAe;AAAf;AAy0Bf;;;AAC0B;;AAAA;AAAA;AAAA;;AAAA;AAClB;;AAAA;AAAA;AAER;;;AASwB;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AAFG;AAAA;;;;AAAA;AAAA;AAAP;AAKR;;;AAQiC;AAAA;;AAAA;AAAA;AAAlB;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAP;AAvfR;;;AAQQ;;;", "op_pc_offset": 0, "pc_events": { "1": { @@ -15,7 +15,7 @@ "op": "intcblock 0 1 100 8 448 10000 86400 200" }, "16": { - "op": "bytecblock 0x151f7c75 0x52333023 \"status\" \"circulating_units\" \"issuance_date\" \"interest_rate\" 0x00 0x0000000000000000 \"denomination_asset_id\" \"total_coupons\" \"primary_distribution_opening_date\" \"unit_value\" \"day_count_convention\" \"total_units\" \"secondary_market_opening_date\" \"secondary_market_closure_date\" \"maturity_date\" \"coupon_period\" 0x52323023 \"settlement_asset_id\" \"primary_distribution_closure_date\" \"suspended\" \"defaulted\" \"paid_coupon_units\" 0x74696d65506572696f6473 \"metadata\" 0x52383023 0x74696d654576656e7473 0x52373023 0x52363023 0x52353023 0x52343023 0x0000 0x636f75706f6e5261746573 0x068101" + "op": "bytecblock 0x151f7c75 0x52333023 \"status\" \"circulating_units\" \"issuance_date\" \"settlement_asset_id\" \"interest_rate\" 0x00 0x0000000000000000 \"total_coupons\" \"primary_distribution_opening_date\" \"unit_value\" \"day_count_convention\" \"total_units\" \"secondary_market_opening_date\" \"secondary_market_closure_date\" \"maturity_date\" \"coupon_period\" 0x52323023 \"denomination_asset_id\" \"primary_distribution_closure_date\" \"suspended\" \"defaulted\" \"paid_coupon_units\" 0x74696d65506572696f6473 \"metadata\" 0x52383023 0x74696d654576656e7473 0x52373023 0x52363023 0x52353023 0x52343023 0x0000 0x636f75706f6e5261746573 0x068101" }, "467": { "op": "txn ApplicationID", @@ -40,7 +40,7 @@ "op": "app_global_put" }, "477": { - "op": "bytec 8 // \"denomination_asset_id\"" + "op": "bytec 19 // \"denomination_asset_id\"" }, "479": { "op": "intc_0 // 0" @@ -49,7 +49,7 @@ "op": "app_global_put" }, "481": { - "op": "bytec 19 // \"settlement_asset_id\"" + "op": "bytec 5 // \"settlement_asset_id\"" }, "483": { "op": "intc_0 // 0" @@ -103,7 +103,7 @@ "op": "app_global_put" }, "505": { - "op": "bytec 5 // \"interest_rate\"" + "op": "bytec 6 // \"interest_rate\"" }, "507": { "op": "intc_0 // 0" @@ -281,7 +281,7 @@ "stack_out": [] }, "581": { - "op": "pushbytess 0x4fd6a3cc 0x8cf14b51 0x80e51e9f 0x44363d49 0x67db4f20 0xf6a96c8d 0x229b706f 0x63f99589 0xd3a4d6ab 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x301dd919 0xed02759f 0xfad2173e 0x08efea35 0xddcec07b // method \"asset_transfer(address,address,uint64)uint64\", method \"pay_coupon(address,byte[])(uint64,uint64,byte[])\", method \"update_interest_rate(uint64)uint64\", method \"get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))\", method \"get_payment_amount(address)(uint64,uint64)\", method \"get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)\", method \"get_time_periods()(uint64,uint64)[]\", method \"asset_create(address,byte[])void\", method \"asset_config(uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void\", method \"set_secondary_time_events(uint64[])(uint64,uint64)\", method \"assign_role(address,uint8,byte[])uint64\", method \"revoke_role(address,uint8)uint64\", method \"open_account(address,address)uint64\", method \"close_account(address)(uint64,uint64)\", method \"primary_distribution(address,uint64)uint64\", method \"set_asset_suspension(bool)uint64\", method \"set_account_suspension(address,bool)uint64\", method \"set_default_status(bool)void\", method \"get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)\", method \"get_account_info(address)(address,uint64,uint64,uint64,bool)\", method \"get_time_events()uint64[]\", method \"get_secondary_market_schedule()uint64[]\", method \"get_asset_metadata()byte[]\"" + "op": "pushbytess 0x4fd6a3cc 0x8cf14b51 0x80e51e9f 0x44363d49 0x67db4f20 0xf6a96c8d 0x229b706f 0x63f99589 0xd3a4d6ab 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x80bfcdd1 0xed02759f 0xfad2173e 0x08efea35 0xddcec07b // method \"asset_transfer(address,address,uint64)uint64\", method \"pay_coupon(address,byte[])(uint64,uint64,byte[])\", method \"update_interest_rate(uint64)uint64\", method \"get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))\", method \"get_payment_amount(address)(uint64,uint64)\", method \"get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)\", method \"get_time_periods()(uint64,uint64)[]\", method \"asset_create(address,byte[])void\", method \"asset_config(uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void\", method \"set_secondary_time_events(uint64[])(uint64,uint64)\", method \"assign_role(address,uint8,byte[])uint64\", method \"revoke_role(address,uint8)uint64\", method \"open_account(address,address)uint64\", method \"close_account(address)(uint64,uint64)\", method \"primary_distribution(address,uint64)uint64\", method \"set_asset_suspension(bool)uint64\", method \"set_account_suspension(address,bool)uint64\", method \"set_default_status(bool)void\", method \"get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)\", method \"get_account_info(address)(address,uint64,uint64,uint64,bool)\", method \"get_time_events()uint64[]\", method \"get_secondary_market_schedule()uint64[]\", method \"get_asset_metadata()byte[]\"" }, "698": { "op": "txna ApplicationArgs 0" @@ -3313,7 +3313,7 @@ ] }, "1326": { - "op": "bytec 6 // 0x00", + "op": "bytec 7 // 0x00", "defined_out": [ "0x00", "is_true%0#0", @@ -3536,7 +3536,7 @@ ] }, "1342": { - "op": "bytec 6 // 0x00", + "op": "bytec 7 // 0x00", "stack_out": [ "sender_unit_value#0", "tmp%0#1", @@ -5043,7 +5043,7 @@ "op": "assert // check self.account entry exists" }, "1512": { - "op": "bytec 7 // 0x0000000000000000" + "op": "bytec 8 // 0x0000000000000000" }, "1514": { "op": "replace2 40" @@ -5068,7 +5068,7 @@ "op": "assert // check self.account entry exists" }, "1523": { - "op": "bytec 7 // 0x0000000000000000" + "op": "bytec 8 // 0x0000000000000000" }, "1525": { "op": "replace2 48" @@ -6133,7 +6133,7 @@ ] }, "1687": { - "op": "bytec 5 // \"interest_rate\"", + "op": "bytec 6 // \"interest_rate\"", "defined_out": [ "\"interest_rate\"", "0", @@ -7585,9 +7585,9 @@ ] }, "1896": { - "op": "bytec 8 // \"denomination_asset_id\"", + "op": "bytec 5 // \"settlement_asset_id\"", "defined_out": [ - "\"denomination_asset_id\"", + "\"settlement_asset_id\"", "0", "tmp%0#4", "tmp%1#3", @@ -7598,7 +7598,7 @@ "units#0", "tmp%1#3", "0", - "\"denomination_asset_id\"" + "\"settlement_asset_id\"" ] }, "1898": { @@ -7619,8 +7619,8 @@ ] }, "1899": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", "stack_out": [ "tmp%0#4", "units#0", @@ -7675,7 +7675,7 @@ "op": "getbit" }, "1914": { - "op": "bytec 6 // 0x00" + "op": "bytec 7 // 0x00" }, "1916": { "op": "intc_0 // 0" @@ -7723,7 +7723,7 @@ "op": "intc_0 // 0" }, "1935": { - "op": "bytec 5 // \"interest_rate\"" + "op": "bytec 6 // \"interest_rate\"" }, "1937": { "op": "app_global_get_ex" @@ -7751,14 +7751,14 @@ "op": "intc_0 // 0" }, "1947": { - "op": "bytec 8 // \"denomination_asset_id\"" + "op": "bytec 5 // \"settlement_asset_id\"" }, "1949": { "op": "app_global_get_ex" }, "1950": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists" + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists" }, "1951": { "op": "asset_holding_get AssetBalance" @@ -7801,7 +7801,7 @@ "op": "intc_0 // 0" }, "1969": { - "op": "bytec 19 // \"settlement_asset_id\"" + "op": "bytec 5 // \"settlement_asset_id\"" }, "1971": { "op": "app_global_get_ex" @@ -8756,7 +8756,7 @@ ] }, "2147": { - "op": "bytec 5 // \"interest_rate\"", + "op": "bytec 6 // \"interest_rate\"", "defined_out": [ "\"interest_rate\"", "new_state_value%0#0" @@ -9138,7 +9138,7 @@ ] }, "2203": { - "op": "bytec 7 // 0x0000000000000000", + "op": "bytec 8 // 0x0000000000000000", "defined_out": [ "0x0000000000000000", "tmp%0#0", @@ -10161,7 +10161,7 @@ ] }, "2369": { - "op": "bytec 5 // \"interest_rate\"", + "op": "bytec 6 // \"interest_rate\"", "defined_out": [ "\"interest_rate\"", "0", @@ -10228,7 +10228,7 @@ ] }, "2378": { - "op": "bytec 7 // 0x0000000000000000", + "op": "bytec 8 // 0x0000000000000000", "defined_out": [ "0x0000000000000000", "val_as_bytes%0#0" @@ -10909,7 +10909,7 @@ ] }, "2467": { - "op": "bytec 6 // 0x00", + "op": "bytec 7 // 0x00", "defined_out": [ "0x00", "denominator#0", @@ -11590,7 +11590,7 @@ ] }, "2574": { - "op": "bytec 8 // \"denomination_asset_id\"", + "op": "bytec 19 // \"denomination_asset_id\"", "defined_out": [ "\"denomination_asset_id\"" ], @@ -11671,7 +11671,7 @@ ] }, "2583": { - "op": "bytec 8 // \"denomination_asset_id\"", + "op": "bytec 19 // \"denomination_asset_id\"", "stack_out": [ "array_head_and_tail%0#0", "day_count_convention#1", @@ -11758,7 +11758,7 @@ ] }, "2591": { - "op": "bytec 19 // \"settlement_asset_id\"", + "op": "bytec 5 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", "denomination_asset_id#1", @@ -11822,7 +11822,7 @@ ] }, "2599": { - "op": "bytec 19 // \"settlement_asset_id\"", + "op": "bytec 5 // \"settlement_asset_id\"", "stack_out": [ "array_head_and_tail%0#0", "day_count_convention#1", @@ -12411,7 +12411,7 @@ ] }, "2671": { - "op": "bytec 5 // \"interest_rate\"", + "op": "bytec 6 // \"interest_rate\"", "defined_out": [ "\"interest_rate\"", "day_count_convention#1", @@ -17491,7 +17491,7 @@ ] }, "3529": { - "op": "bytec 7 // 0x0000000000000000", + "op": "bytec 8 // 0x0000000000000000", "defined_out": [ "0x0000000000000000", "payment_address#0 (copy)", @@ -17515,7 +17515,7 @@ ] }, "3532": { - "op": "bytec 7 // 0x0000000000000000", + "op": "bytec 8 // 0x0000000000000000", "stack_out": [ "tmp%2#0", "encoded_tuple_buffer%2#0", @@ -17534,7 +17534,7 @@ ] }, "3535": { - "op": "bytec 7 // 0x0000000000000000", + "op": "bytec 8 // 0x0000000000000000", "stack_out": [ "tmp%2#0", "encoded_tuple_buffer%3#0", @@ -17553,7 +17553,7 @@ ] }, "3538": { - "op": "bytec 6 // 0x00", + "op": "bytec 7 // 0x00", "defined_out": [ "0x00", "encoded_tuple_buffer%4#0", @@ -20159,7 +20159,7 @@ ] }, "4015": { - "op": "bytec 8 // \"denomination_asset_id\"", + "op": "bytec 19 // \"denomination_asset_id\"", "defined_out": [ "\"denomination_asset_id\"", "0" @@ -20204,19 +20204,19 @@ ] }, "4021": { - "op": "bytec_3 // \"circulating_units\"", + "op": "bytec 5 // \"settlement_asset_id\"", "defined_out": [ - "\"circulating_units\"", + "\"settlement_asset_id\"", "0", "val_as_bytes%0#0" ], "stack_out": [ "val_as_bytes%0#0", "0", - "\"circulating_units\"" + "\"settlement_asset_id\"" ] }, - "4022": { + "4023": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -20229,104 +20229,103 @@ "maybe_exists%1#0" ] }, - "4023": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", + "4024": { + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", "stack_out": [ "val_as_bytes%0#0", "maybe_value%1#0" ] }, - "4024": { + "4025": { + "op": "itob", + "defined_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ] + }, + "4026": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", - "maybe_value%1#0", + "val_as_bytes%1#0", "0" ] }, - "4025": { - "op": "bytec 11 // \"unit_value\"", + "4027": { + "op": "bytec_3 // \"circulating_units\"", "defined_out": [ - "\"unit_value\"", + "\"circulating_units\"", "0", - "maybe_value%1#0", - "val_as_bytes%0#0" + "val_as_bytes%0#0", + "val_as_bytes%1#0" ], "stack_out": [ "val_as_bytes%0#0", - "maybe_value%1#0", + "val_as_bytes%1#0", "0", - "\"unit_value\"" + "\"circulating_units\"" ] }, - "4027": { + "4028": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%2#0", - "maybe_value%1#0", "maybe_value%2#0", - "val_as_bytes%0#0" + "val_as_bytes%0#0", + "val_as_bytes%1#0" ], "stack_out": [ "val_as_bytes%0#0", - "maybe_value%1#0", + "val_as_bytes%1#0", "maybe_value%2#0", "maybe_exists%2#0" ] }, - "4028": { - "error": "check self.unit_value exists", - "op": "assert // check self.unit_value exists", - "stack_out": [ - "val_as_bytes%0#0", - "maybe_value%1#0", - "maybe_value%2#0" - ] - }, "4029": { - "op": "*", - "defined_out": [ - "to_encode%0#0", - "val_as_bytes%0#0" - ], + "error": "check self.circulating_units exists", + "op": "assert // check self.circulating_units exists", "stack_out": [ "val_as_bytes%0#0", - "to_encode%0#0" + "val_as_bytes%1#0", + "maybe_value%2#0" ] }, "4030": { - "op": "itob", - "defined_out": [ - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ], - "stack_out": [ - "val_as_bytes%0#0", - "val_as_bytes%1#0" - ] - }, - "4031": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", + "maybe_value%2#0", "0" ] }, - "4032": { + "4031": { "op": "bytec 11 // \"unit_value\"", + "defined_out": [ + "\"unit_value\"", + "0", + "maybe_value%2#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", + "maybe_value%2#0", "0", "\"unit_value\"" ] }, - "4034": { + "4033": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%3#0", + "maybe_value%2#0", "maybe_value%3#0", "val_as_bytes%0#0", "val_as_bytes%1#0" @@ -20334,19 +20333,34 @@ "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", + "maybe_value%2#0", "maybe_value%3#0", "maybe_exists%3#0" ] }, - "4035": { + "4034": { "error": "check self.unit_value exists", "op": "assert // check self.unit_value exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", + "maybe_value%2#0", "maybe_value%3#0" ] }, + "4035": { + "op": "*", + "defined_out": [ + "to_encode%0#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "to_encode%0#0" + ] + }, "4036": { "op": "itob", "defined_out": [ @@ -20370,20 +20384,13 @@ ] }, "4038": { - "op": "bytec 12 // \"day_count_convention\"", - "defined_out": [ - "\"day_count_convention\"", - "0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0" - ], + "op": "bytec 11 // \"unit_value\"", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", "0", - "\"day_count_convention\"" + "\"unit_value\"" ] }, "4040": { @@ -20404,8 +20411,8 @@ ] }, "4041": { - "error": "check self.day_count_convention exists", - "op": "assert // check self.day_count_convention exists", + "error": "check self.unit_value exists", + "op": "assert // check self.unit_value exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", @@ -20429,259 +20436,273 @@ ] }, "4043": { - "op": "extract 7 1", - "defined_out": [ - "tmp%0#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0" - ], - "stack_out": [ - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "tmp%0#0" - ] - }, - "4046": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "tmp%0#0", + "val_as_bytes%3#0", "0" ] }, - "4047": { - "op": "bytec 5 // \"interest_rate\"", + "4044": { + "op": "bytec 12 // \"day_count_convention\"", "defined_out": [ - "\"interest_rate\"", + "\"day_count_convention\"", "0", - "tmp%0#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "tmp%0#0", + "val_as_bytes%3#0", "0", - "\"interest_rate\"" + "\"day_count_convention\"" ] }, - "4049": { + "4046": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%5#0", "maybe_value%5#0", - "tmp%0#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "tmp%0#0", + "val_as_bytes%3#0", "maybe_value%5#0", "maybe_exists%5#0" ] }, - "4050": { - "error": "check self.interest_rate exists", - "op": "assert // check self.interest_rate exists", + "4047": { + "error": "check self.day_count_convention exists", + "op": "assert // check self.day_count_convention exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "tmp%0#0", + "val_as_bytes%3#0", "maybe_value%5#0" ] }, - "4051": { + "4048": { "op": "itob", "defined_out": [ - "tmp%0#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "val_as_bytes%4#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "tmp%0#0", + "val_as_bytes%3#0", "val_as_bytes%4#0" ] }, - "4052": { - "op": "extract 6 2", + "4049": { + "op": "extract 7 1", "defined_out": [ "tmp%0#0", - "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "tmp%0#0", - "tmp%1#0" + "val_as_bytes%3#0", + "tmp%0#0" ] }, - "4055": { + "4052": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "tmp%1#0", "0" ] }, - "4056": { - "op": "bytec 13 // \"total_units\"", + "4053": { + "op": "bytec 6 // \"interest_rate\"", "defined_out": [ - "\"total_units\"", + "\"interest_rate\"", "0", "tmp%0#0", - "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "tmp%1#0", "0", - "\"total_units\"" + "\"interest_rate\"" ] }, - "4058": { + "4055": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%6#0", "maybe_value%6#0", "tmp%0#0", - "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "tmp%1#0", "maybe_value%6#0", "maybe_exists%6#0" ] }, - "4059": { - "error": "check self.total_units exists", - "op": "assert // check self.total_units exists", + "4056": { + "error": "check self.interest_rate exists", + "op": "assert // check self.interest_rate exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "tmp%1#0", "maybe_value%6#0" ] }, - "4060": { + "4057": { "op": "itob", "defined_out": [ "tmp%0#0", - "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "val_as_bytes%5#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "tmp%1#0", "val_as_bytes%5#0" ] }, - "4061": { - "op": "intc_0 // 0", + "4058": { + "op": "extract 6 2", + "defined_out": [ + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "tmp%1#0", - "val_as_bytes%5#0", - "0" + "tmp%1#0" ] }, - "4062": { - "op": "bytec_3 // \"circulating_units\"", + "4061": { + "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", - "0", - "\"circulating_units\"" + "0" ] }, - "4063": { - "op": "app_global_get_ex", + "4062": { + "op": "bytec 13 // \"total_units\"", "defined_out": [ - "maybe_exists%7#0", + "\"total_units\"", + "0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%0#0", + "tmp%1#0", + "0", + "\"total_units\"" + ] + }, + "4064": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%7#0", "maybe_value%7#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0" + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "maybe_value%7#0", "maybe_exists%7#0" ] }, - "4064": { - "error": "check self.circulating_units exists", - "op": "assert // check self.circulating_units exists", + "4065": { + "error": "check self.total_units exists", + "op": "assert // check self.total_units exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "maybe_value%7#0" ] }, - "4065": { + "4066": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -20689,55 +20710,44 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0" ] }, - "4066": { + "4067": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "0" ] }, - "4067": { - "op": "bytec 10 // \"primary_distribution_opening_date\"", - "defined_out": [ - "\"primary_distribution_opening_date\"", - "0", - "tmp%0#0", - "tmp%1#0", - "val_as_bytes%0#0", - "val_as_bytes%1#0", - "val_as_bytes%2#0", - "val_as_bytes%5#0", - "val_as_bytes%6#0" - ], + "4068": { + "op": "bytec_3 // \"circulating_units\"", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "0", - "\"primary_distribution_opening_date\"" + "\"circulating_units\"" ] }, "4069": { @@ -20750,31 +20760,31 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "maybe_value%8#0", "maybe_exists%8#0" ] }, "4070": { - "error": "check self.primary_distribution_opening_date exists", - "op": "assert // check self.primary_distribution_opening_date exists", + "error": "check self.circulating_units exists", + "op": "assert // check self.circulating_units exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "maybe_value%8#0" ] @@ -20787,7 +20797,7 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0" ], @@ -20795,9 +20805,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0" ] @@ -20808,25 +20818,25 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "0" ] }, "4073": { - "op": "bytec 20 // \"primary_distribution_closure_date\"", + "op": "bytec 10 // \"primary_distribution_opening_date\"", "defined_out": [ - "\"primary_distribution_closure_date\"", + "\"primary_distribution_opening_date\"", "0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0" ], @@ -20834,13 +20844,13 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "0", - "\"primary_distribution_closure_date\"" + "\"primary_distribution_opening_date\"" ] }, "4075": { @@ -20853,7 +20863,7 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0" ], @@ -20861,9 +20871,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "maybe_value%9#0", @@ -20871,15 +20881,15 @@ ] }, "4076": { - "error": "check self.primary_distribution_closure_date exists", - "op": "assert // check self.primary_distribution_closure_date exists", + "error": "check self.primary_distribution_opening_date exists", + "op": "assert // check self.primary_distribution_opening_date exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "maybe_value%9#0" @@ -20893,7 +20903,7 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0" @@ -20902,9 +20912,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0" @@ -20916,9 +20926,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -20926,16 +20936,16 @@ ] }, "4079": { - "op": "bytec 4 // \"issuance_date\"", + "op": "bytec 20 // \"primary_distribution_closure_date\"", "defined_out": [ - "\"issuance_date\"", + "\"primary_distribution_closure_date\"", "0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0" @@ -20944,14 +20954,14 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "0", - "\"issuance_date\"" + "\"primary_distribution_closure_date\"" ] }, "4081": { @@ -20964,7 +20974,7 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0" @@ -20973,9 +20983,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -20984,15 +20994,15 @@ ] }, "4082": { - "error": "check self.issuance_date exists", - "op": "assert // check self.issuance_date exists", + "error": "check self.primary_distribution_closure_date exists", + "op": "assert // check self.primary_distribution_closure_date exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21007,7 +21017,7 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21017,9 +21027,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21032,9 +21042,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21043,16 +21053,16 @@ ] }, "4085": { - "op": "bytec 16 // \"maturity_date\"", + "op": "bytec 4 // \"issuance_date\"", "defined_out": [ - "\"maturity_date\"", + "\"issuance_date\"", "0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21062,15 +21072,15 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "0", - "\"maturity_date\"" + "\"issuance_date\"" ] }, "4087": { @@ -21083,7 +21093,7 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21093,9 +21103,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21105,15 +21115,15 @@ ] }, "4088": { - "error": "check self.maturity_date exists", - "op": "assert // check self.maturity_date exists", + "error": "check self.issuance_date exists", + "op": "assert // check self.issuance_date exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21130,7 +21140,7 @@ "val_as_bytes%1#0", "val_as_bytes%10#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21140,9 +21150,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21156,9 +21166,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21168,9 +21178,9 @@ ] }, "4091": { - "op": "bytec 21 // \"suspended\"", + "op": "bytec 16 // \"maturity_date\"", "defined_out": [ - "\"suspended\"", + "\"maturity_date\"", "0", "tmp%0#0", "tmp%1#0", @@ -21178,7 +21188,7 @@ "val_as_bytes%1#0", "val_as_bytes%10#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21188,16 +21198,16 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", "0", - "\"suspended\"" + "\"maturity_date\"" ] }, "4093": { @@ -21211,7 +21221,7 @@ "val_as_bytes%1#0", "val_as_bytes%10#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21221,9 +21231,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21234,35 +21244,174 @@ ] }, "4094": { + "error": "check self.maturity_date exists", + "op": "assert // check self.maturity_date exists", + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "maybe_value%12#0" + ] + }, + "4095": { + "op": "itob", + "defined_out": [ + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0" + ] + }, + "4096": { + "op": "intc_0 // 0", + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "0" + ] + }, + "4097": { + "op": "bytec 21 // \"suspended\"", + "defined_out": [ + "\"suspended\"", + "0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "0", + "\"suspended\"" + ] + }, + "4099": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%13#0", + "maybe_value%13#0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "val_as_bytes%2#0", + "val_as_bytes%3#0", + "tmp%0#0", + "tmp%1#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0", + "val_as_bytes%8#0", + "val_as_bytes%9#0", + "val_as_bytes%10#0", + "val_as_bytes%11#0", + "maybe_value%13#0", + "maybe_exists%13#0" + ] + }, + "4100": { "error": "check self.suspended exists", "op": "assert // check self.suspended exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", - "maybe_value%12#0" + "val_as_bytes%11#0", + "maybe_value%13#0" ] }, - "4095": { - "op": "bytec 6 // 0x00", + "4101": { + "op": "bytec 7 // 0x00", "defined_out": [ "0x00", - "maybe_value%12#0", + "maybe_value%13#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21272,57 +21421,60 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", - "maybe_value%12#0", + "val_as_bytes%11#0", + "maybe_value%13#0", "0x00" ] }, - "4097": { + "4103": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", - "maybe_value%12#0", + "val_as_bytes%11#0", + "maybe_value%13#0", "0x00", "0" ] }, - "4098": { + "4104": { "op": "uncover 2", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "0x00", "0", - "maybe_value%12#0" + "maybe_value%13#0" ] }, - "4100": { + "4106": { "op": "setbit", "defined_out": [ "encoded_bool%0#0", @@ -21331,8 +21483,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21342,36 +21495,38 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0" ] }, - "4101": { + "4107": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "0" ] }, - "4102": { + "4108": { "op": "bytec 22 // \"defaulted\"", "defined_out": [ "\"defaulted\"", @@ -21382,8 +21537,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21393,32 +21549,34 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "0", "\"defaulted\"" ] }, - "4104": { + "4110": { "op": "app_global_get_ex", "defined_out": [ "encoded_bool%0#0", - "maybe_exists%13#0", - "maybe_value%13#0", + "maybe_exists%14#0", + "maybe_value%14#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21428,98 +21586,103 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", - "maybe_value%13#0", - "maybe_exists%13#0" + "maybe_value%14#0", + "maybe_exists%14#0" ] }, - "4105": { + "4111": { "error": "check self.defaulted exists", "op": "assert // check self.defaulted exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", - "maybe_value%13#0" + "maybe_value%14#0" ] }, - "4106": { - "op": "bytec 6 // 0x00", + "4112": { + "op": "bytec 7 // 0x00", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", - "maybe_value%13#0", + "maybe_value%14#0", "0x00" ] }, - "4108": { + "4114": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", - "maybe_value%13#0", + "maybe_value%14#0", "0x00", "0" ] }, - "4109": { + "4115": { "op": "uncover 2", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "0x00", "0", - "maybe_value%13#0" + "maybe_value%14#0" ] }, - "4111": { + "4117": { "op": "setbit", "defined_out": [ "encoded_bool%0#0", @@ -21529,8 +21692,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21540,40 +21704,42 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0" ] }, - "4112": { - "op": "uncover 12" + "4118": { + "op": "uncover 13" }, - "4114": { - "op": "uncover 12", + "4120": { + "op": "uncover 13", "stack_out": [ "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0" ] }, - "4116": { + "4122": { "op": "concat", "defined_out": [ "encoded_bool%0#0", @@ -21582,8 +21748,9 @@ "tmp%0#0", "tmp%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21591,37 +21758,39 @@ ], "stack_out": [ "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%2#0" ] }, - "4117": { - "op": "uncover 11", + "4123": { + "op": "uncover 12", "stack_out": [ + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%2#0", "val_as_bytes%2#0" ] }, - "4119": { + "4125": { "op": "concat", "defined_out": [ "encoded_bool%0#0", @@ -21630,130 +21799,140 @@ "tmp%0#0", "tmp%1#0", "val_as_bytes%10#0", - "val_as_bytes%5#0", + "val_as_bytes%11#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0" ], "stack_out": [ + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%3#0" ] }, - "4120": { - "op": "uncover 10", + "4126": { + "op": "uncover 11", "stack_out": [ + "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%3#0", - "tmp%0#0" + "val_as_bytes%3#0" ] }, - "4122": { + "4128": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%4#0", + "tmp%0#0", "tmp%1#0", "val_as_bytes%10#0", - "val_as_bytes%5#0", + "val_as_bytes%11#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0" ], "stack_out": [ + "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%4#0" ] }, - "4123": { - "op": "uncover 9", + "4129": { + "op": "uncover 10", "stack_out": [ - "val_as_bytes%5#0", + "tmp%1#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%4#0", - "tmp%1#0" + "tmp%0#0" ] }, - "4125": { + "4131": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%5#0", + "tmp%1#0", "val_as_bytes%10#0", - "val_as_bytes%5#0", + "val_as_bytes%11#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0" ], "stack_out": [ - "val_as_bytes%5#0", + "tmp%1#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%5#0" ] }, - "4126": { - "op": "uncover 8", + "4132": { + "op": "uncover 9", "stack_out": [ "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%5#0", - "val_as_bytes%5#0" + "tmp%1#0" ] }, - "4128": { + "4134": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%6#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -21765,31 +21944,34 @@ "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%6#0" ] }, - "4129": { - "op": "uncover 7", + "4135": { + "op": "uncover 8", "stack_out": [ "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%6#0", "val_as_bytes%6#0" ] }, - "4131": { + "4137": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%7#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0" @@ -21799,30 +21981,33 @@ "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%7#0" ] }, - "4132": { - "op": "uncover 6", + "4138": { + "op": "uncover 7", "stack_out": [ "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%7#0", "val_as_bytes%7#0" ] }, - "4134": { + "4140": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%8#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%8#0", "val_as_bytes%9#0" ], @@ -21830,161 +22015,193 @@ "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%8#0" ] }, - "4135": { - "op": "uncover 5", + "4141": { + "op": "uncover 6", "stack_out": [ "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%8#0", "val_as_bytes%8#0" ] }, - "4137": { + "4143": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%9#0" ], "stack_out": [ "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%9#0" ] }, - "4138": { - "op": "uncover 4", + "4144": { + "op": "uncover 5", "stack_out": [ "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%9#0", "val_as_bytes%9#0" ] }, - "4140": { + "4146": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%10#0", - "val_as_bytes%10#0" + "val_as_bytes%10#0", + "val_as_bytes%11#0" ], "stack_out": [ "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%10#0" ] }, - "4141": { - "op": "uncover 3", + "4147": { + "op": "uncover 4", "stack_out": [ + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%10#0", "val_as_bytes%10#0" ] }, - "4143": { + "4149": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", - "encoded_tuple_buffer%11#0" + "encoded_tuple_buffer%11#0", + "val_as_bytes%11#0" ], "stack_out": [ + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%11#0" ] }, - "4144": { - "op": "uncover 2", + "4150": { + "op": "uncover 3", "stack_out": [ + "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%11#0", - "encoded_bool%0#0" + "val_as_bytes%11#0" ] }, - "4146": { + "4152": { "op": "concat", "defined_out": [ + "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%12#0" ], "stack_out": [ + "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%12#0" ] }, - "4147": { - "op": "swap", + "4153": { + "op": "uncover 2", "stack_out": [ + "encoded_bool%1#0", "encoded_tuple_buffer%12#0", + "encoded_bool%0#0" + ] + }, + "4155": { + "op": "concat", + "defined_out": [ + "encoded_bool%1#0", + "encoded_tuple_buffer%13#0" + ], + "stack_out": [ + "encoded_bool%1#0", + "encoded_tuple_buffer%13#0" + ] + }, + "4156": { + "op": "swap", + "stack_out": [ + "encoded_tuple_buffer%13#0", "encoded_bool%1#0" ] }, - "4148": { + "4157": { "op": "intc_0 // 0", "stack_out": [ - "encoded_tuple_buffer%12#0", + "encoded_tuple_buffer%13#0", "encoded_bool%1#0", "0" ] }, - "4149": { + "4158": { "op": "getbit", "defined_out": [ - "encoded_tuple_buffer%12#0", + "encoded_tuple_buffer%13#0", "is_true%0#0" ], "stack_out": [ - "encoded_tuple_buffer%12#0", + "encoded_tuple_buffer%13#0", "is_true%0#0" ] }, - "4150": { - "op": "pushint 601 // 601" + "4159": { + "op": "pushint 665 // 665" }, - "4153": { + "4162": { "op": "swap", "defined_out": [ - "601", - "encoded_tuple_buffer%12#0", + "665", + "encoded_tuple_buffer%13#0", "is_true%0#0" ], "stack_out": [ - "encoded_tuple_buffer%12#0", - "601", + "encoded_tuple_buffer%13#0", + "665", "is_true%0#0" ] }, - "4154": { + "4163": { "op": "setbit", "defined_out": [ - "encoded_tuple_buffer%13#0" + "encoded_tuple_buffer%14#0" ], "stack_out": [ - "encoded_tuple_buffer%13#0" + "encoded_tuple_buffer%14#0" ] }, - "4155": { + "4164": { "retsub": true, "op": "retsub" }, - "4156": { + "4165": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_account_info", "params": { "holding_address#0": "bytes" @@ -21993,7 +22210,7 @@ "stack_in": [], "op": "proto 1 1" }, - "4159": { + "4168": { "op": "bytec_1 // 0x52333023", "defined_out": [ "0x52333023" @@ -22002,7 +22219,7 @@ "0x52333023" ] }, - "4160": { + "4169": { "op": "frame_dig -1", "defined_out": [ "0x52333023", @@ -22013,7 +22230,7 @@ "holding_address#0 (copy)" ] }, - "4162": { + "4171": { "op": "concat", "defined_out": [ "tmp%0#1" @@ -22022,7 +22239,7 @@ "tmp%0#1" ] }, - "4163": { + "4172": { "op": "dup", "defined_out": [ "tmp%0#1", @@ -22033,7 +22250,7 @@ "tmp%0#1 (copy)" ] }, - "4164": { + "4173": { "op": "box_len", "defined_out": [ "maybe_exists%0#0", @@ -22046,21 +22263,21 @@ "maybe_exists%0#0" ] }, - "4165": { + "4174": { "op": "bury 1", "stack_out": [ "tmp%0#1", "maybe_exists%0#0" ] }, - "4167": { + "4176": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ "tmp%0#1" ] }, - "4168": { + "4177": { "op": "box_get", "defined_out": [ "maybe_exists%0#0", @@ -22071,31 +22288,31 @@ "maybe_exists%0#0" ] }, - "4169": { + "4178": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ "maybe_value%0#0" ] }, - "4170": { + "4179": { "retsub": true, "op": "retsub" }, - "4171": { + "4180": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_time_events", "params": {}, "block": "get_time_events", "stack_in": [], "op": "proto 0 1" }, - "4174": { + "4183": { "op": "bytec 32 // 0x0000" }, - "4176": { + "4185": { "op": "intc_0 // 0" }, - "4177": { + "4186": { "op": "bytec_2 // \"status\"", "defined_out": [ "\"status\"", @@ -22108,7 +22325,7 @@ "\"status\"" ] }, - "4178": { + "4187": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -22121,7 +22338,7 @@ "maybe_exists%0#0" ] }, - "4179": { + "4188": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -22129,7 +22346,7 @@ "maybe_value%0#0" ] }, - "4180": { + "4189": { "op": "intc_2 // 100", "defined_out": [ "100", @@ -22142,7 +22359,7 @@ "100" ] }, - "4181": { + "4190": { "op": "==", "defined_out": [ "time_events#0", @@ -22153,29 +22370,29 @@ "tmp%0#1" ] }, - "4182": { + "4191": { "op": "bz get_time_events_after_if_else@2", "stack_out": [ "time_events#0" ] }, - "4185": { + "4194": { "op": "bytec 27 // 0x74696d654576656e7473" }, - "4187": { + "4196": { "op": "box_get" }, - "4188": { + "4197": { "op": "swap" }, - "4189": { + "4198": { "op": "frame_bury 0" }, - "4191": { + "4200": { "error": "check self.time_events exists", "op": "assert // check self.time_events exists" }, - "4192": { + "4201": { "block": "get_time_events_after_if_else@2", "stack_in": [ "time_events#0" @@ -22189,21 +22406,21 @@ "time_events#0" ] }, - "4194": { + "4203": { "op": "swap" }, - "4195": { + "4204": { "retsub": true, "op": "retsub" }, - "4196": { + "4205": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_secondary_market_schedule", "params": {}, "block": "get_secondary_market_schedule", "stack_in": [], "op": "proto 0 1" }, - "4199": { + "4208": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -22212,7 +22429,7 @@ "0" ] }, - "4200": { + "4209": { "op": "bytec 14 // \"secondary_market_opening_date\"", "defined_out": [ "\"secondary_market_opening_date\"", @@ -22223,7 +22440,7 @@ "\"secondary_market_opening_date\"" ] }, - "4202": { + "4211": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -22234,14 +22451,14 @@ "maybe_exists%0#0" ] }, - "4203": { + "4212": { "error": "check self.secondary_market_opening_date exists", "op": "assert // check self.secondary_market_opening_date exists", "stack_out": [ "maybe_value%0#0" ] }, - "4204": { + "4213": { "op": "itob", "defined_out": [ "val_as_bytes%0#0" @@ -22250,14 +22467,14 @@ "val_as_bytes%0#0" ] }, - "4205": { + "4214": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "0" ] }, - "4206": { + "4215": { "op": "bytec 15 // \"secondary_market_closure_date\"", "defined_out": [ "\"secondary_market_closure_date\"", @@ -22270,7 +22487,7 @@ "\"secondary_market_closure_date\"" ] }, - "4208": { + "4217": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -22283,7 +22500,7 @@ "maybe_exists%1#0" ] }, - "4209": { + "4218": { "error": "check self.secondary_market_closure_date exists", "op": "assert // check self.secondary_market_closure_date exists", "stack_out": [ @@ -22291,7 +22508,7 @@ "maybe_value%1#0" ] }, - "4210": { + "4219": { "op": "itob", "defined_out": [ "val_as_bytes%0#0", @@ -22302,7 +22519,7 @@ "val_as_bytes%1#0" ] }, - "4211": { + "4220": { "op": "concat", "defined_out": [ "result%1#0" @@ -22311,7 +22528,7 @@ "result%1#0" ] }, - "4212": { + "4221": { "op": "pushbytes 0x0002", "defined_out": [ "0x0002", @@ -22322,14 +22539,14 @@ "0x0002" ] }, - "4216": { + "4225": { "op": "swap", "stack_out": [ "0x0002", "result%1#0" ] }, - "4217": { + "4226": { "op": "concat", "defined_out": [ "array_data%0#0" @@ -22338,18 +22555,18 @@ "array_data%0#0" ] }, - "4218": { + "4227": { "retsub": true, "op": "retsub" }, - "4219": { + "4228": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_metadata", "params": {}, "block": "get_asset_metadata", "stack_in": [], "op": "proto 0 1" }, - "4222": { + "4231": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -22358,7 +22575,7 @@ "0" ] }, - "4223": { + "4232": { "op": "bytec 25 // \"metadata\"", "defined_out": [ "\"metadata\"", @@ -22369,7 +22586,7 @@ "\"metadata\"" ] }, - "4225": { + "4234": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -22380,14 +22597,14 @@ "maybe_exists%0#0" ] }, - "4226": { + "4235": { "error": "check self.metadata exists", "op": "assert // check self.metadata exists", "stack_out": [ "maybe_value%0#0" ] }, - "4227": { + "4236": { "op": "dup", "defined_out": [ "maybe_value%0#0", @@ -22398,7 +22615,7 @@ "maybe_value%0#0 (copy)" ] }, - "4228": { + "4237": { "op": "len", "defined_out": [ "length%0#0", @@ -22409,7 +22626,7 @@ "length%0#0" ] }, - "4229": { + "4238": { "op": "itob", "defined_out": [ "as_bytes%0#0", @@ -22420,7 +22637,7 @@ "as_bytes%0#0" ] }, - "4230": { + "4239": { "op": "extract 6 2", "defined_out": [ "length_uint16%0#0", @@ -22431,14 +22648,14 @@ "length_uint16%0#0" ] }, - "4233": { + "4242": { "op": "swap", "stack_out": [ "length_uint16%0#0", "maybe_value%0#0" ] }, - "4234": { + "4243": { "op": "concat", "defined_out": [ "encoded_value%0#0" @@ -22447,22 +22664,22 @@ "encoded_value%0#0" ] }, - "4235": { + "4244": { "retsub": true, "op": "retsub" }, - "4236": { + "4245": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.asset_update", "params": {}, "block": "asset_update", "stack_in": [], "op": "proto 0 0" }, - "4239": { + "4248": { "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger", "op": "callsub assert_caller_is_arranger" }, - "4242": { + "4251": { "retsub": true, "op": "retsub" } diff --git a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.teal b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.teal index d35923b..ab9e539 100644 --- a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.teal +++ b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.approval.teal @@ -4,7 +4,7 @@ // smart_contracts.perpetual_bond.contract.PerpetualBond.__algopy_entrypoint_with_init() -> uint64: main: intcblock 0 1 100 8 448 10000 86400 200 - bytecblock 0x151f7c75 0x52333023 "status" "circulating_units" "issuance_date" "interest_rate" 0x00 0x0000000000000000 "denomination_asset_id" "total_coupons" "primary_distribution_opening_date" "unit_value" "day_count_convention" "total_units" "secondary_market_opening_date" "secondary_market_closure_date" "maturity_date" "coupon_period" 0x52323023 "settlement_asset_id" "primary_distribution_closure_date" "suspended" "defaulted" "paid_coupon_units" 0x74696d65506572696f6473 "metadata" 0x52383023 0x74696d654576656e7473 0x52373023 0x52363023 0x52353023 0x52343023 0x0000 0x636f75706f6e5261746573 0x068101 + bytecblock 0x151f7c75 0x52333023 "status" "circulating_units" "issuance_date" "settlement_asset_id" "interest_rate" 0x00 0x0000000000000000 "total_coupons" "primary_distribution_opening_date" "unit_value" "day_count_convention" "total_units" "secondary_market_opening_date" "secondary_market_closure_date" "maturity_date" "coupon_period" 0x52323023 "denomination_asset_id" "primary_distribution_closure_date" "suspended" "defaulted" "paid_coupon_units" 0x74696d65506572696f6473 "metadata" 0x52383023 0x74696d654576656e7473 0x52373023 0x52363023 0x52353023 0x52343023 0x0000 0x636f75706f6e5261746573 0x068101 txn ApplicationID bnz main_after_if_else@2 // smart_contracts/base_d_asa/contract.py:41-42 @@ -16,12 +16,12 @@ main: // smart_contracts/base_d_asa/contract.py:59-60 // # Asset Configuration // self.denomination_asset_id = UInt64() - bytec 8 // "denomination_asset_id" + bytec 19 // "denomination_asset_id" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:61 // self.settlement_asset_id = UInt64() - bytec 19 // "settlement_asset_id" + bytec 5 // "settlement_asset_id" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:62 @@ -54,7 +54,7 @@ main: // smart_contracts/base_d_asa/contract.py:72-73 // # Interest // self.interest_rate = UInt64() - bytec 5 // "interest_rate" + bytec 6 // "interest_rate" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:77 @@ -156,7 +156,7 @@ main_after_if_else@2: // ): txn NumAppArgs bz main_bare_routing@28 - pushbytess 0x4fd6a3cc 0x8cf14b51 0x80e51e9f 0x44363d49 0x67db4f20 0xf6a96c8d 0x229b706f 0x63f99589 0xd3a4d6ab 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x301dd919 0xed02759f 0xfad2173e 0x08efea35 0xddcec07b // method "asset_transfer(address,address,uint64)uint64", method "pay_coupon(address,byte[])(uint64,uint64,byte[])", method "update_interest_rate(uint64)uint64", method "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", method "get_payment_amount(address)(uint64,uint64)", method "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", method "get_time_periods()(uint64,uint64)[]", method "asset_create(address,byte[])void", method "asset_config(uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", method "set_secondary_time_events(uint64[])(uint64,uint64)", method "assign_role(address,uint8,byte[])uint64", method "revoke_role(address,uint8)uint64", method "open_account(address,address)uint64", method "close_account(address)(uint64,uint64)", method "primary_distribution(address,uint64)uint64", method "set_asset_suspension(bool)uint64", method "set_account_suspension(address,bool)uint64", method "set_default_status(bool)void", method "get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", method "get_account_info(address)(address,uint64,uint64,uint64,bool)", method "get_time_events()uint64[]", method "get_secondary_market_schedule()uint64[]", method "get_asset_metadata()byte[]" + pushbytess 0x4fd6a3cc 0x8cf14b51 0x80e51e9f 0x44363d49 0x67db4f20 0xf6a96c8d 0x229b706f 0x63f99589 0xd3a4d6ab 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x80bfcdd1 0xed02759f 0xfad2173e 0x08efea35 0xddcec07b // method "asset_transfer(address,address,uint64)uint64", method "pay_coupon(address,byte[])(uint64,uint64,byte[])", method "update_interest_rate(uint64)uint64", method "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", method "get_payment_amount(address)(uint64,uint64)", method "get_coupons_status()(uint64,uint64,uint64,(uint64,uint64),bool)", method "get_time_periods()(uint64,uint64)[]", method "asset_create(address,byte[])void", method "asset_config(uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", method "set_secondary_time_events(uint64[])(uint64,uint64)", method "assign_role(address,uint8,byte[])uint64", method "revoke_role(address,uint8)uint64", method "open_account(address,address)uint64", method "close_account(address)(uint64,uint64)", method "primary_distribution(address,uint64)uint64", method "set_asset_suspension(bool)uint64", method "set_account_suspension(address,bool)uint64", method "set_default_status(bool)void", method "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", method "get_account_info(address)(address,uint64,uint64,uint64,bool)", method "get_time_events()uint64[]", method "get_secondary_market_schedule()uint64[]", method "get_asset_metadata()byte[]" txna ApplicationArgs 0 match main_asset_transfer_route@5 main_pay_coupon_route@6 main_update_interest_rate_route@7 main_get_account_units_current_value_route@8 main_get_payment_amount_route@9 main_get_coupons_status_route@10 main_get_time_periods_route@11 main_asset_create_route@12 main_asset_config_route@13 main_set_secondary_time_events_route@14 main_assign_role_route@15 main_revoke_role_route@16 main_open_account_route@17 main_close_account_route@18 main_primary_distribution_route@19 main_set_asset_suspension_route@20 main_set_account_suspension_route@21 main_set_default_status_route@22 main_get_asset_info_route@23 main_get_account_info_route@24 main_get_time_events_route@25 main_get_secondary_market_schedule_route@26 main_get_asset_metadata_route@27 @@ -175,7 +175,7 @@ main_after_if_else@30: return main_get_asset_metadata_route@27: - // smart_contracts/base_d_asa/contract.py:954 + // smart_contracts/base_d_asa/contract.py:959 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -191,7 +191,7 @@ main_get_asset_metadata_route@27: return main_get_secondary_market_schedule_route@26: - // smart_contracts/base_d_asa/contract.py:947 + // smart_contracts/base_d_asa/contract.py:946 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -207,7 +207,7 @@ main_get_secondary_market_schedule_route@26: return main_get_time_events_route@25: - // smart_contracts/base_d_asa/contract.py:934 + // smart_contracts/base_d_asa/contract.py:933 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -223,7 +223,7 @@ main_get_time_events_route@25: return main_get_account_info_route@24: - // smart_contracts/base_d_asa/contract.py:917 + // smart_contracts/base_d_asa/contract.py:916 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -241,7 +241,7 @@ main_get_account_info_route@24: // ), // ): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:917 + // smart_contracts/base_d_asa/contract.py:916 // @arc4.abimethod(readonly=True) callsub get_account_info bytec_0 // 0x151f7c75 @@ -252,7 +252,7 @@ main_get_account_info_route@24: return main_get_asset_info_route@23: - // smart_contracts/base_d_asa/contract.py:887 + // smart_contracts/base_d_asa/contract.py:885 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -268,7 +268,7 @@ main_get_asset_info_route@23: return main_set_default_status_route@22: - // smart_contracts/base_d_asa/contract.py:873 + // smart_contracts/base_d_asa/contract.py:871 // @arc4.abimethod txn OnCompletion ! @@ -286,14 +286,14 @@ main_set_default_status_route@22: // ), // ): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:873 + // smart_contracts/base_d_asa/contract.py:871 // @arc4.abimethod callsub set_default_status intc_1 // 1 return main_set_account_suspension_route@21: - // smart_contracts/base_d_asa/contract.py:850 + // smart_contracts/base_d_asa/contract.py:848 // @arc4.abimethod txn OnCompletion ! @@ -312,7 +312,7 @@ main_set_account_suspension_route@21: // ): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:850 + // smart_contracts/base_d_asa/contract.py:848 // @arc4.abimethod callsub set_account_suspension bytec_0 // 0x151f7c75 @@ -323,7 +323,7 @@ main_set_account_suspension_route@21: return main_set_asset_suspension_route@20: - // smart_contracts/base_d_asa/contract.py:832 + // smart_contracts/base_d_asa/contract.py:830 // @arc4.abimethod txn OnCompletion ! @@ -341,7 +341,7 @@ main_set_asset_suspension_route@20: // ), // ): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:832 + // smart_contracts/base_d_asa/contract.py:830 // @arc4.abimethod callsub set_asset_suspension bytec_0 // 0x151f7c75 @@ -352,7 +352,7 @@ main_set_asset_suspension_route@20: return main_primary_distribution_route@19: - // smart_contracts/base_d_asa/contract.py:790 + // smart_contracts/base_d_asa/contract.py:788 // @arc4.abimethod txn OnCompletion ! @@ -371,7 +371,7 @@ main_primary_distribution_route@19: // ): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:790 + // smart_contracts/base_d_asa/contract.py:788 // @arc4.abimethod callsub primary_distribution bytec_0 // 0x151f7c75 @@ -382,7 +382,7 @@ main_primary_distribution_route@19: return main_close_account_route@18: - // smart_contracts/base_d_asa/contract.py:760 + // smart_contracts/base_d_asa/contract.py:758 // @arc4.abimethod txn OnCompletion ! @@ -400,7 +400,7 @@ main_close_account_route@18: // ), // ): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:760 + // smart_contracts/base_d_asa/contract.py:758 // @arc4.abimethod callsub close_account bytec_0 // 0x151f7c75 @@ -411,7 +411,7 @@ main_close_account_route@18: return main_open_account_route@17: - // smart_contracts/base_d_asa/contract.py:725 + // smart_contracts/base_d_asa/contract.py:723 // @arc4.abimethod txn OnCompletion ! @@ -430,7 +430,7 @@ main_open_account_route@17: // ): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:725 + // smart_contracts/base_d_asa/contract.py:723 // @arc4.abimethod callsub open_account bytec_0 // 0x151f7c75 @@ -441,7 +441,7 @@ main_open_account_route@17: return main_revoke_role_route@16: - // smart_contracts/base_d_asa/contract.py:677 + // smart_contracts/base_d_asa/contract.py:675 // @arc4.abimethod txn OnCompletion ! @@ -460,7 +460,7 @@ main_revoke_role_route@16: // ): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:677 + // smart_contracts/base_d_asa/contract.py:675 // @arc4.abimethod callsub revoke_role bytec_0 // 0x151f7c75 @@ -471,7 +471,7 @@ main_revoke_role_route@16: return main_assign_role_route@15: - // smart_contracts/base_d_asa/contract.py:614 + // smart_contracts/base_d_asa/contract.py:612 // @arc4.abimethod txn OnCompletion ! @@ -491,7 +491,7 @@ main_assign_role_route@15: txna ApplicationArgs 1 txna ApplicationArgs 2 txna ApplicationArgs 3 - // smart_contracts/base_d_asa/contract.py:614 + // smart_contracts/base_d_asa/contract.py:612 // @arc4.abimethod callsub assign_role bytec_0 // 0x151f7c75 @@ -502,7 +502,7 @@ main_assign_role_route@15: return main_set_secondary_time_events_route@14: - // smart_contracts/base_d_asa/contract.py:558 + // smart_contracts/base_d_asa/contract.py:556 // @arc4.abimethod txn OnCompletion ! @@ -520,7 +520,7 @@ main_set_secondary_time_events_route@14: // ), // ): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:558 + // smart_contracts/base_d_asa/contract.py:556 // @arc4.abimethod callsub set_secondary_time_events bytec_0 // 0x151f7c75 @@ -531,7 +531,7 @@ main_set_secondary_time_events_route@14: return main_asset_config_route@13: - // smart_contracts/base_d_asa/contract.py:476 + // smart_contracts/base_d_asa/contract.py:474 // @arc4.abimethod txn OnCompletion ! @@ -557,14 +557,14 @@ main_asset_config_route@13: txna ApplicationArgs 7 txna ApplicationArgs 8 txna ApplicationArgs 9 - // smart_contracts/base_d_asa/contract.py:476 + // smart_contracts/base_d_asa/contract.py:474 // @arc4.abimethod callsub asset_config intc_1 // 1 return main_asset_create_route@12: - // smart_contracts/base_d_asa/contract.py:454 + // smart_contracts/base_d_asa/contract.py:452 // @arc4.abimethod(create="require") txn OnCompletion ! @@ -584,7 +584,7 @@ main_asset_create_route@12: // ): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:454 + // smart_contracts/base_d_asa/contract.py:452 // @arc4.abimethod(create="require") callsub asset_create intc_1 // 1 @@ -788,11 +788,11 @@ main_bare_routing@28: b main_after_if_else@30 main_asset_update@29: - // smart_contracts/base_d_asa/contract.py:466 + // smart_contracts/base_d_asa/contract.py:464 // @arc4.baremethod(allow_actions=["UpdateApplication"]) txn ApplicationID assert // can only call when not creating - // smart_contracts/base_d_asa/contract.py:466-467 + // smart_contracts/base_d_asa/contract.py:464-465 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def asset_update(self) -> None: callsub asset_update @@ -880,7 +880,7 @@ asset_transfer_bool_merge@6: // < self.secondary_market_closure_date // ), err.SECONDARY_MARKET_CLOSED assert // Secondary market is closed - // smart_contracts/base_d_asa/contract.py:369-371 + // smart_contracts/base_d_asa/contract.py:367-369 // # The reference implementation grants transfer right to D-ASA owners. Other implementations may relay on other // # roles, external Apps through C2C calls (e.g., an order book), or off-chain transfer agents. // assert Txn.sender == sender_holding_address.native, err.UNAUTHORIZED @@ -888,10 +888,10 @@ asset_transfer_bool_merge@6: frame_dig -3 == assert // Not authorized - // smart_contracts/base_d_asa/contract.py:372 + // smart_contracts/base_d_asa/contract.py:370 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:373 + // smart_contracts/base_d_asa/contract.py:371 // self.assert_is_not_suspended() callsub assert_is_not_suspended // smart_contracts/base_d_asa/contract.py:171 @@ -914,14 +914,14 @@ asset_transfer_bool_merge@6: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:376 + // smart_contracts/base_d_asa/contract.py:374 // assert not self.account[sender_holding_address].suspended.native, err.SUSPENDED dig 1 box_get assert // check self.account entry exists intc 4 // 448 getbit - bytec 6 // 0x00 + bytec 7 // 0x00 intc_0 // 0 uncover 2 setbit @@ -929,7 +929,7 @@ asset_transfer_bool_merge@6: getbit ! assert // Suspended operations - // smart_contracts/base_d_asa/contract.py:377-379 + // smart_contracts/base_d_asa/contract.py:375-377 // assert not self.account[ // receiver_holding_address // ].suspended.native, err.SUSPENDED @@ -938,7 +938,7 @@ asset_transfer_bool_merge@6: assert // check self.account entry exists intc 4 // 448 getbit - bytec 6 // 0x00 + bytec 7 // 0x00 intc_0 // 0 uncover 2 setbit @@ -946,7 +946,7 @@ asset_transfer_bool_merge@6: getbit ! assert // Suspended operations - // smart_contracts/base_d_asa/contract.py:381 + // smart_contracts/base_d_asa/contract.py:379 // units <= self.account[sender_holding_address].units.native dig 1 box_get @@ -955,19 +955,19 @@ asset_transfer_bool_merge@6: btoi frame_dig 5 >= - // smart_contracts/base_d_asa/contract.py:380-382 + // smart_contracts/base_d_asa/contract.py:378-380 // assert ( // units <= self.account[sender_holding_address].units.native // ), err.OVER_TRANSFER assert // Insufficient sender units to transfer - // smart_contracts/base_d_asa/contract.py:390 + // smart_contracts/base_d_asa/contract.py:388 // sender_unit_value = self.account[sender_holding_address].unit_value swap box_get assert // check self.account entry exists extract 40 8 // on error: Index access is out of bounds frame_bury 0 - // smart_contracts/base_d_asa/contract.py:391 + // smart_contracts/base_d_asa/contract.py:389 // if self.account[receiver_holding_address].units.native > 0: box_get assert // check self.account entry exists @@ -1045,7 +1045,7 @@ asset_transfer_after_if_else@17: uncover 2 callsub accrued_interest_amount frame_bury 3 - // smart_contracts/base_d_asa/contract.py:427 + // smart_contracts/base_d_asa/contract.py:425 // self.account[sender_holding_address].units.native - units dup box_get @@ -1054,17 +1054,17 @@ asset_transfer_after_if_else@17: btoi dig 2 - - // smart_contracts/base_d_asa/contract.py:426-428 + // smart_contracts/base_d_asa/contract.py:424-426 // self.account[sender_holding_address].units = arc4.UInt64( // self.account[sender_holding_address].units.native - units // ) itob - // smart_contracts/base_d_asa/contract.py:426 + // smart_contracts/base_d_asa/contract.py:424 // self.account[sender_holding_address].units = arc4.UInt64( dig 1 box_get assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:426-428 + // smart_contracts/base_d_asa/contract.py:424-426 // self.account[sender_holding_address].units = arc4.UInt64( // self.account[sender_holding_address].units.native - units // ) @@ -1073,7 +1073,7 @@ asset_transfer_after_if_else@17: dig 1 swap box_put - // smart_contracts/base_d_asa/contract.py:430 + // smart_contracts/base_d_asa/contract.py:428 // self.account[receiver_holding_address].units.native + units frame_dig 2 dup @@ -1083,47 +1083,47 @@ asset_transfer_after_if_else@17: btoi uncover 3 + - // smart_contracts/base_d_asa/contract.py:429-431 + // smart_contracts/base_d_asa/contract.py:427-429 // self.account[receiver_holding_address].units = arc4.UInt64( // self.account[receiver_holding_address].units.native + units // ) itob - // smart_contracts/base_d_asa/contract.py:429 + // smart_contracts/base_d_asa/contract.py:427 // self.account[receiver_holding_address].units = arc4.UInt64( dig 1 box_get assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:429-431 + // smart_contracts/base_d_asa/contract.py:427-429 // self.account[receiver_holding_address].units = arc4.UInt64( // self.account[receiver_holding_address].units.native + units // ) swap replace2 32 box_put - // smart_contracts/base_d_asa/contract.py:353 + // smart_contracts/base_d_asa/contract.py:351 // if self.account[holding_address].units.native == 0: box_get assert // check self.account entry exists extract 32 8 // on error: Index access is out of bounds btoi bnz asset_transfer_after_if_else@21 - // smart_contracts/base_d_asa/contract.py:354 + // smart_contracts/base_d_asa/contract.py:352 // self.account[holding_address].unit_value = arc4.UInt64() frame_dig 1 dup box_get assert // check self.account entry exists - bytec 7 // 0x0000000000000000 + bytec 8 // 0x0000000000000000 replace2 40 dig 1 swap box_put - // smart_contracts/base_d_asa/contract.py:355 + // smart_contracts/base_d_asa/contract.py:353 // self.account[holding_address].paid_coupons = arc4.UInt64() dup box_get assert // check self.account entry exists - bytec 7 // 0x0000000000000000 + bytec 8 // 0x0000000000000000 replace2 48 box_put @@ -1145,7 +1145,7 @@ asset_transfer_bool_false@14: b asset_transfer_bool_merge@15 asset_transfer_else_body@16: - // smart_contracts/base_d_asa/contract.py:396 + // smart_contracts/base_d_asa/contract.py:394 // self.account[receiver_holding_address].unit_value = sender_unit_value frame_dig 2 dup @@ -1156,19 +1156,19 @@ asset_transfer_else_body@16: dig 1 swap box_put - // smart_contracts/base_d_asa/contract.py:397-399 + // smart_contracts/base_d_asa/contract.py:395-397 // self.account[receiver_holding_address].paid_coupons = self.account[ // sender_holding_address // ].paid_coupons frame_dig 1 box_get assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:397 + // smart_contracts/base_d_asa/contract.py:395 // self.account[receiver_holding_address].paid_coupons = self.account[ dig 1 box_get assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:397-399 + // smart_contracts/base_d_asa/contract.py:395-397 // self.account[receiver_holding_address].paid_coupons = self.account[ // sender_holding_address // ].paid_coupons @@ -1324,7 +1324,7 @@ accrued_interest_amount: // smart_contracts/perpetual_bond/contract.py:138 // * self.interest_rate intc_0 // 0 - bytec 5 // "interest_rate" + bytec 6 // "interest_rate" app_global_get_ex assert // check self.interest_rate exists // smart_contracts/perpetual_bond/contract.py:137-138 @@ -1413,7 +1413,7 @@ day_count_factor_after_if_else@3: swap frame_bury 1 bz day_count_factor_after_if_else@5 - // smart_contracts/base_d_asa/contract.py:349 + // smart_contracts/base_d_asa/contract.py:347 // return time_period // UInt64(cst.DAY_2_SEC) frame_dig 0 intc 6 // 86400 @@ -1487,13 +1487,13 @@ coupon_due_date: // smart_contracts.base_d_asa.contract.BaseDAsa.account_units_value(holding_address: bytes, units: uint64) -> uint64: account_units_value: - // smart_contracts/base_d_asa/contract.py:335-338 + // smart_contracts/base_d_asa/contract.py:333-336 // @subroutine // def account_units_value( // self, holding_address: arc4.Address, units: UInt64 // ) -> UInt64: proto 2 1 - // smart_contracts/base_d_asa/contract.py:339 + // smart_contracts/base_d_asa/contract.py:337 // return units * self.account[holding_address].unit_value.native bytec_1 // 0x52333023 frame_dig -2 @@ -1583,20 +1583,20 @@ pay_coupon: assert // check self.account entry exists extract 0 32 // on error: Index access is out of bounds // smart_contracts/base_d_asa/contract.py:312 - // Asset(self.denomination_asset_id) + // Asset(self.settlement_asset_id) intc_0 // 0 - bytec 8 // "denomination_asset_id" + bytec 5 // "settlement_asset_id" app_global_get_ex - assert // check self.denomination_asset_id exists + assert // check self.settlement_asset_id exists // smart_contracts/base_d_asa/contract.py:311-313 // self.account[holding_address].payment_address.native.is_opted_in( - // Asset(self.denomination_asset_id) + // Asset(self.settlement_asset_id) // ) asset_holding_get AssetBalance bury 1 // smart_contracts/base_d_asa/contract.py:311-314 // self.account[holding_address].payment_address.native.is_opted_in( - // Asset(self.denomination_asset_id) + // Asset(self.settlement_asset_id) // ) // and not self.account[holding_address].suspended.native bz pay_coupon_bool_false@14 @@ -1607,7 +1607,7 @@ pay_coupon: assert // check self.account entry exists intc 4 // 448 getbit - bytec 6 // 0x00 + bytec 7 // 0x00 intc_0 // 0 uncover 2 setbit @@ -1627,40 +1627,30 @@ pay_coupon_bool_merge@15: // smart_contracts/perpetual_bond/contract.py:104 // return principal_amount * self.interest_rate // cst.BPS intc_0 // 0 - bytec 5 // "interest_rate" + bytec 6 // "interest_rate" app_global_get_ex assert // check self.interest_rate exists * intc 5 // 10000 / dup - // smart_contracts/base_d_asa/contract.py:321 - // Global.current_application_address - global CurrentApplicationAddress // smart_contracts/base_d_asa/contract.py:320 - // Asset(self.denomination_asset_id).balance( + // Asset(self.settlement_asset_id).balance(Global.current_application_address) + global CurrentApplicationAddress intc_0 // 0 - bytec 8 // "denomination_asset_id" + bytec 5 // "settlement_asset_id" app_global_get_ex - assert // check self.denomination_asset_id exists - // smart_contracts/base_d_asa/contract.py:320-322 - // Asset(self.denomination_asset_id).balance( - // Global.current_application_address - // ) + assert // check self.settlement_asset_id exists asset_holding_get AssetBalance assert // account opted into asset - // smart_contracts/base_d_asa/contract.py:320-323 - // Asset(self.denomination_asset_id).balance( - // Global.current_application_address - // ) + // smart_contracts/base_d_asa/contract.py:320-321 + // Asset(self.settlement_asset_id).balance(Global.current_application_address) // >= payment_amount dig 1 >= - // smart_contracts/base_d_asa/contract.py:319-324 + // smart_contracts/base_d_asa/contract.py:319-322 // assert ( - // Asset(self.denomination_asset_id).balance( - // Global.current_application_address - // ) + // Asset(self.settlement_asset_id).balance(Global.current_application_address) // >= payment_amount // ), err.NOT_ENOUGH_FUNDS assert // Not enough funds for the payment @@ -1671,7 +1661,7 @@ pay_coupon_bool_merge@15: box_get assert // check self.account entry exists extract 0 32 // on error: Index access is out of bounds - // smart_contracts/base_d_asa/contract.py:328-333 + // smart_contracts/base_d_asa/contract.py:326-331 // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, // asset_receiver=receiver.native, @@ -1679,13 +1669,13 @@ pay_coupon_bool_merge@15: // fee=Global.min_txn_fee, // ).submit() itxn_begin - // smart_contracts/base_d_asa/contract.py:332 + // smart_contracts/base_d_asa/contract.py:330 // fee=Global.min_txn_fee, global MinTxnFee - // smart_contracts/base_d_asa/contract.py:329 + // smart_contracts/base_d_asa/contract.py:327 // xfer_asset=self.settlement_asset_id, intc_0 // 0 - bytec 19 // "settlement_asset_id" + bytec 5 // "settlement_asset_id" app_global_get_ex assert // check self.settlement_asset_id exists uncover 3 @@ -1693,12 +1683,12 @@ pay_coupon_bool_merge@15: uncover 2 itxn_field AssetReceiver itxn_field XferAsset - // smart_contracts/base_d_asa/contract.py:328 + // smart_contracts/base_d_asa/contract.py:326 // itxn.AssetTransfer( pushint 4 // axfer itxn_field TypeEnum itxn_field Fee - // smart_contracts/base_d_asa/contract.py:328-333 + // smart_contracts/base_d_asa/contract.py:326-331 // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, // asset_receiver=receiver.native, @@ -1803,11 +1793,11 @@ all_due_coupons_paid: // smart_contracts.base_d_asa.contract.BaseDAsa.account_total_units_value(holding_address: bytes) -> uint64: account_total_units_value: - // smart_contracts/base_d_asa/contract.py:341-342 + // smart_contracts/base_d_asa/contract.py:339-340 // @subroutine // def account_total_units_value(self, holding_address: arc4.Address) -> UInt64: proto 1 1 - // smart_contracts/base_d_asa/contract.py:344 + // smart_contracts/base_d_asa/contract.py:342 // holding_address, self.account[holding_address].units.native bytec_1 // 0x52333023 frame_dig -1 @@ -1816,7 +1806,7 @@ account_total_units_value: assert // check self.account entry exists extract 32 8 // on error: Index access is out of bounds btoi - // smart_contracts/base_d_asa/contract.py:343-345 + // smart_contracts/base_d_asa/contract.py:341-343 // return self.account_units_value( // holding_address, self.account[holding_address].units.native // ) @@ -1917,7 +1907,7 @@ update_interest_rate_bool_merge@6: // self.interest_rate = interest_rate.native frame_dig -1 btoi - bytec 5 // "interest_rate" + bytec 6 // "interest_rate" swap app_global_put // smart_contracts/perpetual_bond/contract.py:280 @@ -1987,7 +1977,7 @@ get_account_units_current_value_bool_merge@4: // smart_contracts/perpetual_bond/contract.py:308 // 0 < units <= self.account[holding_address].units.native frame_dig -1 - bytec 7 // 0x0000000000000000 + bytec 8 // 0x0000000000000000 b> bz get_account_units_current_value_bool_false@7 frame_dig 0 @@ -2175,7 +2165,7 @@ get_payment_amount: // smart_contracts/perpetual_bond/contract.py:356 // * self.interest_rate intc_0 // 0 - bytec 5 // "interest_rate" + bytec 6 // "interest_rate" app_global_get_ex assert // check self.interest_rate exists // smart_contracts/perpetual_bond/contract.py:355-356 @@ -2195,7 +2185,7 @@ get_payment_amount: itob // smart_contracts/perpetual_bond/contract.py:361 // principal=arc4.UInt64(), - bytec 7 // 0x0000000000000000 + bytec 8 // 0x0000000000000000 // smart_contracts/perpetual_bond/contract.py:359-362 // return typ.PaymentAmounts( // interest=arc4.UInt64(interest_amount), @@ -2300,7 +2290,7 @@ get_coupons_status_after_if_else@5: concat // smart_contracts/perpetual_bond/contract.py:390 // all_due_coupons_paid=arc4.Bool(all_due_coupons_paid), - bytec 6 // 0x00 + bytec 7 // 0x00 intc_0 // 0 frame_dig 0 setbit @@ -2373,16 +2363,16 @@ get_time_periods_after_if_else@2: // smart_contracts.base_d_asa.contract.BaseDAsa.asset_create(arranger: bytes, metadata: bytes) -> void: asset_create: - // smart_contracts/base_d_asa/contract.py:454-455 + // smart_contracts/base_d_asa/contract.py:452-453 // @arc4.abimethod(create="require") // def asset_create(self, arranger: arc4.Address, metadata: typ.AssetMetadata) -> None: proto 2 0 - // smart_contracts/base_d_asa/contract.py:463 + // smart_contracts/base_d_asa/contract.py:461 // self.arranger.value = arranger.native bytec 18 // 0x52323023 frame_dig -2 app_global_put - // smart_contracts/base_d_asa/contract.py:464 + // smart_contracts/base_d_asa/contract.py:462 // self.metadata = metadata.native frame_dig -1 extract 2 0 @@ -2394,7 +2384,7 @@ asset_create: // smart_contracts.base_d_asa.contract.BaseDAsa.asset_config(denomination_asset_id: bytes, settlement_asset_id: bytes, principal: bytes, minimum_denomination: bytes, day_count_convention: bytes, interest_rate: bytes, coupon_rates: bytes, time_events: bytes, time_periods: bytes) -> void: asset_config: - // smart_contracts/base_d_asa/contract.py:476-488 + // smart_contracts/base_d_asa/contract.py:474-486 // @arc4.abimethod // def asset_config( // self, @@ -2412,10 +2402,10 @@ asset_config: intc_0 // 0 pushbytes "" dup - // smart_contracts/base_d_asa/contract.py:517 + // smart_contracts/base_d_asa/contract.py:515 // self.assert_caller_is_arranger() callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:518 + // smart_contracts/base_d_asa/contract.py:516 // assert self.status == cfg.STATUS_EMPTY, err.ALREADY_CONFIGURED intc_0 // 0 bytec_2 // "status" @@ -2423,7 +2413,7 @@ asset_config: assert // check self.status exists ! assert // D-ASA already configured - // smart_contracts/base_d_asa/contract.py:520-521 + // smart_contracts/base_d_asa/contract.py:518-519 // # Set Denomination Asset // self.assert_denomination_asset(denomination_asset_id.native) frame_dig -9 @@ -2449,10 +2439,10 @@ asset_config_bool_merge@5: assert // Denomination asset is not properly set // smart_contracts/base_d_asa/contract.py:182 // self.denomination_asset_id = denomination_asset_id - bytec 8 // "denomination_asset_id" + bytec 19 // "denomination_asset_id" frame_dig 3 app_global_put - // smart_contracts/base_d_asa/contract.py:524-525 + // smart_contracts/base_d_asa/contract.py:522-523 // # Set Denomination Asset // self.assert_settlement_asset(settlement_asset_id.native) frame_dig -8 @@ -2460,7 +2450,7 @@ asset_config_bool_merge@5: // smart_contracts/base_d_asa/contract.py:188 // settlement_asset_id == self.denomination_asset_id intc_0 // 0 - bytec 8 // "denomination_asset_id" + bytec 19 // "denomination_asset_id" app_global_get_ex assert // check self.denomination_asset_id exists dig 1 @@ -2473,7 +2463,7 @@ asset_config_bool_merge@5: assert // Different settlement asset not supported, must be equal to denomination asset // smart_contracts/base_d_asa/contract.py:193 // self.settlement_asset_id = settlement_asset_id - bytec 19 // "settlement_asset_id" + bytec 5 // "settlement_asset_id" swap app_global_put // smart_contracts/base_d_asa/contract.py:194-200 @@ -2491,7 +2481,7 @@ asset_config_bool_merge@5: // smart_contracts/base_d_asa/contract.py:196 // xfer_asset=self.settlement_asset_id, intc_0 // 0 - bytec 19 // "settlement_asset_id" + bytec 5 // "settlement_asset_id" app_global_get_ex assert // check self.settlement_asset_id exists // smart_contracts/base_d_asa/contract.py:197 @@ -2518,7 +2508,7 @@ asset_config_bool_merge@5: // fee=Global.min_txn_fee, // ).submit() itxn_submit - // smart_contracts/base_d_asa/contract.py:530 + // smart_contracts/base_d_asa/contract.py:528 // principal.native % minimum_denomination.native == 0 frame_dig -7 btoi @@ -2527,24 +2517,24 @@ asset_config_bool_merge@5: dup2 % ! - // smart_contracts/base_d_asa/contract.py:528-531 + // smart_contracts/base_d_asa/contract.py:526-529 // # Set Principal and Minimum Denomination // assert ( // principal.native % minimum_denomination.native == 0 // ), err.INVALID_MINIMUM_DENOMINATION assert // Minimum denomination is not a divisor of principal - // smart_contracts/base_d_asa/contract.py:532 + // smart_contracts/base_d_asa/contract.py:530 // self.unit_value = minimum_denomination.native bytec 11 // "unit_value" dig 1 app_global_put - // smart_contracts/base_d_asa/contract.py:533 + // smart_contracts/base_d_asa/contract.py:531 // self.total_units = principal.native // minimum_denomination.native / bytec 13 // "total_units" swap app_global_put - // smart_contracts/base_d_asa/contract.py:535-536 + // smart_contracts/base_d_asa/contract.py:533-534 // # Set Day-Count Convention // self.assert_day_count_convention(day_count_convention.native) frame_dig -5 @@ -2591,7 +2581,7 @@ asset_config_bool_merge@18: bytec 12 // "day_count_convention" frame_dig 1 app_global_put - // smart_contracts/base_d_asa/contract.py:539-540 + // smart_contracts/base_d_asa/contract.py:537-538 // # Set Interest Rate // self.assert_interest_rate(interest_rate.native) frame_dig -4 @@ -2602,7 +2592,7 @@ asset_config_bool_merge@18: assert // Interest rate is not properly defined // smart_contracts/base_d_asa/contract.py:220 // self.interest_rate = interest_rate - bytec 5 // "interest_rate" + bytec 6 // "interest_rate" swap app_global_put // smart_contracts/base_d_asa/contract.py:224 @@ -2653,7 +2643,7 @@ asset_config_after_if_else@30: // time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS // ), err.INVALID_TIME_EVENTS_LENGTH assert // Time events length is invalid - // smart_contracts/base_d_asa/contract.py:549 + // smart_contracts/base_d_asa/contract.py:547 // self.assert_time_events_sorted(time_events) frame_dig -2 callsub assert_time_events_sorted @@ -2792,7 +2782,7 @@ asset_config_after_if_else@36: bytec 17 // "coupon_period" swap app_global_put - // smart_contracts/base_d_asa/contract.py:556 + // smart_contracts/base_d_asa/contract.py:554 // self.status = UInt64(cfg.STATUS_ACTIVE) bytec_2 // "status" intc_2 // 100 @@ -2958,14 +2948,14 @@ assert_time_events_sorted_after_for@6: // smart_contracts.base_d_asa.contract.BaseDAsa.set_secondary_time_events(secondary_market_time_events: bytes) -> bytes: set_secondary_time_events: - // smart_contracts/base_d_asa/contract.py:558-561 + // smart_contracts/base_d_asa/contract.py:556-559 // @arc4.abimethod // def set_secondary_time_events( // self, secondary_market_time_events: typ.TimeEvents // ) -> typ.SecondaryMarketSchedule: proto 1 1 intc_0 // 0 - // smart_contracts/base_d_asa/contract.py:579 + // smart_contracts/base_d_asa/contract.py:577 // self.assert_caller_is_arranger() callsub assert_caller_is_arranger // smart_contracts/base_d_asa/contract.py:105 @@ -2976,28 +2966,28 @@ set_secondary_time_events: assert // check self.status exists intc 7 // 200 == - // smart_contracts/base_d_asa/contract.py:580 + // smart_contracts/base_d_asa/contract.py:578 // assert not self.status_is_ended(), err.UNAUTHORIZED ! assert // Not authorized - // smart_contracts/base_d_asa/contract.py:581 + // smart_contracts/base_d_asa/contract.py:579 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:583 + // smart_contracts/base_d_asa/contract.py:581 // assert secondary_market_time_events.length >= 1, err.INVALID_TIME_EVENTS_LENGTH frame_dig -1 intc_0 // 0 extract_uint16 dup assert // Time events length is invalid - // smart_contracts/base_d_asa/contract.py:584 + // smart_contracts/base_d_asa/contract.py:582 // if secondary_market_time_events.length > 1: intc_1 // 1 > frame_dig -1 swap bz set_secondary_time_events_after_if_else@2 - // smart_contracts/base_d_asa/contract.py:585 + // smart_contracts/base_d_asa/contract.py:583 // self.assert_time_events_sorted(secondary_market_time_events) frame_dig -1 callsub assert_time_events_sorted @@ -3008,13 +2998,13 @@ set_secondary_time_events: set_secondary_time_events_after_if_else@2: frame_dig 1 frame_bury -1 - // smart_contracts/base_d_asa/contract.py:587 + // smart_contracts/base_d_asa/contract.py:585 // self.issuance_date intc_0 // 0 bytec 4 // "issuance_date" app_global_get_ex assert // check self.issuance_date exists - // smart_contracts/base_d_asa/contract.py:588-590 + // smart_contracts/base_d_asa/contract.py:586-588 // <= secondary_market_time_events[ // cfg.SECONDARY_MARKET_OPENING_DATE_IDX // ].native @@ -3024,7 +3014,7 @@ set_secondary_time_events_after_if_else@2: frame_bury 0 extract 0 8 // on error: Index access is out of bounds btoi - // smart_contracts/base_d_asa/contract.py:587-590 + // smart_contracts/base_d_asa/contract.py:585-588 // self.issuance_date // <= secondary_market_time_events[ // cfg.SECONDARY_MARKET_OPENING_DATE_IDX @@ -3032,7 +3022,7 @@ set_secondary_time_events_after_if_else@2: swap dig 1 <= - // smart_contracts/base_d_asa/contract.py:586-591 + // smart_contracts/base_d_asa/contract.py:584-589 // assert ( // self.issuance_date // <= secondary_market_time_events[ @@ -3040,34 +3030,34 @@ set_secondary_time_events_after_if_else@2: // ].native // ), err.INVALID_SECONDARY_OPENING_DATE assert // Invalid secondary market opening date - // smart_contracts/base_d_asa/contract.py:592 + // smart_contracts/base_d_asa/contract.py:590 // self.secondary_market_opening_date = secondary_market_time_events[ bytec 14 // "secondary_market_opening_date" - // smart_contracts/base_d_asa/contract.py:592-594 + // smart_contracts/base_d_asa/contract.py:590-592 // self.secondary_market_opening_date = secondary_market_time_events[ // cfg.SECONDARY_MARKET_OPENING_DATE_IDX // ].native swap app_global_put - // smart_contracts/base_d_asa/contract.py:595 + // smart_contracts/base_d_asa/contract.py:593 // if self.maturity_date: intc_0 // 0 bytec 16 // "maturity_date" app_global_get_ex assert // check self.maturity_date exists bz set_secondary_time_events_after_if_else@4 - // smart_contracts/base_d_asa/contract.py:597 + // smart_contracts/base_d_asa/contract.py:595 // self.maturity_date intc_0 // 0 bytec 16 // "maturity_date" app_global_get_ex assert // check self.maturity_date exists - // smart_contracts/base_d_asa/contract.py:599 + // smart_contracts/base_d_asa/contract.py:597 // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX frame_dig -1 intc_0 // 0 extract_uint16 - // smart_contracts/base_d_asa/contract.py:598-600 + // smart_contracts/base_d_asa/contract.py:596-598 // >= secondary_market_time_events[ // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX // ].native @@ -3080,7 +3070,7 @@ set_secondary_time_events_after_if_else@2: intc_3 // 8 extract3 // on error: Index access is out of bounds btoi - // smart_contracts/base_d_asa/contract.py:597-600 + // smart_contracts/base_d_asa/contract.py:595-598 // self.maturity_date // >= secondary_market_time_events[ // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX @@ -3088,7 +3078,7 @@ set_secondary_time_events_after_if_else@2: swap dig 1 >= - // smart_contracts/base_d_asa/contract.py:596-601 + // smart_contracts/base_d_asa/contract.py:594-599 // assert ( // self.maturity_date // >= secondary_market_time_events[ @@ -3096,10 +3086,10 @@ set_secondary_time_events_after_if_else@2: // ].native // ), err.INVALID_SECONDARY_CLOSURE_DATE assert // Invalid secondary market closure date - // smart_contracts/base_d_asa/contract.py:602 + // smart_contracts/base_d_asa/contract.py:600 // self.secondary_market_closure_date = secondary_market_time_events[ bytec 15 // "secondary_market_closure_date" - // smart_contracts/base_d_asa/contract.py:602-604 + // smart_contracts/base_d_asa/contract.py:600-602 // self.secondary_market_closure_date = secondary_market_time_events[ // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX // ].native @@ -3107,29 +3097,29 @@ set_secondary_time_events_after_if_else@2: app_global_put set_secondary_time_events_after_if_else@4: - // smart_contracts/base_d_asa/contract.py:607 + // smart_contracts/base_d_asa/contract.py:605 // self.secondary_market_opening_date intc_0 // 0 bytec 14 // "secondary_market_opening_date" app_global_get_ex assert // check self.secondary_market_opening_date exists - // smart_contracts/base_d_asa/contract.py:606-608 + // smart_contracts/base_d_asa/contract.py:604-606 // secondary_market_opening_date=arc4.UInt64( // self.secondary_market_opening_date // ), itob - // smart_contracts/base_d_asa/contract.py:610 + // smart_contracts/base_d_asa/contract.py:608 // self.secondary_market_closure_date intc_0 // 0 bytec 15 // "secondary_market_closure_date" app_global_get_ex assert // check self.secondary_market_closure_date exists - // smart_contracts/base_d_asa/contract.py:609-611 + // smart_contracts/base_d_asa/contract.py:607-609 // secondary_market_closure_date=arc4.UInt64( // self.secondary_market_closure_date // ), itob - // smart_contracts/base_d_asa/contract.py:605-612 + // smart_contracts/base_d_asa/contract.py:603-610 // return typ.SecondaryMarketSchedule( // secondary_market_opening_date=arc4.UInt64( // self.secondary_market_opening_date @@ -3145,27 +3135,27 @@ set_secondary_time_events_after_if_else@4: // smart_contracts.base_d_asa.contract.BaseDAsa.assign_role(role_address: bytes, role: bytes, config: bytes) -> bytes: assign_role: - // smart_contracts/base_d_asa/contract.py:614-617 + // smart_contracts/base_d_asa/contract.py:612-615 // @arc4.abimethod // def assign_role( // self, role_address: arc4.Address, role: arc4.UInt8, config: arc4.DynamicBytes // ) -> arc4.UInt64: proto 3 1 - // smart_contracts/base_d_asa/contract.py:635 + // smart_contracts/base_d_asa/contract.py:633 // self.assert_caller_is_arranger() callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:636 + // smart_contracts/base_d_asa/contract.py:634 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:637 + // smart_contracts/base_d_asa/contract.py:635 // assert role.native in ( frame_dig -2 btoi dup - // smart_contracts/base_d_asa/contract.py:638 + // smart_contracts/base_d_asa/contract.py:636 // UInt64(cst.ROLE_ARRANGER), pushint 20 // 20 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -3177,10 +3167,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:639 + // smart_contracts/base_d_asa/contract.py:637 // UInt64(cst.ROLE_ACCOUNT_MANAGER), pushint 40 // 40 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -3192,10 +3182,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:640 + // smart_contracts/base_d_asa/contract.py:638 // UInt64(cst.ROLE_PRIMARY_DEALER), pushint 50 // 50 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -3207,10 +3197,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:641 + // smart_contracts/base_d_asa/contract.py:639 // UInt64(cst.ROLE_TRUSTEE), pushint 60 // 60 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -3222,10 +3212,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:642 + // smart_contracts/base_d_asa/contract.py:640 // UInt64(cst.ROLE_AUTHORITY), pushint 70 // 70 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -3237,10 +3227,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:643 + // smart_contracts/base_d_asa/contract.py:641 // UInt64(cst.ROLE_INTEREST_ORACLE), pushint 80 // 80 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -3256,7 +3246,7 @@ assign_role_bool_true@6: intc_1 // 1 assign_role_bool_merge@8: - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -3266,10 +3256,10 @@ assign_role_bool_merge@8: // UInt64(cst.ROLE_INTEREST_ORACLE), // ), err.INVALID_ROLE assert // Invalid role identifier - // smart_contracts/base_d_asa/contract.py:646 + // smart_contracts/base_d_asa/contract.py:644 // case UInt64(cst.ROLE_ARRANGER): pushints 20 40 50 60 70 80 // 20, 40, 50, 60, 70, 80 - // smart_contracts/base_d_asa/contract.py:645-674 + // smart_contracts/base_d_asa/contract.py:643-672 // match role.native: // case UInt64(cst.ROLE_ARRANGER): // self.arranger.value = role_address.native @@ -3302,12 +3292,12 @@ assign_role_bool_merge@8: // op.err() frame_dig 0 match assign_role_switch_case_0@9 assign_role_switch_case_1@10 assign_role_switch_case_2@11 assign_role_switch_case_3@12 assign_role_switch_case_4@13 assign_role_switch_case_5@14 - // smart_contracts/base_d_asa/contract.py:674 + // smart_contracts/base_d_asa/contract.py:672 // op.err() err assign_role_switch_case_5@14: - // smart_contracts/base_d_asa/contract.py:668 + // smart_contracts/base_d_asa/contract.py:666 // role_address not in self.interest_oracle bytec 26 // 0x52383023 frame_dig -3 @@ -3316,23 +3306,23 @@ assign_role_switch_case_5@14: box_len bury 1 ! - // smart_contracts/base_d_asa/contract.py:667-669 + // smart_contracts/base_d_asa/contract.py:665-667 // assert ( // role_address not in self.interest_oracle // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:671 + // smart_contracts/base_d_asa/contract.py:669 // config.native frame_dig -1 extract 2 0 - // smart_contracts/base_d_asa/contract.py:670-672 + // smart_contracts/base_d_asa/contract.py:668-670 // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes( // config.native // ) box_put assign_role_switch_case_next@16: - // smart_contracts/base_d_asa/contract.py:675 + // smart_contracts/base_d_asa/contract.py:673 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -3340,7 +3330,7 @@ assign_role_switch_case_next@16: retsub assign_role_switch_case_4@13: - // smart_contracts/base_d_asa/contract.py:664 + // smart_contracts/base_d_asa/contract.py:662 // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS bytec 28 // 0x52373023 frame_dig -3 @@ -3350,7 +3340,7 @@ assign_role_switch_case_4@13: bury 1 ! assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:665 + // smart_contracts/base_d_asa/contract.py:663 // self.authority[role_address] = typ.RoleConfig.from_bytes(config.native) frame_dig -1 extract 2 0 @@ -3358,7 +3348,7 @@ assign_role_switch_case_4@13: b assign_role_switch_case_next@16 assign_role_switch_case_3@12: - // smart_contracts/base_d_asa/contract.py:661 + // smart_contracts/base_d_asa/contract.py:659 // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS bytec 29 // 0x52363023 frame_dig -3 @@ -3368,7 +3358,7 @@ assign_role_switch_case_3@12: bury 1 ! assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:662 + // smart_contracts/base_d_asa/contract.py:660 // self.trustee[role_address] = typ.RoleConfig.from_bytes(config.native) frame_dig -1 extract 2 0 @@ -3376,7 +3366,7 @@ assign_role_switch_case_3@12: b assign_role_switch_case_next@16 assign_role_switch_case_2@11: - // smart_contracts/base_d_asa/contract.py:656 + // smart_contracts/base_d_asa/contract.py:654 // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS bytec 30 // 0x52353023 frame_dig -3 @@ -3386,11 +3376,11 @@ assign_role_switch_case_2@11: bury 1 ! assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:658 + // smart_contracts/base_d_asa/contract.py:656 // config.native frame_dig -1 extract 2 0 - // smart_contracts/base_d_asa/contract.py:657-659 + // smart_contracts/base_d_asa/contract.py:655-657 // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes( // config.native // ) @@ -3398,7 +3388,7 @@ assign_role_switch_case_2@11: b assign_role_switch_case_next@16 assign_role_switch_case_1@10: - // smart_contracts/base_d_asa/contract.py:650 + // smart_contracts/base_d_asa/contract.py:648 // role_address not in self.account_manager bytec 31 // 0x52343023 frame_dig -3 @@ -3407,16 +3397,16 @@ assign_role_switch_case_1@10: box_len bury 1 ! - // smart_contracts/base_d_asa/contract.py:649-651 + // smart_contracts/base_d_asa/contract.py:647-649 // assert ( // role_address not in self.account_manager // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:653 + // smart_contracts/base_d_asa/contract.py:651 // config.native frame_dig -1 extract 2 0 - // smart_contracts/base_d_asa/contract.py:652-654 + // smart_contracts/base_d_asa/contract.py:650-652 // self.account_manager[role_address] = typ.RoleConfig.from_bytes( // config.native // ) @@ -3424,7 +3414,7 @@ assign_role_switch_case_1@10: b assign_role_switch_case_next@16 assign_role_switch_case_0@9: - // smart_contracts/base_d_asa/contract.py:647 + // smart_contracts/base_d_asa/contract.py:645 // self.arranger.value = role_address.native bytec 18 // 0x52323023 frame_dig -3 @@ -3438,25 +3428,25 @@ assign_role_bool_false@7: // smart_contracts.base_d_asa.contract.BaseDAsa.revoke_role(role_address: bytes, role: bytes) -> bytes: revoke_role: - // smart_contracts/base_d_asa/contract.py:677-678 + // smart_contracts/base_d_asa/contract.py:675-676 // @arc4.abimethod // def revoke_role(self, role_address: arc4.Address, role: arc4.UInt8) -> arc4.UInt64: proto 2 1 - // smart_contracts/base_d_asa/contract.py:695 + // smart_contracts/base_d_asa/contract.py:693 // self.assert_caller_is_arranger() callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:696 + // smart_contracts/base_d_asa/contract.py:694 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:697 + // smart_contracts/base_d_asa/contract.py:695 // assert role.native in ( frame_dig -1 btoi dup - // smart_contracts/base_d_asa/contract.py:698 + // smart_contracts/base_d_asa/contract.py:696 // UInt64(cst.ROLE_ACCOUNT_MANAGER), pushint 40 // 40 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -3467,10 +3457,10 @@ revoke_role: == bnz revoke_role_bool_true@5 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:699 + // smart_contracts/base_d_asa/contract.py:697 // UInt64(cst.ROLE_PRIMARY_DEALER), pushint 50 // 50 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -3481,10 +3471,10 @@ revoke_role: == bnz revoke_role_bool_true@5 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:700 + // smart_contracts/base_d_asa/contract.py:698 // UInt64(cst.ROLE_TRUSTEE), pushint 60 // 60 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -3495,10 +3485,10 @@ revoke_role: == bnz revoke_role_bool_true@5 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:701 + // smart_contracts/base_d_asa/contract.py:699 // UInt64(cst.ROLE_AUTHORITY), pushint 70 // 70 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -3509,10 +3499,10 @@ revoke_role: == bnz revoke_role_bool_true@5 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:702 + // smart_contracts/base_d_asa/contract.py:700 // UInt64(cst.ROLE_INTEREST_ORACLE), pushint 80 // 80 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -3527,7 +3517,7 @@ revoke_role_bool_true@5: intc_1 // 1 revoke_role_bool_merge@7: - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -3536,11 +3526,11 @@ revoke_role_bool_merge@7: // UInt64(cst.ROLE_INTEREST_ORACLE), // ), err.INVALID_ROLE assert // Invalid role identifier - // smart_contracts/base_d_asa/contract.py:705-706 + // smart_contracts/base_d_asa/contract.py:703-704 // # Arranger role can not be revoked (just rotated) // case UInt64(cst.ROLE_ACCOUNT_MANAGER): pushints 40 50 60 70 80 // 40, 50, 60, 70, 80 - // smart_contracts/base_d_asa/contract.py:704-722 + // smart_contracts/base_d_asa/contract.py:702-720 // match role.native: // # Arranger role can not be revoked (just rotated) // case UInt64(cst.ROLE_ACCOUNT_MANAGER): @@ -3562,12 +3552,12 @@ revoke_role_bool_merge@7: // op.err() frame_dig 0 match revoke_role_switch_case_0@8 revoke_role_switch_case_1@9 revoke_role_switch_case_2@10 revoke_role_switch_case_3@11 revoke_role_switch_case_4@12 - // smart_contracts/base_d_asa/contract.py:722 + // smart_contracts/base_d_asa/contract.py:720 // op.err() err revoke_role_switch_case_4@12: - // smart_contracts/base_d_asa/contract.py:719 + // smart_contracts/base_d_asa/contract.py:717 // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS bytec 26 // 0x52383023 frame_dig -2 @@ -3576,13 +3566,13 @@ revoke_role_switch_case_4@12: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:720 + // smart_contracts/base_d_asa/contract.py:718 // op.Box.delete(cst.PREFIX_ID_INTEREST_ORACLE + role_address.bytes) box_del pop revoke_role_switch_case_next@14: - // smart_contracts/base_d_asa/contract.py:723 + // smart_contracts/base_d_asa/contract.py:721 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -3590,7 +3580,7 @@ revoke_role_switch_case_next@14: retsub revoke_role_switch_case_3@11: - // smart_contracts/base_d_asa/contract.py:716 + // smart_contracts/base_d_asa/contract.py:714 // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS bytec 28 // 0x52373023 frame_dig -2 @@ -3599,14 +3589,14 @@ revoke_role_switch_case_3@11: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:717 + // smart_contracts/base_d_asa/contract.py:715 // op.Box.delete(cst.PREFIX_ID_AUTHORITY + role_address.bytes) box_del pop b revoke_role_switch_case_next@14 revoke_role_switch_case_2@10: - // smart_contracts/base_d_asa/contract.py:713 + // smart_contracts/base_d_asa/contract.py:711 // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS bytec 29 // 0x52363023 frame_dig -2 @@ -3615,14 +3605,14 @@ revoke_role_switch_case_2@10: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:714 + // smart_contracts/base_d_asa/contract.py:712 // op.Box.delete(cst.PREFIX_ID_TRUSTEE + role_address.bytes) box_del pop b revoke_role_switch_case_next@14 revoke_role_switch_case_1@9: - // smart_contracts/base_d_asa/contract.py:710 + // smart_contracts/base_d_asa/contract.py:708 // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS bytec 30 // 0x52353023 frame_dig -2 @@ -3631,14 +3621,14 @@ revoke_role_switch_case_1@9: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:711 + // smart_contracts/base_d_asa/contract.py:709 // op.Box.delete(cst.PREFIX_ID_PRIMARY_DEALER + role_address.bytes) box_del pop b revoke_role_switch_case_next@14 revoke_role_switch_case_0@8: - // smart_contracts/base_d_asa/contract.py:707 + // smart_contracts/base_d_asa/contract.py:705 // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS bytec 31 // 0x52343023 frame_dig -2 @@ -3647,7 +3637,7 @@ revoke_role_switch_case_0@8: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:708 + // smart_contracts/base_d_asa/contract.py:706 // op.Box.delete(cst.PREFIX_ID_ACCOUNT_MANAGER + role_address.bytes) box_del pop @@ -3660,13 +3650,13 @@ revoke_role_bool_false@6: // smart_contracts.base_d_asa.contract.BaseDAsa.open_account(holding_address: bytes, payment_address: bytes) -> bytes: open_account: - // smart_contracts/base_d_asa/contract.py:725-728 + // smart_contracts/base_d_asa/contract.py:723-726 // @arc4.abimethod // def open_account( // self, holding_address: arc4.Address, payment_address: arc4.Address // ) -> arc4.UInt64: proto 2 1 - // smart_contracts/base_d_asa/contract.py:745 + // smart_contracts/base_d_asa/contract.py:743 // self.assert_caller_is_account_manager() callsub assert_caller_is_account_manager // smart_contracts/base_d_asa/contract.py:105 @@ -3677,17 +3667,17 @@ open_account: assert // check self.status exists intc 7 // 200 == - // smart_contracts/base_d_asa/contract.py:746 + // smart_contracts/base_d_asa/contract.py:744 // assert not self.status_is_ended(), err.UNAUTHORIZED ! assert // Not authorized - // smart_contracts/base_d_asa/contract.py:747 + // smart_contracts/base_d_asa/contract.py:745 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:748 + // smart_contracts/base_d_asa/contract.py:746 // self.assert_is_not_suspended() callsub assert_is_not_suspended - // smart_contracts/base_d_asa/contract.py:749 + // smart_contracts/base_d_asa/contract.py:747 // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS bytec_1 // 0x52333023 frame_dig -2 @@ -3697,7 +3687,7 @@ open_account: bury 1 ! assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:751-757 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -3706,10 +3696,10 @@ open_account: // suspended=arc4.Bool(), // ) frame_dig -1 - // smart_contracts/base_d_asa/contract.py:753 + // smart_contracts/base_d_asa/contract.py:751 // units=arc4.UInt64(), - bytec 7 // 0x0000000000000000 - // smart_contracts/base_d_asa/contract.py:751-757 + bytec 8 // 0x0000000000000000 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -3718,10 +3708,10 @@ open_account: // suspended=arc4.Bool(), // ) concat - // smart_contracts/base_d_asa/contract.py:754 + // smart_contracts/base_d_asa/contract.py:752 // unit_value=arc4.UInt64(), - bytec 7 // 0x0000000000000000 - // smart_contracts/base_d_asa/contract.py:751-757 + bytec 8 // 0x0000000000000000 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -3730,10 +3720,10 @@ open_account: // suspended=arc4.Bool(), // ) concat - // smart_contracts/base_d_asa/contract.py:755 + // smart_contracts/base_d_asa/contract.py:753 // paid_coupons=arc4.UInt64(), - bytec 7 // 0x0000000000000000 - // smart_contracts/base_d_asa/contract.py:751-757 + bytec 8 // 0x0000000000000000 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -3742,10 +3732,10 @@ open_account: // suspended=arc4.Bool(), // ) concat - // smart_contracts/base_d_asa/contract.py:756 + // smart_contracts/base_d_asa/contract.py:754 // suspended=arc4.Bool(), - bytec 6 // 0x00 - // smart_contracts/base_d_asa/contract.py:751-757 + bytec 7 // 0x00 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -3755,7 +3745,7 @@ open_account: // ) concat box_put - // smart_contracts/base_d_asa/contract.py:758 + // smart_contracts/base_d_asa/contract.py:756 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -3844,16 +3834,16 @@ assert_caller_is_account_manager_bool_false@4: // smart_contracts.base_d_asa.contract.BaseDAsa.close_account(holding_address: bytes) -> bytes: close_account: - // smart_contracts/base_d_asa/contract.py:760-763 + // smart_contracts/base_d_asa/contract.py:758-761 // @arc4.abimethod // def close_account( // self, holding_address: arc4.Address // ) -> arc4.Tuple[arc4.UInt64, arc4.UInt64]: proto 1 1 - // smart_contracts/base_d_asa/contract.py:778 + // smart_contracts/base_d_asa/contract.py:776 // self.assert_caller_is_account_manager() callsub assert_caller_is_account_manager - // smart_contracts/base_d_asa/contract.py:779 + // smart_contracts/base_d_asa/contract.py:777 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted // smart_contracts/base_d_asa/contract.py:171 @@ -3865,7 +3855,7 @@ close_account: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:782 + // smart_contracts/base_d_asa/contract.py:780 // closed_units = self.account[holding_address].units.native dup box_get @@ -3874,11 +3864,11 @@ close_account: btoi dup uncover 2 - // smart_contracts/base_d_asa/contract.py:783 + // smart_contracts/base_d_asa/contract.py:781 // op.Box.delete(cst.PREFIX_ID_ACCOUNT + holding_address.bytes) box_del pop - // smart_contracts/base_d_asa/contract.py:784 + // smart_contracts/base_d_asa/contract.py:782 // self.circulating_units -= closed_units intc_0 // 0 bytec_3 // "circulating_units" @@ -3889,27 +3879,27 @@ close_account: bytec_3 // "circulating_units" swap app_global_put - // smart_contracts/base_d_asa/contract.py:359 + // smart_contracts/base_d_asa/contract.py:357 // if self.circulating_units == 0: intc_0 // 0 bytec_3 // "circulating_units" app_global_get_ex assert // check self.circulating_units exists bnz close_account_after_if_else@3 - // smart_contracts/base_d_asa/contract.py:360 + // smart_contracts/base_d_asa/contract.py:358 // self.status = UInt64(cfg.STATUS_ENDED) bytec_2 // "status" intc 7 // 200 app_global_put close_account_after_if_else@3: - // smart_contracts/base_d_asa/contract.py:787 + // smart_contracts/base_d_asa/contract.py:785 // (arc4.UInt64(closed_units), arc4.UInt64(Global.latest_timestamp)) frame_dig 0 itob global LatestTimestamp itob - // smart_contracts/base_d_asa/contract.py:786-788 + // smart_contracts/base_d_asa/contract.py:784-786 // return arc4.Tuple( // (arc4.UInt64(closed_units), arc4.UInt64(Global.latest_timestamp)) // ) @@ -3920,7 +3910,7 @@ close_account_after_if_else@3: // smart_contracts.base_d_asa.contract.BaseDAsa.primary_distribution(holding_address: bytes, units: bytes) -> bytes: primary_distribution: - // smart_contracts/base_d_asa/contract.py:790-793 + // smart_contracts/base_d_asa/contract.py:788-791 // @arc4.abimethod // def primary_distribution( // self, holding_address: arc4.Address, units: arc4.UInt64 @@ -4066,19 +4056,19 @@ primary_distribution_bool_merge@13: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:818 + // smart_contracts/base_d_asa/contract.py:816 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:819 + // smart_contracts/base_d_asa/contract.py:817 // self.assert_is_not_suspended() callsub assert_is_not_suspended - // smart_contracts/base_d_asa/contract.py:820 + // smart_contracts/base_d_asa/contract.py:818 // assert units.native > 0, err.ZERO_UNITS frame_dig -1 btoi dup assert // Can not distribute zero units - // smart_contracts/base_d_asa/contract.py:822 + // smart_contracts/base_d_asa/contract.py:820 // self.circulating_units + units.native <= self.total_units intc_0 // 0 bytec_3 // "circulating_units" @@ -4091,12 +4081,12 @@ primary_distribution_bool_merge@13: app_global_get_ex assert // check self.total_units exists <= - // smart_contracts/base_d_asa/contract.py:821-823 + // smart_contracts/base_d_asa/contract.py:819-821 // assert ( // self.circulating_units + units.native <= self.total_units // ), err.OVER_DISTRIBUTION assert // Insufficient remaining D-ASA units - // smart_contracts/base_d_asa/contract.py:825 + // smart_contracts/base_d_asa/contract.py:823 // self.circulating_units += units.native intc_0 // 0 bytec_3 // "circulating_units" @@ -4107,7 +4097,7 @@ primary_distribution_bool_merge@13: bytec_3 // "circulating_units" swap app_global_put - // smart_contracts/base_d_asa/contract.py:827 + // smart_contracts/base_d_asa/contract.py:825 // self.account[holding_address].units.native + units.native dig 1 box_get @@ -4115,17 +4105,17 @@ primary_distribution_bool_merge@13: extract 32 8 // on error: Index access is out of bounds btoi + - // smart_contracts/base_d_asa/contract.py:826-828 + // smart_contracts/base_d_asa/contract.py:824-826 // self.account[holding_address].units = arc4.UInt64( // self.account[holding_address].units.native + units.native // ) itob - // smart_contracts/base_d_asa/contract.py:826 + // smart_contracts/base_d_asa/contract.py:824 // self.account[holding_address].units = arc4.UInt64( dig 1 box_get assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:826-828 + // smart_contracts/base_d_asa/contract.py:824-826 // self.account[holding_address].units = arc4.UInt64( // self.account[holding_address].units.native + units.native // ) @@ -4134,7 +4124,7 @@ primary_distribution_bool_merge@13: dig 1 swap box_put - // smart_contracts/base_d_asa/contract.py:829 + // smart_contracts/base_d_asa/contract.py:827 // self.account[holding_address].unit_value = arc4.UInt64(self.unit_value) intc_0 // 0 bytec 11 // "unit_value" @@ -4147,7 +4137,7 @@ primary_distribution_bool_merge@13: swap replace2 40 box_put - // smart_contracts/base_d_asa/contract.py:830 + // smart_contracts/base_d_asa/contract.py:828 // return arc4.UInt64(self.total_units - self.circulating_units) intc_0 // 0 bytec 13 // "total_units" @@ -4173,14 +4163,14 @@ primary_distribution_bool_false@5: // smart_contracts.base_d_asa.contract.BaseDAsa.set_asset_suspension(suspended: bytes) -> bytes: set_asset_suspension: - // smart_contracts/base_d_asa/contract.py:832-833 + // smart_contracts/base_d_asa/contract.py:830-831 // @arc4.abimethod // def set_asset_suspension(self, suspended: arc4.Bool) -> arc4.UInt64: proto 1 1 - // smart_contracts/base_d_asa/contract.py:846 + // smart_contracts/base_d_asa/contract.py:844 // self.assert_caller_is_authority() callsub assert_caller_is_authority - // smart_contracts/base_d_asa/contract.py:847 + // smart_contracts/base_d_asa/contract.py:845 // self.suspended = UInt64(suspended.native) frame_dig -1 intc_0 // 0 @@ -4188,7 +4178,7 @@ set_asset_suspension: bytec 21 // "suspended" swap app_global_put - // smart_contracts/base_d_asa/contract.py:848 + // smart_contracts/base_d_asa/contract.py:846 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -4277,13 +4267,13 @@ assert_caller_is_authority_bool_false@4: // smart_contracts.base_d_asa.contract.BaseDAsa.set_account_suspension(holding_address: bytes, suspended: bytes) -> bytes: set_account_suspension: - // smart_contracts/base_d_asa/contract.py:850-853 + // smart_contracts/base_d_asa/contract.py:848-851 // @arc4.abimethod // def set_account_suspension( // self, holding_address: arc4.Address, suspended: arc4.Bool // ) -> arc4.UInt64: proto 2 1 - // smart_contracts/base_d_asa/contract.py:868 + // smart_contracts/base_d_asa/contract.py:866 // self.assert_caller_is_authority() callsub assert_caller_is_authority // smart_contracts/base_d_asa/contract.py:171 @@ -4295,7 +4285,7 @@ set_account_suspension: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:870 + // smart_contracts/base_d_asa/contract.py:868 // self.account[holding_address].suspended = suspended dup box_get @@ -4307,7 +4297,7 @@ set_account_suspension: swap setbit box_put - // smart_contracts/base_d_asa/contract.py:871 + // smart_contracts/base_d_asa/contract.py:869 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -4316,7 +4306,7 @@ set_account_suspension: // smart_contracts.base_d_asa.contract.BaseDAsa.set_default_status(defaulted: bytes) -> void: set_default_status: - // smart_contracts/base_d_asa/contract.py:873-874 + // smart_contracts/base_d_asa/contract.py:871-872 // @arc4.abimethod // def set_default_status(self, defaulted: arc4.Bool) -> None: proto 1 0 @@ -4387,7 +4377,7 @@ set_default_status_bool_merge@6: // <= self.trustee[caller].role_validity_end // ), err.UNAUTHORIZED assert // Not authorized - // smart_contracts/base_d_asa/contract.py:885 + // smart_contracts/base_d_asa/contract.py:883 // self.defaulted = UInt64(defaulted.native) frame_dig -1 intc_0 // 0 @@ -4404,18 +4394,25 @@ set_default_status_bool_false@5: // smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_info() -> bytes: get_asset_info: - // smart_contracts/base_d_asa/contract.py:887-888 + // smart_contracts/base_d_asa/contract.py:885-886 // @arc4.abimethod(readonly=True) // def get_asset_info(self) -> typ.AssetInfo: proto 0 1 - // smart_contracts/base_d_asa/contract.py:898 + // smart_contracts/base_d_asa/contract.py:896 // denomination_asset_id=arc4.UInt64(self.denomination_asset_id), intc_0 // 0 - bytec 8 // "denomination_asset_id" + bytec 19 // "denomination_asset_id" app_global_get_ex assert // check self.denomination_asset_id exists itob - // smart_contracts/base_d_asa/contract.py:899 + // smart_contracts/base_d_asa/contract.py:897 + // settlement_asset_id=arc4.UInt64(self.settlement_asset_id), + intc_0 // 0 + bytec 5 // "settlement_asset_id" + app_global_get_ex + assert // check self.settlement_asset_id exists + itob + // smart_contracts/base_d_asa/contract.py:898 // outstanding_principal=arc4.UInt64(self.circulating_units * self.unit_value), intc_0 // 0 bytec_3 // "circulating_units" @@ -4427,14 +4424,14 @@ get_asset_info: assert // check self.unit_value exists * itob - // smart_contracts/base_d_asa/contract.py:900 + // smart_contracts/base_d_asa/contract.py:899 // unit_value=arc4.UInt64(self.unit_value), intc_0 // 0 bytec 11 // "unit_value" app_global_get_ex assert // check self.unit_value exists itob - // smart_contracts/base_d_asa/contract.py:901 + // smart_contracts/base_d_asa/contract.py:900 // day_count_convention=arc4.UInt8(self.day_count_convention), intc_0 // 0 bytec 12 // "day_count_convention" @@ -4442,87 +4439,88 @@ get_asset_info: assert // check self.day_count_convention exists itob extract 7 1 - // smart_contracts/base_d_asa/contract.py:902 + // smart_contracts/base_d_asa/contract.py:901 // interest_rate=arc4.UInt16(self.interest_rate), intc_0 // 0 - bytec 5 // "interest_rate" + bytec 6 // "interest_rate" app_global_get_ex assert // check self.interest_rate exists itob extract 6 2 - // smart_contracts/base_d_asa/contract.py:903 + // smart_contracts/base_d_asa/contract.py:902 // total_supply=arc4.UInt64(self.total_units), intc_0 // 0 bytec 13 // "total_units" app_global_get_ex assert // check self.total_units exists itob - // smart_contracts/base_d_asa/contract.py:904 + // smart_contracts/base_d_asa/contract.py:903 // circulating_supply=arc4.UInt64(self.circulating_units), intc_0 // 0 bytec_3 // "circulating_units" app_global_get_ex assert // check self.circulating_units exists itob - // smart_contracts/base_d_asa/contract.py:906 + // smart_contracts/base_d_asa/contract.py:905 // self.primary_distribution_opening_date intc_0 // 0 bytec 10 // "primary_distribution_opening_date" app_global_get_ex assert // check self.primary_distribution_opening_date exists - // smart_contracts/base_d_asa/contract.py:905-907 + // smart_contracts/base_d_asa/contract.py:904-906 // primary_distribution_opening_date=arc4.UInt64( // self.primary_distribution_opening_date // ), itob - // smart_contracts/base_d_asa/contract.py:909 + // smart_contracts/base_d_asa/contract.py:908 // self.primary_distribution_closure_date intc_0 // 0 bytec 20 // "primary_distribution_closure_date" app_global_get_ex assert // check self.primary_distribution_closure_date exists - // smart_contracts/base_d_asa/contract.py:908-910 + // smart_contracts/base_d_asa/contract.py:907-909 // primary_distribution_closure_date=arc4.UInt64( // self.primary_distribution_closure_date // ), itob - // smart_contracts/base_d_asa/contract.py:911 + // smart_contracts/base_d_asa/contract.py:910 // issuance_date=arc4.UInt64(self.issuance_date), intc_0 // 0 bytec 4 // "issuance_date" app_global_get_ex assert // check self.issuance_date exists itob - // smart_contracts/base_d_asa/contract.py:912 + // smart_contracts/base_d_asa/contract.py:911 // maturity_date=arc4.UInt64(self.maturity_date), intc_0 // 0 bytec 16 // "maturity_date" app_global_get_ex assert // check self.maturity_date exists itob - // smart_contracts/base_d_asa/contract.py:913 + // smart_contracts/base_d_asa/contract.py:912 // suspended=arc4.Bool(bool(self.suspended)), intc_0 // 0 bytec 21 // "suspended" app_global_get_ex assert // check self.suspended exists - bytec 6 // 0x00 + bytec 7 // 0x00 intc_0 // 0 uncover 2 setbit - // smart_contracts/base_d_asa/contract.py:914 + // smart_contracts/base_d_asa/contract.py:913 // defaulted=arc4.Bool(bool(self.defaulted)), intc_0 // 0 bytec 22 // "defaulted" app_global_get_ex assert // check self.defaulted exists - bytec 6 // 0x00 + bytec 7 // 0x00 intc_0 // 0 uncover 2 setbit - // smart_contracts/base_d_asa/contract.py:897-915 + // smart_contracts/base_d_asa/contract.py:895-914 // return typ.AssetInfo( // denomination_asset_id=arc4.UInt64(self.denomination_asset_id), + // settlement_asset_id=arc4.UInt64(self.settlement_asset_id), // outstanding_principal=arc4.UInt64(self.circulating_units * self.unit_value), // unit_value=arc4.UInt64(self.unit_value), // day_count_convention=arc4.UInt8(self.day_count_convention), @@ -4540,7 +4538,9 @@ get_asset_info: // suspended=arc4.Bool(bool(self.suspended)), // defaulted=arc4.Bool(bool(self.defaulted)), // ) - uncover 12 + uncover 13 + uncover 13 + concat uncover 12 concat uncover 11 @@ -4566,7 +4566,7 @@ get_asset_info: swap intc_0 // 0 getbit - pushint 601 // 601 + pushint 665 // 665 swap setbit retsub @@ -4574,7 +4574,7 @@ get_asset_info: // smart_contracts.base_d_asa.contract.BaseDAsa.get_account_info(holding_address: bytes) -> bytes: get_account_info: - // smart_contracts/base_d_asa/contract.py:917-918 + // smart_contracts/base_d_asa/contract.py:916-917 // @arc4.abimethod(readonly=True) // def get_account_info(self, holding_address: arc4.Address) -> typ.AccountInfo: proto 1 1 @@ -4587,7 +4587,7 @@ get_account_info: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:932 + // smart_contracts/base_d_asa/contract.py:931 // return self.account[holding_address] box_get assert // check self.account entry exists @@ -4596,11 +4596,11 @@ get_account_info: // smart_contracts.base_d_asa.contract.BaseDAsa.get_time_events() -> bytes: get_time_events: - // smart_contracts/base_d_asa/contract.py:934-935 + // smart_contracts/base_d_asa/contract.py:933-934 // @arc4.abimethod(readonly=True) // def get_time_events(self) -> typ.TimeEvents: proto 0 1 - // smart_contracts/base_d_asa/contract.py:942 + // smart_contracts/base_d_asa/contract.py:941 // time_events = typ.TimeEvents() bytec 32 // 0x0000 // smart_contracts/base_d_asa/contract.py:101 @@ -4611,10 +4611,10 @@ get_time_events: assert // check self.status exists intc_2 // 100 == - // smart_contracts/base_d_asa/contract.py:943 + // smart_contracts/base_d_asa/contract.py:942 // if self.status_is_active(): bz get_time_events_after_if_else@2 - // smart_contracts/base_d_asa/contract.py:944 + // smart_contracts/base_d_asa/contract.py:943 // time_events = self.time_events.value.copy() bytec 27 // 0x74696d654576656e7473 box_get @@ -4623,7 +4623,7 @@ get_time_events: assert // check self.time_events exists get_time_events_after_if_else@2: - // smart_contracts/base_d_asa/contract.py:945 + // smart_contracts/base_d_asa/contract.py:944 // return time_events frame_dig 0 swap @@ -4632,25 +4632,25 @@ get_time_events_after_if_else@2: // smart_contracts.base_d_asa.contract.BaseDAsa.get_secondary_market_schedule() -> bytes: get_secondary_market_schedule: - // smart_contracts/base_d_asa/contract.py:947-948 + // smart_contracts/base_d_asa/contract.py:946-947 // @arc4.abimethod(readonly=True) // def get_secondary_market_schedule(self) -> typ.TimeEvents: proto 0 1 - // smart_contracts/base_d_asa/contract.py:950 + // smart_contracts/base_d_asa/contract.py:955 // arc4.UInt64(self.secondary_market_opening_date), intc_0 // 0 bytec 14 // "secondary_market_opening_date" app_global_get_ex assert // check self.secondary_market_opening_date exists itob - // smart_contracts/base_d_asa/contract.py:951 + // smart_contracts/base_d_asa/contract.py:956 // arc4.UInt64(self.secondary_market_closure_date), intc_0 // 0 bytec 15 // "secondary_market_closure_date" app_global_get_ex assert // check self.secondary_market_closure_date exists itob - // smart_contracts/base_d_asa/contract.py:949-952 + // smart_contracts/base_d_asa/contract.py:954-957 // return typ.TimeEvents( // arc4.UInt64(self.secondary_market_opening_date), // arc4.UInt64(self.secondary_market_closure_date), @@ -4664,11 +4664,11 @@ get_secondary_market_schedule: // smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_metadata() -> bytes: get_asset_metadata: - // smart_contracts/base_d_asa/contract.py:954-955 + // smart_contracts/base_d_asa/contract.py:959-960 // @arc4.abimethod(readonly=True) // def get_asset_metadata(self) -> typ.AssetMetadata: proto 0 1 - // smart_contracts/base_d_asa/contract.py:956 + // smart_contracts/base_d_asa/contract.py:967 // return typ.AssetMetadata(self.metadata) intc_0 // 0 bytec 25 // "metadata" @@ -4685,11 +4685,11 @@ get_asset_metadata: // smart_contracts.base_d_asa.contract.BaseDAsa.asset_update() -> void: asset_update: - // smart_contracts/base_d_asa/contract.py:466-467 + // smart_contracts/base_d_asa/contract.py:464-465 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def asset_update(self) -> None: proto 0 0 - // smart_contracts/base_d_asa/contract.py:471-474 + // smart_contracts/base_d_asa/contract.py:469-472 // # The reference implementation grants the update permissions to the Arranger. // # Other implementations may disable D-ASA application updatability or change its authorizations. // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they might introduce breaking changes. diff --git a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc32.json b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc32.json index 1a6f726..d1e7e07 100644 --- a/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc32.json +++ b/smart_contracts/artifacts/perpetual_bond/PerpetualBond.arc32.json @@ -189,7 +189,7 @@ "no_op": "CALL" } }, - "get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)": { + "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)": { "read_only": true, "call_config": { "no_op": "CALL" @@ -202,6 +202,10 @@ "denomination_asset_id", "uint64" ], + [ + "settlement_asset_id", + "uint64" + ], [ "outstanding_principal", "uint64" @@ -307,7 +311,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMTAwIDggNDQ4IDEwMDAwIDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NTIzMzMwMjMgInN0YXR1cyIgImNpcmN1bGF0aW5nX3VuaXRzIiAiaXNzdWFuY2VfZGF0ZSIgImludGVyZXN0X3JhdGUiIDB4MDAgMHgwMDAwMDAwMDAwMDAwMDAwICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJ0b3RhbF9jb3Vwb25zIiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAidW5pdF92YWx1ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAidG90YWxfdW5pdHMiICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIiAibWF0dXJpdHlfZGF0ZSIgImNvdXBvbl9wZXJpb2QiIDB4NTIzMjMwMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiICJzdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJwYWlkX2NvdXBvbl91bml0cyIgMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczICJtZXRhZGF0YSIgMHg1MjM4MzAyMyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDAwIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDEtNDIKICAgIC8vICMgUm9sZSBCYXNlZCBBY2Nlc3MgQ29udHJvbAogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OS02MAogICAgLy8gIyBBc3NldCBDb25maWd1cmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IFVJbnQ2NCgpCiAgICBieXRlYyA4IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUtNjYKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OC02OQogICAgLy8gIyBTdXBwbHkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzItNzMKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODktOTAKICAgIC8vICMgU3RhdHVzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VNUFRZKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MQogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNS0zNgogICAgLy8gIyBTdGF0ZSBzY2hlbWEgdmFsaWRhdGlvbgogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkdMT0JBTF9CWVRFUywgZXJyLldST05HX0dMT0JBTF9CWVRFUwogICAgdHhuIEdsb2JhbE51bUJ5dGVTbGljZQogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX3VpbnQgPT0gY2ZnLkdMT0JBTF9VSU5UUywgZXJyLldST05HX0dMT0JBTF9VSU5UUwogICAgdHhuIEdsb2JhbE51bVVpbnQKICAgIHB1c2hpbnQgMTkgLy8gMTkKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyAjIENvdXBvbnMKICAgIC8vIHNlbGYuY291cG9uX3BlcmlvZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY291cG9uX3BlcmlvZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBzZWxmLnBhaWRfY291cG9uX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDIzIC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDI4CiAgICBwdXNoYnl0ZXNzIDB4NGZkNmEzY2MgMHg4Y2YxNGI1MSAweDgwZTUxZTlmIDB4NDQzNjNkNDkgMHg2N2RiNGYyMCAweGY2YTk2YzhkIDB4MjI5YjcwNmYgMHg2M2Y5OTU4OSAweGQzYTRkNmFiIDB4MWQ2ZmMyNTUgMHhmZWY3NDU2NyAweGI4ZmMxMzkwIDB4M2Q0M2QxZjAgMHhlYmQ5NmIyZiAweDZjODVlM2VlIDB4ZjYzYWNlOGQgMHhiYmNjYTE4YSAweDFhN2JhYmI0IDB4MzAxZGQ5MTkgMHhlZDAyNzU5ZiAweGZhZDIxNzNlIDB4MDhlZmVhMzUgMHhkZGNlYzA3YiAvLyBtZXRob2QgImFzc2V0X3RyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwYXlfY291cG9uKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LGJ5dGVbXSkiLCBtZXRob2QgInVwZGF0ZV9pbnRlcmVzdF9yYXRlKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCx1aW50NjQpKSIsIG1ldGhvZCAiZ2V0X3BheW1lbnRfYW1vdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfY291cG9uc19zdGF0dXMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCksYm9vbCkiLCBtZXRob2QgImdldF90aW1lX3BlcmlvZHMoKSh1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJhc3NldF9jcmVhdGUoYWRkcmVzcyxieXRlW10pdm9pZCIsIG1ldGhvZCAiYXNzZXRfY29uZmlnKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAic2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyh1aW50NjRbXSkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2lnbl9yb2xlKGFkZHJlc3MsdWludDgsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmV2b2tlX3JvbGUoYWRkcmVzcyx1aW50OCl1aW50NjQiLCBtZXRob2QgIm9wZW5fYWNjb3VudChhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJjbG9zZV9hY2NvdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9hc3NldF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfYWNjb3VudF9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9kZWZhdWx0X3N0YXR1cyhib29sKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9pbmZvKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsYm9vbCkiLCBtZXRob2QgImdldF9hY2NvdW50X2luZm8oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sKSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKWJ5dGVbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fYXNzZXRfdHJhbnNmZXJfcm91dGVANSBtYWluX3BheV9jb3Vwb25fcm91dGVANiBtYWluX3VwZGF0ZV9pbnRlcmVzdF9yYXRlX3JvdXRlQDcgbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDggbWFpbl9nZXRfcGF5bWVudF9hbW91bnRfcm91dGVAOSBtYWluX2dldF9jb3Vwb25zX3N0YXR1c19yb3V0ZUAxMCBtYWluX2dldF90aW1lX3BlcmlvZHNfcm91dGVAMTEgbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAMTIgbWFpbl9hc3NldF9jb25maWdfcm91dGVAMTMgbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDE0IG1haW5fYXNzaWduX3JvbGVfcm91dGVAMTUgbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUAxNiBtYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxNyBtYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTggbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxOSBtYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDIwIG1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAyMSBtYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAyMiBtYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDIzIG1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAyNCBtYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAyNSBtYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDI2IG1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDI3CgptYWluX2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWV0YWRhdGFfcm91dGVAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9tZXRhZGF0YQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3RpbWVfZXZlbnRzX3JvdXRlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYWNjb3VudF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfaW5mbwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2RlZmF1bHRfc3RhdHVzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2FjY291bnRfc3VzcGVuc2lvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYXNzZXRfc3VzcGVuc2lvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNsb3NlX2FjY291bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fb3Blbl9hY2NvdW50X3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG9wZW5fYWNjb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiByZXZva2Vfcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NpZ25fcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2V0X2NvbmZpZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgY2FsbHN1YiBhc3NldF9jcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3RpbWVfcGVyaW9kc19yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozOTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF90aW1lX3BlcmlvZHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2NvdXBvbnNfc3RhdHVzX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2NvdXBvbnNfc3RhdHVzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9wYXltZW50X2Ftb3VudF9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X3BheW1lbnRfYW1vdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdXBkYXRlX2ludGVyZXN0X3JhdGVfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHVwZGF0ZV9pbnRlcmVzdF9yYXRlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3BheV9jb3Vwb25fcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHBheV9jb3Vwb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfdHJhbnNmZXJfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2V0X3RyYW5zZmVyCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICBwdXNoaW50IDQgLy8gNAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgbWF0Y2ggbWFpbl9hc3NldF91cGRhdGVAMjkKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDMwCgptYWluX2Fzc2V0X3VwZGF0ZUAyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NgogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY2LTQ2NwogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiBhc3NldF91cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIGNhbGxzdWIgYXNzZXRfdXBkYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuYXNzZXRfdHJhbnNmZXIoc2VuZGVyX2hvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2V0X3RyYW5zZmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE0NS0xNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIHVuaXRzOiBhcmM0LlVJbnQ2NCwKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAzIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTc2CiAgICAvLyB1bml0cy5uYXRpdmUsCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTMtMjk2CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk1CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk2CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTYKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NS0yOTYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyA0CiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk2CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkyLTI5NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjktMzcxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLm5hdGl2ZSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzIKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzczCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlLCBlcnIuU1VTUEVOREVECiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgNiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc3LTM3OQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnN1c3BlbmRlZC5uYXRpdmUsIGVyci5TVVNQRU5ERUQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgNiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzgxCiAgICAvLyB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyA1CiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzgwLTM4MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5MAogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzkxCiAgICAvLyBpZiBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPiAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0LTMwNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0LTMwNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzAzLTMwNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gICAgIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5OT05fRlVOR0lCTEVfVU5JVFMKICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIHVuaXRzIGFyZSBub3QgZnVuZ2libGUKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTc5LTE4MAogICAgLy8gIyBUcmFuc2ZlciBpcyBmb3JiaWRkZW4gaW4gY2FzZSBvZiBwZW5kaW5nIGNvdXBvbiBwYXltZW50cwogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxODEKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTgzLTE4NAogICAgLy8gIyBUcmFuc2ZlcnJlZCB1bml0cyB2YWx1ZSAobXVzdCBiZSBjb21wdXRlZCBiZWZvcmUgdGhlIHRyYW5zZmVyKQogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE4NS0xODcKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZSwgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNwogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMgogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI2LTQyOAogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjYKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjYtNDI4CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDMwCiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI5LTQzMQogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI5CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjktNDMxCiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzUzCiAgICAvLyBpZiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPT0gMDoKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiA0MAogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gYXJjNC5VSW50NjQoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0Cgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5MgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHVuaXRzLm5hdGl2ZSAqIHNlbmRlcl91bml0X3ZhbHVlLm5hdGl2ZSArIGFjY3J1ZWRfaW50ZXJlc3QpCiAgICBmcmFtZV9kaWcgMAogICAgYnRvaQogICAgZnJhbWVfZGlnIDUKICAgICoKICAgIGZyYW1lX2RpZyAzCiAgICArCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMTUKCmFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NgogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk3LTM5OQogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0ucGFpZF9jb3Vwb25zCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTctMzk5CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5wYWlkX2NvdXBvbnMKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0CiAgICBiIGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTcKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDctMTA4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X3N1c3BlbmRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMS0xMTIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTEzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmNvdW50X2R1ZV9jb3Vwb25zKCkgLT4gdWludDY0Ogpjb3VudF9kdWVfY291cG9uczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo2Ni02NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjb3VudF9kdWVfY291cG9ucyhzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo2OAogICAgLy8gZHVlX2NvdXBvbnMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NjkKICAgIC8vIGN1cnJlbnRfdHMgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NzAKICAgIC8vIGlmIGN1cnJlbnRfdHMgPiBzZWxmLmlzc3VhbmNlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NzEKICAgIC8vIGR1ZV9jb3Vwb25zID0gKGN1cnJlbnRfdHMgLSBzZWxmLmlzc3VhbmNlX2RhdGUpIC8vIHNlbGYuY291cG9uX3BlcmlvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICAtCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3BlcmlvZCBleGlzdHMKICAgIC8KICAgIGZyYW1lX2J1cnkgMAoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyAgICAgIyBkaXYtYnktemVybzogY291cG9uX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9wZXJpb2RzIGNoZWNrcwogICAgLy8gcmV0dXJuIGR1ZV9jb3Vwb25zCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBkdWVfY291cG9uczogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo5NC05NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgLy8gKSwgZXJyLlBFTkRJTkdfQ09VUE9OX1BBWU1FTlQKICAgIGFzc2VydCAvLyBQZW5kaW5nIGR1ZSBjb3Vwb24gcGF5bWVudAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCwgZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NydWVkX2ludGVyZXN0X2Ftb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjctMTMwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogVUludDY0LCBkdWVfY291cG9uczogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzMS0xMzIKICAgIC8vICMgVGhlIGZvbGxvd2luZyBhc3NlcnQgc2FmZWd1YXJkcyB0aGUgc3Vicm91dGluZSBmcm9tIGZvcmJpZGRlbiBpbnZvY2F0aW9ucwogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzMKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gY291cG9uX2FjY3J1ZWRfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNQogICAgLy8gY291cG9uX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IubmF0aXZlCiAgICBzd2FwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzcKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTM3LTEzOAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDEKICAgIC8vIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIHVuY292ZXIgMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNy0xNDIKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICAvLyAvLyAoCiAgICAvLyAgICAgY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QKICAgIC8vICkgICMgZGl2LWJ5LXplcm86IGNvdXBvbl9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfcGVyaW9kcyBjaGVja3MKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzYtMTQzCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gICAgICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAgICAgKiBjb3Vwb25fYWNjcnVlZF9wZXJpb2QKICAgIC8vICAgICAvLyAoCiAgICAvLyAgICAgICAgIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICAvLyAgICAgKSAgIyBkaXYtYnktemVybzogY291cG9uX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9wZXJpb2RzIGNoZWNrcwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9uczogdWludDY0KSAtPiBieXRlczoKZGF5X2NvdW50X2ZhY3RvcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMDYtMTA3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGRheV9jb3VudF9mYWN0b3Ioc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gdHlwLkRheUNvdW50RmFjdG9yOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEwOC0xMDkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gaWYgbm90IGR1ZV9jb3Vwb25zOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExMAogICAgLy8gYWNjcnVpbmdfc3RhcnRfdGltZSA9IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExMwogICAgLy8gY291cG9uX2FjY3J1ZWRfcGVyaW9kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgLSBhY2NydWluZ19zdGFydF90aW1lCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBzd2FwCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExNAogICAgLy8gY291cG9uX3BlcmlvZCA9IHNlbGYuY291cG9uX3BlcmlvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcGVyaW9kIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExNQogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9PSBVSW50NjQoY3N0LkRDQ19BX0EpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMQogICAgYnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0OQogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfZGlnIDMKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9idXJ5IDEKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTE5CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQoY291cG9uX2FjY3J1ZWRfcGVyaW9kKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjAKICAgIC8vIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGNvdXBvbl9wZXJpb2QpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExOC0xMjEKICAgIC8vIHJldHVybiB0eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KGNvdXBvbl9hY2NydWVkX3BlcmlvZCksCiAgICAvLyAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoY291cG9uX3BlcmlvZCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkYXlfY291bnRfZmFjdG9yX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBpZiBkdWVfY291cG9ucyA+PSBVSW50NjQoMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6ODMKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAyCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAyCiAgICBiIGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuY291cG9uX2R1ZV9kYXRlKGNvdXBvbjogdWludDY0KSAtPiB1aW50NjQ6CmNvdXBvbl9kdWVfZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo3NS03NgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjb3Vwb25fZHVlX2RhdGUoc2VsZiwgY291cG9uOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyByZXR1cm4gc2VsZi5pc3N1YW5jZV9kYXRlICsgY291cG9uICogc2VsZi5jb3Vwb25fcGVyaW9kCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9wZXJpb2QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgICsKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzM1LTMzOAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzM5CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlLm5hdGl2ZQogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQucGF5X2NvdXBvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2luZm86IGJ5dGVzKSAtPiBieXRlczoKcGF5X2NvdXBvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOTQtMTk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwYXlfY291cG9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2luZm86IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IHR5cC5QYXltZW50UmVzdWx0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIxNy0yMTgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZXN0cmljdCBjYWxsZXIgYXV0aG9yaXphdGlvbgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5PX1VOSVRTCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMjQKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjI1CiAgICAvLyBhY2NvdW50X3BhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gYXNzZXJ0IGR1ZV9jb3Vwb25zID4gYWNjb3VudF9wYWlkX2NvdXBvbnMsIGVyci5OT19EVUVfQ09VUE9OCiAgICBzd2FwCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjb3Vwb24gdG8gcGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjI3LTIzMAogICAgLy8gIyBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgdmVyaWZ5IGlmIG90aGVyIGFjY291bnRzIGFyZSBzdGlsbCB3YWl0aW5nIGZvciB0aGUgcGF5bWVudCBvZiBwcmV2aW91cyBjb3Vwb25zCiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZCgKICAgIC8vICAgICBhY2NvdW50X3BhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLlBFTkRJTkdfQ09VUE9OX1BBWU1FTlQKICAgIGNhbGxzdWIgYWxsX2R1ZV9jb3Vwb25zX3BhaWQKICAgIGFzc2VydCAvLyBQZW5kaW5nIGR1ZSBjb3Vwb24gcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzExCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMgogICAgLy8gQXNzZXQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMS0zMTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzExLTMxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIC8vICAgICBBc3NldChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCkKICAgIC8vICkKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZQogICAgYnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTQKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDYgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDE0CiAgICBpbnRjXzEgLy8gMQoKcGF5X2NvdXBvbl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaWYgc2VsZi5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IHBheV9jb3Vwb25fZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMzUKICAgIC8vIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHByaW5jaXBhbF9hbW91bnQgKiBzZWxmLmludGVyZXN0X3JhdGUgLy8gY3N0LkJQUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgICoKICAgIGludGMgNSAvLyAxMDAwMAogICAgLwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjEKICAgIC8vIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjAKICAgIC8vIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5iYWxhbmNlKAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjAtMzIyCiAgICAvLyBBc3NldChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCkuYmFsYW5jZSgKICAgIC8vICAgICBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyMC0zMjMKICAgIC8vIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5iYWxhbmNlKAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICkKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgMQogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxOS0zMjQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgQXNzZXQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLmJhbGFuY2UoCiAgICAvLyAgICAgICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICAgICApCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMzktMjQwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIHRoZSBzYW1lIGFzc2V0IGZvciBkZW5vbWluYXRpb24gYW5kIHNldHRsZW1lbnQsIG5vIGNvbnZlcnNpb24gbmVlZGVkCiAgICAvLyBzZWxmLnBheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHBheW1lbnRfYW1vdW50KQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjgtMzMzCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzMgogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyOQogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjgKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyOC0zMzMKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCnBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zLm5hdGl2ZSArIDEKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0NS0yNDcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjQ1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0NS0yNDcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiA0OAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYWlkX2NvdXBvbl91bml0cyBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBieXRlYyAyMyAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTEKICAgIC8vIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjQ5LTI1MwogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICAvLyAgICAgdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mby5jb3B5KCksICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpwYXlfY291cG9uX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0Mi0yNDMKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUAzCgpwYXlfY291cG9uX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwYXlfY291cG9uX2Jvb2xfbWVyZ2VAMTUKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6CmFsbF9kdWVfY291cG9uc19wYWlkOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjkwLTkxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFsbF9kdWVfY291cG9uc19wYWlkKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo5MgogICAgLy8gcmV0dXJuIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgPj0gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIGR1ZV9jb3Vwb25zCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBhaWRfY291cG9uX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICA+PQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDEtMzQyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQ0CiAgICAvLyBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0My0zNDUKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC51cGRhdGVfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlOiBieXRlcykgLT4gYnl0ZXM6CnVwZGF0ZV9pbnRlcmVzdF9yYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI1NS0yNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHVwZGF0ZV9pbnRlcmVzdF9yYXRlKHNlbGYsIGludGVyZXN0X3JhdGU6IGFyYzQuVUludDY0KSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2MwogICAgLy8gY2FsbGVyIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICBieXRlYyAyNiAvLyAweDUyMzgzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTYzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2My0xNjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHVwZGF0ZV9pbnRlcmVzdF9yYXRlX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY0CiAgICAvLyBhbmQgc2VsZi5pbnRlcmVzdF9vcmFjbGVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3Rfb3JhY2xlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjQtMTY1CiAgICAvLyBhbmQgc2VsZi5pbnRlcmVzdF9vcmFjbGVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY0LTE2NgogICAgLy8gYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHVwZGF0ZV9pbnRlcmVzdF9yYXRlX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY2CiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3Rfb3JhY2xlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjUtMTY2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5pbnRlcmVzdF9vcmFjbGVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY0LTE2NgogICAgLy8gYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHVwZGF0ZV9pbnRlcmVzdF9yYXRlX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnVwZGF0ZV9pbnRlcmVzdF9yYXRlX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2Mi0xNjcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICAvLyAgICAgYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5pbnRlcmVzdF9vcmFjbGVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjczCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNzQKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNzYKICAgIC8vIGFzc2VydCBzZWxmLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zKSwgZXJyLlBFTkRJTkdfQ09VUE9OX1BBWU1FTlQKICAgIGNhbGxzdWIgYWxsX2R1ZV9jb3Vwb25zX3BhaWQKICAgIGFzc2VydCAvLyBQZW5kaW5nIGR1ZSBjb3Vwb24gcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI3OC0yNzkKICAgIC8vICMgVXBkYXRlIGludGVyZXN0IHJhdGUKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGJ5dGVjIDUgLy8gImludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI4MAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnVwZGF0ZV9pbnRlcmVzdF9yYXRlX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHVwZGF0ZV9pbnRlcmVzdF9yYXRlX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyODItMjg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlOgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMDMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzAzLTMwNAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMDQKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMDMtMzA0CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMwMi0zMDUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksIGVyci5OT19QUklNQVJZX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMDgKICAgIC8vIDAgPCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWMgNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI+CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANwogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGI+PQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIDAgPCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1VOSVRTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhbW91bnQgb2YgdW5pdHMgZm9yIHRoZSBhY2NvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzEzCiAgICAvLyBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMxMS0zMTQKICAgIC8vICMgVmFsdWUgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uCiAgICAvLyBhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUgPSBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMTUtMzE2CiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0IGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbgogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzE3CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyMC0zMjEKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyMgogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzIzCiAgICAvLyBpZiBzZWxmLmlzX2FjY3J1aW5nX2ludGVyZXN0KCk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMjQKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMjUtMzI3CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gc2VsZi5hY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZSwgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDYKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzI4CiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMjkKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSAzCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzMxCiAgICAvLyB1bml0c192YWx1ZT1hcmM0LlVJbnQ2NChhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUpLAogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzIKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICBmcmFtZV9kaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICBmcmFtZV9kaWcgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzNQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzMtMzM2CiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzMwLTMzNwogICAgLy8gcmV0dXJuIHR5cC5DdXJyZW50VW5pdHNWYWx1ZSgKICAgIC8vICAgICB1bml0c192YWx1ZT1hcmM0LlVJbnQ2NChhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUpLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICAvLyAgICAgZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAOAoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmlzX2FjY3J1aW5nX2ludGVyZXN0KCkgLT4gdWludDY0Ogppc19hY2NydWluZ19pbnRlcmVzdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjMtMTI0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGlzX2FjY3J1aW5nX2ludGVyZXN0KHNlbGYpIC0+IGJvb2w6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjUKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMCBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICA+CiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCmlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTI1CiAgICAvLyByZXR1cm4gc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID4gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5nZXRfcGF5bWVudF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9wYXltZW50X2Ftb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzktMzQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfcGF5bWVudF9hbW91bnQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5QYXltZW50QW1vdW50czoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzU1CiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNTYKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM1NS0zNTYKICAgIC8vIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM1NwogICAgLy8gLy8gY3N0LkJQUwogICAgaW50YyA1IC8vIDEwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzU1LTM1NwogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAvLyBjc3QuQlBTCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzYwCiAgICAvLyBpbnRlcmVzdD1hcmM0LlVJbnQ2NChpbnRlcmVzdF9hbW91bnQpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM2MQogICAgLy8gcHJpbmNpcGFsPWFyYzQuVUludDY0KCksCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM1OS0zNjIKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9YXJjNC5VSW50NjQoaW50ZXJlc3RfYW1vdW50KSwKICAgIC8vICAgICBwcmluY2lwYWw9YXJjNC5VSW50NjQoKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuZ2V0X2NvdXBvbnNfc3RhdHVzKCkgLT4gYnl0ZXM6CmdldF9jb3Vwb25zX3N0YXR1czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNjQtMzY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfY291cG9uc19zdGF0dXMoc2VsZikgLT4gdHlwLkNvdXBvbnNJbmZvOgogICAgcHJvdG8gMCAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpIGVsc2UgVUludDY0KCkKICAgIGJ6IGdldF9jb3Vwb25zX3N0YXR1c190ZXJuYXJ5X2ZhbHNlQDIKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuIHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zICsgMSkKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzc1CiAgICAvLyBhbGxfZHVlX2NvdXBvbnNfcGFpZCA9IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoZHVlX2NvdXBvbnMpCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzYKICAgIC8vIG51bWVyYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzc3CiAgICAvLyBkZW5vbWluYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzc4CiAgICAvLyBpZiBzZWxmLmlzX2FjY3J1aW5nX2ludGVyZXN0KCk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzc5CiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIDIKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4MAogICAgLy8gbnVtZXJhdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzgxCiAgICAvLyBkZW5vbWluYXRvciA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IubmF0aXZlCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2NvdXBvbnNfc3RhdHVzX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODMKICAgIC8vIHRvdGFsX2NvdXBvbnM9YXJjNC5VSW50NjQoc2VsZi50b3RhbF9jb3Vwb25zKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzg0CiAgICAvLyBkdWVfY291cG9ucz1hcmM0LlVJbnQ2NChkdWVfY291cG9ucyksCiAgICBmcmFtZV9kaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4NQogICAgLy8gbmV4dF9jb3Vwb25fZHVlX2RhdGU9YXJjNC5VSW50NjQobmV4dF9jb3Vwb25fZHVlX2RhdGUpLAogICAgZnJhbWVfZGlnIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODcKICAgIC8vIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODgKICAgIC8vIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzg2LTM4OQogICAgLy8gZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgLy8gKSwKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM5MAogICAgLy8gYWxsX2R1ZV9jb3Vwb25zX3BhaWQ9YXJjNC5Cb29sKGFsbF9kdWVfY291cG9uc19wYWlkKSwKICAgIGJ5dGVjIDYgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAwCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODItMzkxCiAgICAvLyByZXR1cm4gdHlwLkNvdXBvbnNJbmZvKAogICAgLy8gICAgIHRvdGFsX2NvdXBvbnM9YXJjNC5VSW50NjQoc2VsZi50b3RhbF9jb3Vwb25zKSwKICAgIC8vICAgICBkdWVfY291cG9ucz1hcmM0LlVJbnQ2NChkdWVfY291cG9ucyksCiAgICAvLyAgICAgbmV4dF9jb3Vwb25fZHVlX2RhdGU9YXJjNC5VSW50NjQobmV4dF9jb3Vwb25fZHVlX2RhdGUpLAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYWxsX2R1ZV9jb3Vwb25zX3BhaWQ9YXJjNC5Cb29sKGFsbF9kdWVfY291cG9uc19wYWlkKSwKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpIGVsc2UgVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmdldF90aW1lX3BlcmlvZHMoKSAtPiBieXRlczoKZ2V0X3RpbWVfcGVyaW9kczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozOTMtMzk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfdGltZV9wZXJpb2RzKHNlbGYpIC0+IHR5cC5UaW1lUGVyaW9kczoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gdGltZV9wZXJpb2RzID0gdHlwLlRpbWVQZXJpb2RzKCkKICAgIGJ5dGVjIDMyIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MDIKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfcGVyaW9kc19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MDMKICAgIC8vIHRpbWVfcGVyaW9kcyA9IHNlbGYudGltZV9wZXJpb2RzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMjQgLy8gMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfcGVyaW9kcyBleGlzdHMKCmdldF90aW1lX3BlcmlvZHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kcwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NyZWF0ZShhcnJhbmdlcjogYnl0ZXMsIG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU0LTQ1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgYXNzZXRfY3JlYXRlKHNlbGYsIGFycmFuZ2VyOiBhcmM0LkFkZHJlc3MsIG1ldGFkYXRhOiB0eXAuQXNzZXRNZXRhZGF0YSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIubmF0aXZlCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjQKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDI1IC8vICJtZXRhZGF0YSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jb25maWcoZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBieXRlcywgc2V0dGxlbWVudF9hc3NldF9pZDogYnl0ZXMsIHByaW5jaXBhbDogYnl0ZXMsIG1pbmltdW1fZGVub21pbmF0aW9uOiBieXRlcywgZGF5X2NvdW50X2NvbnZlbnRpb246IGJ5dGVzLCBpbnRlcmVzdF9yYXRlOiBieXRlcywgY291cG9uX3JhdGVzOiBieXRlcywgdGltZV9ldmVudHM6IGJ5dGVzLCB0aW1lX3BlcmlvZHM6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzYtNDg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF9jb25maWcoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHByaW5jaXBhbDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgbWluaW11bV9kZW5vbWluYXRpb246IGFyYzQuVUludDY0LAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uOiBhcmM0LlVJbnQ4LAogICAgLy8gICAgIGludGVyZXN0X3JhdGU6IGFyYzQuVUludDE2LAogICAgLy8gICAgIGNvdXBvbl9yYXRlczogdHlwLkNvdXBvblJhdGVzLAogICAgLy8gICAgIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cywKICAgIC8vICAgICB0aW1lX3BlcmlvZHM6IHR5cC5UaW1lUGVyaW9kcywKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDkgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MTcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUxOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU1QVFksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTIwLTUyMQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9kZW5vbWluYXRpb25fYXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtOQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzcKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgZnJhbWVfZGlnIDMKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NS0xNzgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgLy8gKSwgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDggLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGZyYW1lX2RpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI0LTUyNQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHNldHRsZW1lbnRfYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC04CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODgKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODYtMTg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTkzCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTQtMjAwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTkKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTYKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTcKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk4CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTQtMTk1CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0yMDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzAKICAgIC8vIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgZnJhbWVfZGlnIC03CiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTYKICAgIGJ0b2kKICAgIGR1cDIKICAgICUKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyOC01MzEKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJpbmNpcGFsLm5hdGl2ZSAlIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZSA9PSAwCiAgICAvLyApLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIE1pbmltdW0gZGVub21pbmF0aW9uIGlzIG5vdCBhIGRpdmlzb3Igb2YgcHJpbmNpcGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgYnl0ZWMgMTEgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbC5uYXRpdmUgLy8gbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlCiAgICAvCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTM1LTUzNgogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNgogICAgLy8gVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIGludGNfMiAvLyAxMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBibnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICBwdXNoaW50IDI1NSAvLyAyNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNwoKYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTIKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBkYXlfY291bnRfY29udmVudGlvbgogICAgYnl0ZWMgMTIgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzktNTQwCiAgICAvLyAjIFNldCBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLmFzc2VydF9pbnRlcmVzdF9yYXRlKGludGVyZXN0X3JhdGUubmF0aXZlKQogICAgZnJhbWVfZGlnIC00CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTYKICAgIC8vIGFzc2VydCBpbnRlcmVzdF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9JTlRFUkVTVF9SQVRFCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjAKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDUgLy8gImludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI0CiAgICAvLyBhc3NlcnQgbm90IGNvdXBvbl9yYXRlcy5sZW5ndGgsIGVyci5JTlZBTElEX0NPVVBPTl9SQVRFUwogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIENvdXBvbiByYXRlcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gY291cG9uX3JhdGVzLmxlbmd0aAogICAgYnl0ZWMgOSAvLyAidG90YWxfY291cG9ucyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjkKICAgIC8vIGlmIHNlbGYudG90YWxfY291cG9uczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjMwCiAgICAvLyBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZSA9IGNvdXBvbl9yYXRlcy5jb3B5KCkKICAgIGJ5dGVjIDMzIC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAzMyAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGZyYW1lX2RpZyAtMwogICAgYm94X3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NDkKICAgIC8vIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCAzIC8vIDMKICAgICsKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NDctNTAKICAgIC8vICMgVGhlIHBlcnBldHVhbCBib25kIGhhcyB1bmRlZmluZWQgY291cG9ucyAodG90YWxfY291cG9ucyA9IDApIGFuZCBubyBtYXR1cml0eSBkYXRlCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDkKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjAKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDI3IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjcgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEtMjYzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjYxLTI2MwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjQtMjY2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDIwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjQtMjY2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NwogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gdGltZV9ldmVudHNbY2ZnLklTU1VBTkNFX0RBVEVfSURYXS5uYXRpdmUKICAgIGV4dHJhY3QgMTYgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5LTI3MAogICAgLy8gIyBTb21lIEQtQVNBIG1heSBub3QgaGF2ZSBhIG1hdHVyaXR5IGRhdGUgKGUuZy4sIHBlcnBldHVhbHMpCiAgICAvLyBpZiB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgICsKICAgID09CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjcxCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDE2IC8vICJtYXR1cml0eV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjU0LTU1CiAgICAvLyAjIFRoZSBwZXJwZXR1YWwgYm9uZCBkZWZpbmVzIGEgc2luZ2xlIHRpbWUgcGVyaW9kIGZvciB0aGUgY291cG9uIGR1cmF0aW9uIHdpdGggdW5saW1pdGVkIHJlcGV0aXRpb25zCiAgICAvLyBhc3NlcnQgdGltZV9wZXJpb2RzLmxlbmd0aCA9PSBVSW50NjQoMSksIGVyci5JTlZBTElEX1RJTUVfUEVSSU9EUwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo1NgogICAgLy8gY291cG9uX3BlcmlvZF9kdXJhdGlvbiA9IHRpbWVfcGVyaW9kc1swXVswXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGV4dHJhY3QgMCAxNiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NTcKICAgIC8vIHJlcGV0aXRpb25zID0gdGltZV9wZXJpb2RzWzBdWzFdLm5hdGl2ZQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NTgKICAgIC8vIGFzc2VydCBjb3Vwb25fcGVyaW9kX2R1cmF0aW9uID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRF9EVVJBVElPTgogICAgc3dhcAogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kIGR1cmF0aW9ucyBtdXN0IGJlIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NTkKICAgIC8vIGFzc2VydCByZXBldGl0aW9ucyA9PSBVSW50NjQoMCksIGVyci5JTlZBTElEX1RJTUVfUEVSSU9EX1JFUEVUSVRJT05TCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2QgcmVwZXRpdGlvbnMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NjMKICAgIC8vIHNlbGYudGltZV9wZXJpb2RzLnZhbHVlID0gdGltZV9wZXJpb2RzLmNvcHkoKQogICAgYnl0ZWMgMjQgLy8gMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDI0IC8vIDB4NzQ2OTZkNjU1MDY1NzI2OTZmNjQ3MwogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NjQKICAgIC8vIHNlbGYuY291cG9uX3BlcmlvZCA9IHNlbGYudGltZV9wZXJpb2RzLnZhbHVlWzBdWzBdLm5hdGl2ZQogICAgYnl0ZWMgMjQgLy8gMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX3BlcmlvZHMgZXhpc3RzCiAgICBleHRyYWN0IDIgMAogICAgZXh0cmFjdCAwIDE2IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieXRlYyAxNyAvLyAiY291cG9uX3BlcmlvZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50Y18yIC8vIDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUAxOAoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNS0xMTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTcKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzgtMjM5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2VsZiwgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzKSAtPiBOb25lOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQxCiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQyCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDEtMjQyCiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDAtMjQzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vICAgICA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ0CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDQKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDYKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDg6CiAgICBwdXNoaW50IDc1IC8vIDc1CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDE0CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMzQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAzNCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDgKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW190XS5uYXRpdmUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUwCiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tfdCArIDFdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUyCiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIHB1c2hpbnQgMjU1IC8vIDI1NQogICAgIT0KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTMtMjU0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTMtMjU2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgLy8gICAgIGNzdC5EQVlfMl9TRUMKICAgIC8vICkgPT0gMCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0QKICAgIGludGMgNiAvLyA4NjQwMAogICAgJQogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBpbiBBY3R1YWwvQWN0dWFsIGRheSBjb3VudCBjb252ZW50aW9uIG11c3QgYmUgbXVsdGlwbGVzIG9mIGEgZGF5IChpbiBzZWNvbmRzKQogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANjoKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1OC01NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMoCiAgICAvLyAgICAgc2VsZiwgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMKICAgIC8vICkgLT4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTc5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNyAvLyAyMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgzCiAgICAvLyBhc3NlcnQgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPj0gMSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NAogICAgLy8gaWYgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPiAxOgogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NQogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0xCiAgICBmcmFtZV9idXJ5IDEKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NwogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTg4LTU5MAogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTg3LTU5MAogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBkaWcgMQogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4Ni01OTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyAgICAgPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gICAgIF0ubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfT1BFTklOR19EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IG9wZW5pbmcgZGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkyCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDE0IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5Mi01OTQKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk1CiAgICAvLyBpZiBzZWxmLm1hdHVyaXR5X2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTkKICAgIC8vIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgtNjAwCiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTctNjAwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk2LTYwMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vICAgICA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9DTE9TVVJFX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgY2xvc3VyZSBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDIKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAyLTYwNAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNi02MDgKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTAKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDktNjExCiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA1LTYxMgogICAgLy8gcmV0dXJuIHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZSgKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2lnbl9yb2xlKHJvbGVfYWRkcmVzczogYnl0ZXMsIHJvbGU6IGJ5dGVzLCBjb25maWc6IGJ5dGVzKSAtPiBieXRlczoKYXNzaWduX3JvbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTQtNjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NpZ25fcm9sZSgKICAgIC8vICAgICBzZWxmLCByb2xlX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcm9sZTogYXJjNC5VSW50OCwgY29uZmlnOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzYKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzOAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzkKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MCAvLyA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0MAogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDIKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MCAvLyA3MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0MwogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogYXNzaWduX3JvbGVfYm9vbF9mYWxzZUA3Cgphc3NpZ25fcm9sZV9ib29sX3RydWVANjoKICAgIGludGNfMSAvLyAxCgphc3NpZ25fcm9sZV9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NgogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAgLy8gMjAsIDQwLCA1MCwgNjAsIDcwLCA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ1LTY3NAogICAgLy8gbWF0Y2ggcm9sZS5uYXRpdmU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCAoCiAgICAvLyAgICAgICAgICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgICAgICBjb25maWcubmF0aXZlCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCAoCiAgICAvLyAgICAgICAgICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKCkKICAgIGZyYW1lX2RpZyAwCiAgICBtYXRjaCBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8wQDkgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMUAxMCBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMyBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV81QDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzQKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjgKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIGJ5dGVjIDI2IC8vIDB4NTIzODMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY3LTY2OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzEKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3MC02NzIKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2NAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjggLy8gMHg1MjM3MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY1CiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8zQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjkgLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYyCiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMCAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTgKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1Ny02NTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUwCiAgICAvLyByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICBieXRlYyAzMSAvLyAweDUyMzQzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OS02NTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUzCiAgICAvLyBjb25maWcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTItNjU0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcy5uYXRpdmUKICAgIGJ5dGVjIDE4IC8vIDB4NTIzMjMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzaWduX3JvbGVfYm9vbF9tZXJnZUA4CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EucmV2b2tlX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMpIC0+IGJ5dGVzOgpyZXZva2Vfcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3Ny02NzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHJldm9rZV9yb2xlKHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4KSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTYKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk3CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5OAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5OQogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMQogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMgogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IHJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANgoKcmV2b2tlX3JvbGVfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk3LTcwMwogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA1LTcwNgogICAgLy8gIyBBcnJhbmdlciByb2xlIGNhbiBub3QgYmUgcmV2b2tlZCAoanVzdCByb3RhdGVkKQogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwIC8vIDQwLCA1MCwgNjAsIDcwLCA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA0LTcyMgogICAgLy8gbWF0Y2ggcm9sZS5uYXRpdmU6CiAgICAvLyAgICAgIyBBcnJhbmdlciByb2xlIGNhbiBub3QgYmUgcmV2b2tlZCAoanVzdCByb3RhdGVkKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQVVUSE9SSVRZICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfSU5URVJFU1RfT1JBQ0xFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKCkKICAgIGZyYW1lX2RpZyAwCiAgICBtYXRjaCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMUA5IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzJAMTAgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjYgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIwCiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfSU5URVJFU1RfT1JBQ0xFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICBzd2FwCiAgICByZXRzdWIKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjggLy8gMHg1MjM3MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE3CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQVVUSE9SSVRZICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzJAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI5IC8vIDB4NTIzNjMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzAgLy8gMHg1MjM1MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzExCiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMxIC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYiByZXZva2Vfcm9sZV9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5vcGVuX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6Cm9wZW5fYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNS03MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wZW5fYWNjb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNyAvLyAyMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDcKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ4CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUxLTc1NwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MwogICAgLy8gdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU0CiAgICAvLyB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUxLTc1NwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NQogICAgLy8gcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUxLTc1NwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NgogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgYnl0ZWMgNiAvLyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU4CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE5LTEyMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDMxIC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIzLTEyNgogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNC0xMjUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQtMTI2CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNS0xMjYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQtMTI2CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuY2xvc2VfYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKY2xvc2VfYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2MC03NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5UdXBsZVthcmM0LlVJbnQ2NCwgYXJjNC5VSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzc5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODIKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MwogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlQgKyBob2xkaW5nX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4NAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBjbG9zZWRfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1OQogICAgLy8gaWYgc2VsZi5jaXJjdWxhdGluZ191bml0cyA9PSAwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgYm56IGNsb3NlX2FjY291bnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjAKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjIDcgLy8gMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xvc2VfYWNjb3VudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODcKICAgIC8vIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg2LTc4OAogICAgLy8gcmV0dXJuIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIC8vICkKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EucHJpbWFyeV9kaXN0cmlidXRpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTAtNzkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODQtMjg3CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NS0yODYKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg3CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg2LTI4NwogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg3CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODMtMjg4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzMKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBieXRlYyAzMCAvLyAweDUyMzUzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzMtMTM2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM1CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNS0xMzYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNC0xMzYKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzItMTM3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgxOAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIwCiAgICAvLyBhc3NlcnQgdW5pdHMubmF0aXZlID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyMgogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjEtODIzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI1CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICs9IHVuaXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNi04MjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNi04MjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IGFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBzd2FwCiAgICByZXBsYWNlMiA0MAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMwCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyAtIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgLQogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYXNzZXRfc3VzcGVuc2lvbihzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzItODMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYXNzZXRfc3VzcGVuc2lvbihzZWxmLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0NgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDcKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KHN1c3BlbmRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDIxIC8vICJzdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ5LTE1MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNzMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzLTE1NgogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NC0xNTUKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU2CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NS0xNTYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU2CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUyLTE1NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vICAgICBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2FjY291bnRfc3VzcGVuc2lvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2FjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1MC04NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hY2NvdW50X3N1c3BlbnNpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHN1c3BlbmRlZDogYXJjNC5Cb29sCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGludGMgNCAvLyA0NDgKICAgIHN3YXAKICAgIHNldGJpdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfZGVmYXVsdF9zdGF0dXMoZGVmYXVsdGVkOiBieXRlcykgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODczLTg3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2RlZmF1bHRfc3RhdHVzKHNlbGYsIGRlZmF1bHRlZDogYXJjNC5Cb29sKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBieXRlYyAyOSAvLyAweDUyMzYzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDMtMTQ2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1LTE0NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Mi0xNDcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gICAgIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODUKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KGRlZmF1bHRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9pbmZvKCkgLT4gYnl0ZXM6CmdldF9hc3NldF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg3LTg4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2luZm8oc2VsZikgLT4gdHlwLkFzc2V0SW5mbzoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk4CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTkKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAwCiAgICAvLyB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMQogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAyCiAgICAvLyBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMwogICAgLy8gdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNAogICAgLy8gY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA1LTkwNwogICAgLy8gcHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA5CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA4LTkxMAogICAgLy8gcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTExCiAgICAvLyBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEyCiAgICAvLyBtYXR1cml0eV9kYXRlPWFyYzQuVUludDY0KHNlbGYubWF0dXJpdHlfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMwogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE0CiAgICAvLyBkZWZhdWx0ZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5kZWZhdWx0ZWQpKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgIGJ5dGVjIDYgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTctOTE1CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgLy8gKQogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBwdXNoaW50IDYwMSAvLyA2MDEKICAgIHN3YXAKICAgIHNldGJpdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNy05MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNC05MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQyCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIGJ5dGVjIDMyIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0MwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDQKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDI3IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ1CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0Ny05NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTAKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1MQogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ5LTk1MgogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQtOTU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NgogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X3VwZGF0ZSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2Ni00NjcKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgYXNzZXRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MS00NzQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMTAwIDggNDQ4IDEwMDAwIDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NTIzMzMwMjMgInN0YXR1cyIgImNpcmN1bGF0aW5nX3VuaXRzIiAiaXNzdWFuY2VfZGF0ZSIgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbnRlcmVzdF9yYXRlIiAweDAwIDB4MDAwMDAwMDAwMDAwMDAwMCAidG90YWxfY291cG9ucyIgInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIgInVuaXRfdmFsdWUiICJkYXlfY291bnRfY29udmVudGlvbiIgInRvdGFsX3VuaXRzIiAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIgIm1hdHVyaXR5X2RhdGUiICJjb3Vwb25fcGVyaW9kIiAweDUyMzIzMDIzICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiICJzdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJwYWlkX2NvdXBvbl91bml0cyIgMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczICJtZXRhZGF0YSIgMHg1MjM4MzAyMyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDAwIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDEtNDIKICAgIC8vICMgUm9sZSBCYXNlZCBBY2Nlc3MgQ29udHJvbAogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OS02MAogICAgLy8gIyBBc3NldCBDb25maWd1cmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUtNjYKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OC02OQogICAgLy8gIyBTdXBwbHkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzItNzMKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODktOTAKICAgIC8vICMgU3RhdHVzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VNUFRZKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MQogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNS0zNgogICAgLy8gIyBTdGF0ZSBzY2hlbWEgdmFsaWRhdGlvbgogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkdMT0JBTF9CWVRFUywgZXJyLldST05HX0dMT0JBTF9CWVRFUwogICAgdHhuIEdsb2JhbE51bUJ5dGVTbGljZQogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX3VpbnQgPT0gY2ZnLkdMT0JBTF9VSU5UUywgZXJyLldST05HX0dMT0JBTF9VSU5UUwogICAgdHhuIEdsb2JhbE51bVVpbnQKICAgIHB1c2hpbnQgMTkgLy8gMTkKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyAjIENvdXBvbnMKICAgIC8vIHNlbGYuY291cG9uX3BlcmlvZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY291cG9uX3BlcmlvZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBzZWxmLnBhaWRfY291cG9uX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDIzIC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDI4CiAgICBwdXNoYnl0ZXNzIDB4NGZkNmEzY2MgMHg4Y2YxNGI1MSAweDgwZTUxZTlmIDB4NDQzNjNkNDkgMHg2N2RiNGYyMCAweGY2YTk2YzhkIDB4MjI5YjcwNmYgMHg2M2Y5OTU4OSAweGQzYTRkNmFiIDB4MWQ2ZmMyNTUgMHhmZWY3NDU2NyAweGI4ZmMxMzkwIDB4M2Q0M2QxZjAgMHhlYmQ5NmIyZiAweDZjODVlM2VlIDB4ZjYzYWNlOGQgMHhiYmNjYTE4YSAweDFhN2JhYmI0IDB4ODBiZmNkZDEgMHhlZDAyNzU5ZiAweGZhZDIxNzNlIDB4MDhlZmVhMzUgMHhkZGNlYzA3YiAvLyBtZXRob2QgImFzc2V0X3RyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwYXlfY291cG9uKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LGJ5dGVbXSkiLCBtZXRob2QgInVwZGF0ZV9pbnRlcmVzdF9yYXRlKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCx1aW50NjQpKSIsIG1ldGhvZCAiZ2V0X3BheW1lbnRfYW1vdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfY291cG9uc19zdGF0dXMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCksYm9vbCkiLCBtZXRob2QgImdldF90aW1lX3BlcmlvZHMoKSh1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJhc3NldF9jcmVhdGUoYWRkcmVzcyxieXRlW10pdm9pZCIsIG1ldGhvZCAiYXNzZXRfY29uZmlnKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAic2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyh1aW50NjRbXSkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2lnbl9yb2xlKGFkZHJlc3MsdWludDgsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmV2b2tlX3JvbGUoYWRkcmVzcyx1aW50OCl1aW50NjQiLCBtZXRob2QgIm9wZW5fYWNjb3VudChhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJjbG9zZV9hY2NvdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9hc3NldF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfYWNjb3VudF9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9kZWZhdWx0X3N0YXR1cyhib29sKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9pbmZvKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wpIiwgbWV0aG9kICJnZXRfYWNjb3VudF9pbmZvKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCkiLCBtZXRob2QgImdldF90aW1lX2V2ZW50cygpdWludDY0W10iLCBtZXRob2QgImdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21ldGFkYXRhKClieXRlW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2Fzc2V0X3RyYW5zZmVyX3JvdXRlQDUgbWFpbl9wYXlfY291cG9uX3JvdXRlQDYgbWFpbl91cGRhdGVfaW50ZXJlc3RfcmF0ZV9yb3V0ZUA3IG1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA4IG1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDkgbWFpbl9nZXRfY291cG9uc19zdGF0dXNfcm91dGVAMTAgbWFpbl9nZXRfdGltZV9wZXJpb2RzX3JvdXRlQDExIG1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyIG1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDEzIG1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUAxNCBtYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDE1IG1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTYgbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTcgbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDE4IG1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMTkgbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMCBtYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMjEgbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMjIgbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyMyBtYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMjQgbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjUgbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNiBtYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyNwoKbWFpbl9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfbWV0YWRhdGEKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAyNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2FjY291bnRfaW5mbwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2RlZmF1bHRfc3RhdHVzX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9kZWZhdWx0X3N0YXR1cwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hY2NvdW50X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2Fzc2V0X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcHJpbWFyeV9kaXN0cmlidXRpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbG9zZV9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBvcGVuX2FjY291bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcmV2b2tlX3JvbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzaWduX3JvbGVfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzaWduX3JvbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X2NvbmZpZ19yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF9jb25maWcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgYXNzZXRfY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX3BlcmlvZHNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfdGltZV9wZXJpb2RzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9jb3Vwb25zX3N0YXR1c19yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9jb3Vwb25zX3N0YXR1cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfcGF5bWVudF9hbW91bnRfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9wYXltZW50X2Ftb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3VwZGF0ZV9pbnRlcmVzdF9yYXRlX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB1cGRhdGVfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wYXlfY291cG9uX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwYXlfY291cG9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X3RyYW5zZmVyX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIG1haW5fYXNzZXRfdXBkYXRlQDI5CiAgICBiIG1haW5fYWZ0ZXJfaWZfZWxzZUAzMAoKbWFpbl9hc3NldF91cGRhdGVAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NC00NjUKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgYXNzZXRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBjYWxsc3ViIGFzc2V0X3VwZGF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmFzc2V0X3RyYW5zZmVyKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NldF90cmFuc2ZlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDUtMTUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF90cmFuc2ZlcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICB1bml0czogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gdW5pdHMubmF0aXZlLAogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkzLTI5NgogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NAogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0LTI5NQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0LTI5NgogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk2CiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTUtMjk2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBmcmFtZV9kaWcgNAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0LTI5NgogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5Mi0yOTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuU0VDT05EQVJZX01BUktFVF9DTE9TRUQKICAgIGFzc2VydCAvLyBTZWNvbmRhcnkgbWFya2V0IGlzIGNsb3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY3LTM2OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0cmFuc2ZlciByaWdodCB0byBELUFTQSBvd25lcnMuIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgcmVsYXkgb24gb3RoZXIKICAgIC8vICMgcm9sZXMsIGV4dGVybmFsIEFwcHMgdGhyb3VnaCBDMkMgY2FsbHMgKGUuZy4sIGFuIG9yZGVyIGJvb2spLCBvciBvZmYtY2hhaW4gdHJhbnNmZXIgYWdlbnRzLgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VuZGVyX2hvbGRpbmdfYWRkcmVzcy5uYXRpdmUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzcwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3NAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZSwgZXJyLlNVU1BFTkRFRAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDcgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3NS0zNzcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5zdXNwZW5kZWQubmF0aXZlLCBlcnIuU1VTUEVOREVECiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDcgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3OQogICAgLy8gdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9kaWcgNQogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3OC0zODAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgLy8gKSwgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODgKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gaWYgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlID4gMDoKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwNAogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwNC0zMDUKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwNC0zMDUKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwMy0zMDYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICAvLyApLCBlcnIuTk9OX0ZVTkdJQkxFX1VOSVRTCiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciB1bml0cyBhcmUgbm90IGZ1bmdpYmxlCgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE3OS0xODAKICAgIC8vICMgVHJhbnNmZXIgaXMgZm9yYmlkZGVuIGluIGNhc2Ugb2YgcGVuZGluZyBjb3Vwb24gcGF5bWVudHMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTgxCiAgICAvLyBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0zCiAgICBkaWcgMQogICAgY2FsbHN1YiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE4My0xODQKICAgIC8vICMgVHJhbnNmZXJyZWQgdW5pdHMgdmFsdWUgKG11c3QgYmUgY29tcHV0ZWQgYmVmb3JlIHRoZSB0cmFuc2ZlcikKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxODUtMTg3CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gc2VsZi5hY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUsIGR1ZV9jb3Vwb25zCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjUKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgLSB1bml0cwogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDIKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNC00MjYKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgLSB1bml0cwogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI0CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI0LTQyNgogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyOAogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICB1bmNvdmVyIDMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNy00MjkKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNwogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI3LTQyOQogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gaWYgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlID09IDA6CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYm56IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IGFyYzQuVUludDY0KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA4IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgNDAKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KCkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiA0OAogICAgYm94X3B1dAoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOTIKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCh1bml0cy5uYXRpdmUgKiBzZW5kZXJfdW5pdF92YWx1ZS5uYXRpdmUgKyBhY2NydWVkX2ludGVyZXN0KQogICAgZnJhbWVfZGlnIDAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyA1CiAgICAqCiAgICBmcmFtZV9kaWcgMwogICAgKwogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDE1Cgphc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTQKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBzZW5kZXJfdW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICByZXBsYWNlMiA0MAogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NS0zOTcKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnBhaWRfY291cG9ucwogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTUKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk1LTM5NwogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0ucGFpZF9jb3Vwb25zCiAgICBzd2FwCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICByZXBsYWNlMiA0OAogICAgYm94X3B1dAogICAgYiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDE3Cgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfZGVmYXVsdGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA3LTEwOAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5kZWZhdWx0ZWQsIGVyci5ERUZBVUxURUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTEtMTEyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIxIC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5jb3VudF9kdWVfY291cG9ucygpIC0+IHVpbnQ2NDoKY291bnRfZHVlX2NvdXBvbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NjYtNjcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291bnRfZHVlX2NvdXBvbnMoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NjgKICAgIC8vIGR1ZV9jb3Vwb25zID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBjdXJyZW50X3RzID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBpZiBjdXJyZW50X3RzID4gc2VsZi5pc3N1YW5jZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBkdWVfY291cG9ucyA9IChjdXJyZW50X3RzIC0gc2VsZi5pc3N1YW5jZV9kYXRlKSAvLyBzZWxmLmNvdXBvbl9wZXJpb2QKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgLQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9wZXJpb2QgZXhpc3RzCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKCmNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo3Mi03MwogICAgLy8gICAgICMgZGl2LWJ5LXplcm86IGNvdXBvbl9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfcGVyaW9kcyBjaGVja3MKICAgIC8vIHJldHVybiBkdWVfY291cG9ucwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdm9pZDoKYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTQtOTcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIGR1ZV9jb3Vwb25zOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPT0gZHVlX2NvdXBvbnMKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5Ojk4LTEwMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPT0gZHVlX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiB1aW50NjQsIGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTI3LTEzMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IFVJbnQ2NCwgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzEtMTMyCiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgYXNzZXJ0IHNhZmVndWFyZHMgdGhlIHN1YnJvdXRpbmUgZnJvbSBmb3JiaWRkZW4gaW52b2NhdGlvbnMKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTMzCiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzQKICAgIC8vIGNvdXBvbl9hY2NydWVkX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzUKICAgIC8vIGNvdXBvbl9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTM3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzgKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNy0xMzgKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzctMTM5CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTQxCiAgICAvLyBjc3QuQlBTICogY291cG9uX3BlcmlvZAogICAgaW50YyA1IC8vIDEwMDAwCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzctMTQyCiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gLy8gKAogICAgLy8gICAgIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICAvLyApICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX3BlcmlvZHMgY2hlY2tzCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTM2LTE0MwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgLy8gICAgICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICAvLyAgICAgLy8gKAogICAgLy8gICAgICAgICBjc3QuQlBTICogY291cG9uX3BlcmlvZAogICAgLy8gICAgICkgICMgZGl2LWJ5LXplcm86IGNvdXBvbl9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfcGVyaW9kcyBjaGVja3MKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gYnl0ZXM6CmRheV9jb3VudF9mYWN0b3I6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTA2LTEwNwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBkYXlfY291bnRfZmFjdG9yKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IHR5cC5EYXlDb3VudEZhY3RvcjoKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMDgtMTA5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGlmIG5vdCBkdWVfY291cG9uczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMTAKICAgIC8vIGFjY3J1aW5nX3N0YXJ0X3RpbWUgPSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMTMKICAgIC8vIGNvdXBvbl9hY2NydWVkX3BlcmlvZCA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIC0gYWNjcnVpbmdfc3RhcnRfdGltZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgc3dhcAogICAgLQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMTQKICAgIC8vIGNvdXBvbl9wZXJpb2QgPSBzZWxmLmNvdXBvbl9wZXJpb2QKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY291cG9uX3BlcmlvZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3BlcmlvZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMTUKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPT0gVUludDY0KGNzdC5EQ0NfQV9BKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpbnRjXzIgLy8gMTAwCiAgICA9PQogICAgc3dhcAogICAgZnJhbWVfYnVyeSA0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJ6IGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDcKICAgIC8vIHJldHVybiB0aW1lX3BlcmlvZCAvLyBVSW50NjQoY3N0LkRBWV8yX1NFQykKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjIDYgLy8gODY0MDAKICAgIC8KICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjIDYgLy8gODY0MDAKICAgIC8KICAgIGZyYW1lX2J1cnkgNAogICAgZnJhbWVfYnVyeSAxCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VANToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExOQogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KGNvdXBvbl9hY2NydWVkX3BlcmlvZCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTIwCiAgICAvLyBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChjb3Vwb25fcGVyaW9kKSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMTgtMTIxCiAgICAvLyByZXR1cm4gdHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChjb3Vwb25fYWNjcnVlZF9wZXJpb2QpLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGNvdXBvbl9wZXJpb2QpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZGF5X2NvdW50X2ZhY3Rvcl9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo4MQogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo4MgogICAgLy8gaWYgZHVlX2NvdXBvbnMgPj0gVUludDY0KDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBieiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLmNvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2J1cnkgMgoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDg6CiAgICBmcmFtZV9kaWcgMgogICAgYiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmNvdXBvbl9kdWVfZGF0ZShjb3Vwb246IHVpbnQ2NCkgLT4gdWludDY0Ogpjb3Vwb25fZHVlX2RhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NzUtNzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291cG9uX2R1ZV9kYXRlKHNlbGYsIGNvdXBvbjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo3NwogICAgLy8gcmV0dXJuIHNlbGYuaXNzdWFuY2VfZGF0ZSArIGNvdXBvbiAqIHNlbGYuY291cG9uX3BlcmlvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY291cG9uX3BlcmlvZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcGVyaW9kIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICArCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWNjb3VudF91bml0c192YWx1ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzMy0zMzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzNwogICAgLy8gcmV0dXJuIHVuaXRzICogc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZS5uYXRpdmUKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLnBheV9jb3Vwb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9pbmZvOiBieXRlcykgLT4gYnl0ZXM6CnBheV9jb3Vwb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTk0LTE5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X2NvdXBvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMTctMjE4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjE5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMjAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMjIKICAgIC8vIHVuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMjMKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5OT19VTklUUwogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjI0CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gYWNjb3VudF9wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMjYKICAgIC8vIGFzc2VydCBkdWVfY291cG9ucyA+IGFjY291bnRfcGFpZF9jb3Vwb25zLCBlcnIuTk9fRFVFX0NPVVBPTgogICAgc3dhcAogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBObyBkdWUgY291cG9uIHRvIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyNy0yMzAKICAgIC8vICMgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHZlcmlmeSBpZiBvdGhlciBhY2NvdW50cyBhcmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHBheW1lbnQgb2YgcHJldmlvdXMgY291cG9ucwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgYWNjb3VudF9wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTIKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTEtMzEzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgLy8gICAgIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTEtMzE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgLy8gICAgIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkKICAgIC8vICkKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZQogICAgYnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTQKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDcgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDE0CiAgICBpbnRjXzEgLy8gMQoKcGF5X2NvdXBvbl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaWYgc2VsZi5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IHBheV9jb3Vwb25fZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMzUKICAgIC8vIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHByaW5jaXBhbF9hbW91bnQgKiBzZWxmLmludGVyZXN0X3JhdGUgLy8gY3N0LkJQUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgICoKICAgIGludGMgNSAvLyAxMDAwMAogICAgLwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjAKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyMC0zMjEKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE5LTMyMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIzOS0yNDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyNi0zMzEKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMwCiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI3CiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjYtMzMxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDUtMjQ3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlICsgMQogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDUtMjQ3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlICsgMQogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDgKICAgIC8vIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgYnl0ZWMgMjMgLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTAKICAgIC8vIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjUxCiAgICAvLyB0aW1lc3RhbXA9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0OS0yNTMKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudFJlc3VsdCgKICAgIC8vICAgICBhbW91bnQ9YXJjNC5VSW50NjQocGF5bWVudF9hbW91bnQpLAogICAgLy8gICAgIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8uY29weSgpLCAgIyBUT0RPOiBBZGQgaW5mbyBvbiBmYWlsZWQgcGF5bWVudAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDEyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKcGF5X2NvdXBvbl9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDItMjQzCiAgICAvLyAjIEFjY291bnRzIHN1c3BlbmRlZCBvciBub3Qgb3B0ZWQgaW4gYXQgdGhlIHRpbWUgb2YgcGF5bWVudHMgbXVzdCBub3Qgc3RhbGwgdGhlIEQtQVNBCiAgICAvLyBwYXltZW50X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYiBwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VAMwoKcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X2NvdXBvbl9ib29sX21lcmdlQDE1CgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0OgphbGxfZHVlX2NvdXBvbnNfcGFpZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo5MC05MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhbGxfZHVlX2NvdXBvbnNfcGFpZChzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnBhaWRfY291cG9uX3VuaXRzID49IHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBkdWVfY291cG9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYWlkX2NvdXBvbl91bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgPj0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdWludDY0OgphY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzM5LTM0MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0MgogICAgLy8gaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDEtMzQzCiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQudXBkYXRlX2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZTogYnl0ZXMpIC0+IGJ5dGVzOgp1cGRhdGVfaW50ZXJlc3RfcmF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTUtMjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB1cGRhdGVfaW50ZXJlc3RfcmF0ZShzZWxmLCBpbnRlcmVzdF9yYXRlOiBhcmM0LlVJbnQ2NCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMjYgLy8gMHg1MjM4MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTYxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2MwogICAgLy8gY2FsbGVyIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjMtMTY2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X29yYWNsZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY0LTE2NQogICAgLy8gYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2NC0xNjYKICAgIC8vIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gPD0gc2VsZi5pbnRlcmVzdF9vcmFjbGVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X29yYWNsZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY1LTE2NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2NC0xNjYKICAgIC8vIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgp1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjItMTY3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gICAgIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mjc0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNzUKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mjc2CiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucyksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNzgtMjc5CiAgICAvLyAjIFVwZGF0ZSBpbnRlcmVzdCByYXRlCiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyODAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjgyLTI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IHR5cC5DdXJyZW50VW5pdHNWYWx1ZToKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzAzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMwMy0zMDQKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzA0CiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzAzLTMwNAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMDItMzA1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyApLCBlcnIuTk9fUFJJTUFSWV9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzA4CiAgICAvLyAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDcKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBiPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzA3LTMwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9VTklUUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYW1vdW50IG9mIHVuaXRzIGZvciB0aGUgYWNjb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMTEtMzE0CiAgICAvLyAjIFZhbHVlIGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbgogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlID0gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzE1LTMxNgogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdCBkdXJpbmcgcHJpbWFyeSBkaXN0cmlidXRpb24KICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gbnVtZXJhdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMTgKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMjAtMzIxCiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMjIKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgY2FsbHN1YiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyMwogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdCgpOgogICAgY2FsbHN1YiBpc19hY2NydWluZ19pbnRlcmVzdAogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzI0CiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzI1LTMyNwogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUsIGR1ZV9jb3Vwb25zCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyA2CiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gbnVtZXJhdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzI5CiAgICAvLyBkZW5vbWluYXRvciA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IubmF0aXZlCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgMwoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gdW5pdHNfdmFsdWU9YXJjNC5VSW50NjQoYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlKSwKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzMyCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PWFyYzQuVUludDY0KGFjY3J1ZWRfaW50ZXJlc3QpLAogICAgZnJhbWVfZGlnIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzQKICAgIC8vIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgZnJhbWVfZGlnIDUKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzUKICAgIC8vIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIGZyYW1lX2RpZyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzMzLTMzNgogICAgLy8gZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgLy8gKSwKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzMC0zMzcKICAgIC8vIHJldHVybiB0eXAuQ3VycmVudFVuaXRzVmFsdWUoCiAgICAvLyAgICAgdW5pdHNfdmFsdWU9YXJjNC5VSW50NjQoYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlKSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PWFyYzQuVUludDY0KGFjY3J1ZWRfaW50ZXJlc3QpLAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDgKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5pc19hY2NydWluZ19pbnRlcmVzdCgpIC0+IHVpbnQ2NDoKaXNfYWNjcnVpbmdfaW50ZXJlc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTIzLTEyNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBpc19hY2NydWluZ19pbnRlcmVzdChzZWxmKSAtPiBib29sOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTI1CiAgICAvLyByZXR1cm4gc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID4gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgYnogaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgppc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gcmV0dXJuIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuZ2V0X3BheW1lbnRfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfcGF5bWVudF9hbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzM5LTM0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3BheW1lbnRfYW1vdW50KHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiB0eXAuUGF5bWVudEFtb3VudHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM1NQogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzU2CiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNTUtMzU2CiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNTcKICAgIC8vIC8vIGNzdC5CUFMKICAgIGludGMgNSAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM1NS0zNTcKICAgIC8vIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgLy8gLy8gY3N0LkJQUwogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM2MAogICAgLy8gaW50ZXJlc3Q9YXJjNC5VSW50NjQoaW50ZXJlc3RfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNjEKICAgIC8vIHByaW5jaXBhbD1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNTktMzYyCiAgICAvLyByZXR1cm4gdHlwLlBheW1lbnRBbW91bnRzKAogICAgLy8gICAgIGludGVyZXN0PWFyYzQuVUludDY0KGludGVyZXN0X2Ftb3VudCksCiAgICAvLyAgICAgcHJpbmNpcGFsPWFyYzQuVUludDY0KCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmdldF9jb3Vwb25zX3N0YXR1cygpIC0+IGJ5dGVzOgpnZXRfY291cG9uc19zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzY0LTM2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2NvdXBvbnNfc3RhdHVzKHNlbGYpIC0+IHR5cC5Db3Vwb25zSW5mbzoKICAgIHByb3RvIDAgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzczCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKSBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSBlbHNlIFVJbnQ2NCgpCiAgICBieiBnZXRfY291cG9uc19zdGF0dXNfdGVybmFyeV9mYWxzZUAyCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICBmcmFtZV9idXJ5IDIKCmdldF9jb3Vwb25zX3N0YXR1c190ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6ODgKICAgIC8vIHJldHVybiBzZWxmLmNvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucyArIDEpCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgY2FsbHN1YiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM3NQogICAgLy8gYWxsX2R1ZV9jb3Vwb25zX3BhaWQgPSBzZWxmLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zKQogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzc2CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM3NwogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM3OAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdCgpOgogICAgY2FsbHN1YiBpc19hY2NydWluZ19pbnRlcmVzdAogICAgYnogZ2V0X2NvdXBvbnNfc3RhdHVzX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM3OQogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAyCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODAKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4MQogICAgLy8gZGVub21pbmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDEKCmdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzgzCiAgICAvLyB0b3RhbF9jb3Vwb25zPWFyYzQuVUludDY0KHNlbGYudG90YWxfY291cG9ucyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4NAogICAgLy8gZHVlX2NvdXBvbnM9YXJjNC5VSW50NjQoZHVlX2NvdXBvbnMpLAogICAgZnJhbWVfZGlnIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODUKICAgIC8vIG5leHRfY291cG9uX2R1ZV9kYXRlPWFyYzQuVUludDY0KG5leHRfY291cG9uX2R1ZV9kYXRlKSwKICAgIGZyYW1lX2RpZyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzg3CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIGZyYW1lX2RpZyA0CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzg4CiAgICAvLyBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4Ni0zODkKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICksCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozOTAKICAgIC8vIGFsbF9kdWVfY291cG9uc19wYWlkPWFyYzQuQm9vbChhbGxfZHVlX2NvdXBvbnNfcGFpZCksCiAgICBieXRlYyA3IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgMAogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzgyLTM5MQogICAgLy8gcmV0dXJuIHR5cC5Db3Vwb25zSW5mbygKICAgIC8vICAgICB0b3RhbF9jb3Vwb25zPWFyYzQuVUludDY0KHNlbGYudG90YWxfY291cG9ucyksCiAgICAvLyAgICAgZHVlX2NvdXBvbnM9YXJjNC5VSW50NjQoZHVlX2NvdXBvbnMpLAogICAgLy8gICAgIG5leHRfY291cG9uX2R1ZV9kYXRlPWFyYzQuVUludDY0KG5leHRfY291cG9uX2R1ZV9kYXRlKSwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIGFsbF9kdWVfY291cG9uc19wYWlkPWFyYzQuQm9vbChhbGxfZHVlX2NvdXBvbnNfcGFpZCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9jb3Vwb25zX3N0YXR1c190ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzczCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKSBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSBlbHNlIFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9jb3Vwb25zX3N0YXR1c190ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5nZXRfdGltZV9wZXJpb2RzKCkgLT4gYnl0ZXM6CmdldF90aW1lX3BlcmlvZHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzkzLTM5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3RpbWVfcGVyaW9kcyhzZWxmKSAtPiB0eXAuVGltZVBlcmlvZHM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MDEKICAgIC8vIHRpbWVfcGVyaW9kcyA9IHR5cC5UaW1lUGVyaW9kcygpCiAgICBieXRlYyAzMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NDAyCiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF90aW1lX3BlcmlvZHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NDAzCiAgICAvLyB0aW1lX3BlcmlvZHMgPSBzZWxmLnRpbWVfcGVyaW9kcy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDI0IC8vIDB4NzQ2OTZkNjU1MDY1NzI2OTZmNjQ3MwogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX3BlcmlvZHMgZXhpc3RzCgpnZXRfdGltZV9wZXJpb2RzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MDQKICAgIC8vIHJldHVybiB0aW1lX3BlcmlvZHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jcmVhdGUoYXJyYW5nZXI6IGJ5dGVzLCBtZXRhZGF0YTogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1Mi00NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGFzc2V0X2NyZWF0ZShzZWxmLCBhcnJhbmdlcjogYXJjNC5BZGRyZXNzLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyLm5hdGl2ZQogICAgYnl0ZWMgMTggLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYyCiAgICAvLyBzZWxmLm1ldGFkYXRhID0gbWV0YWRhdGEubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfY29uZmlnKGRlbm9taW5hdGlvbl9hc3NldF9pZDogYnl0ZXMsIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGJ5dGVzLCBwcmluY2lwYWw6IGJ5dGVzLCBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYnl0ZXMsIGRheV9jb3VudF9jb252ZW50aW9uOiBieXRlcywgaW50ZXJlc3RfcmF0ZTogYnl0ZXMsIGNvdXBvbl9yYXRlczogYnl0ZXMsIHRpbWVfZXZlbnRzOiBieXRlcywgdGltZV9wZXJpb2RzOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDc0LTQ4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzZXRfY29uZmlnKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwcmluY2lwYWw6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG1pbmltdW1fZGVub21pbmF0aW9uOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbjogYXJjNC5VSW50OCwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlOiBhcmM0LlVJbnQxNiwKICAgIC8vICAgICBjb3Vwb25fcmF0ZXM6IHR5cC5Db3Vwb25SYXRlcywKICAgIC8vICAgICB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMsCiAgICAvLyAgICAgdGltZV9wZXJpb2RzOiB0eXAuVGltZVBlcmlvZHMsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA5IDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTE1CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MTYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VNUFRZLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUxOC01MTkKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5hc3NlcnRfZGVub21pbmF0aW9uX2Fzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTkKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc3CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGZyYW1lX2RpZyAzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzUtMTc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIC8vICksIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODIKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjItNTIzCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTgKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODYtMTg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTkzCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0yMDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NgogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk3CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk0LTE5NQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTQtMjAwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI4CiAgICAvLyBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIGZyYW1lX2RpZyAtNwogICAgYnRvaQogICAgZnJhbWVfZGlnIC02CiAgICBidG9pCiAgICBkdXAyCiAgICAlCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjYtNTI5CiAgICAvLyAjIFNldCBQcmluY2lwYWwgYW5kIE1pbmltdW0gRGVub21pbmF0aW9uCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgLy8gKSwgZXJyLklOVkFMSURfTUlOSU1VTV9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBNaW5pbXVtIGRlbm9taW5hdGlvbiBpcyBub3QgYSBkaXZpc29yIG9mIHByaW5jaXBhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMwCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIGJ5dGVjIDExIC8vICJ1bml0X3ZhbHVlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzEKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBwcmluY2lwYWwubmF0aXZlIC8vIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgLwogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMy01MzQKICAgIC8vICMgU2V0IERheS1Db3VudCBDb252ZW50aW9uCiAgICAvLyBzZWxmLmFzc2VydF9kYXlfY291bnRfY29udmVudGlvbihkYXlfY291bnRfY29udmVudGlvbi5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTUKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDYKICAgIC8vIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICBpbnRjXzIgLy8gMTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDQtMjA4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYm56IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDcKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDQtMjA4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDQtMjA4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjEyCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIGJ5dGVjIDEyIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGZyYW1lX2RpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTM3LTUzOAogICAgLy8gIyBTZXQgSW50ZXJlc3QgUmF0ZQogICAgLy8gc2VsZi5hc3NlcnRfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjE2CiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfSU5URVJFU1RfUkFURQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW50ZXJlc3QgcmF0ZSBpcyBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjIwCiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjgKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDkgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI5CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAzMyAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMzMgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9wdXQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQ3LTUwCiAgICAvLyAjIFRoZSBwZXJwZXR1YWwgYm9uZCBoYXMgdW5kZWZpbmVkIGNvdXBvbnMgKHRvdGFsX2NvdXBvbnMgPSAwKSBhbmQgbm8gbWF0dXJpdHkgZGF0ZQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ3CiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjYwCiAgICAvLyBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlID0gdGltZV9ldmVudHMuY29weSgpCiAgICBieXRlYyAyNyAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDI3IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjYxLTI2MwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjYxCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MS0yNjMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0LTI2NgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjQKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAyMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0LTI2NgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjcKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5JU1NVQU5DRV9EQVRFX0lEWF0ubmF0aXZlCiAgICBleHRyYWN0IDE2IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OS0yNzAKICAgIC8vICMgU29tZSBELUFTQSBtYXkgbm90IGhhdmUgYSBtYXR1cml0eSBkYXRlIChlLmcuLCBwZXJwZXR1YWxzKQogICAgLy8gaWYgdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUzoKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIHB1c2hpbnQgNCAvLyA0CiAgICArCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI3MQogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlID0gdGltZV9ldmVudHNbY2ZnLk1BVFVSSVRZX0RBVEVfSURYXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieXRlYyAxNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo1NC01NQogICAgLy8gIyBUaGUgcGVycGV0dWFsIGJvbmQgZGVmaW5lcyBhIHNpbmdsZSB0aW1lIHBlcmlvZCBmb3IgdGhlIGNvdXBvbiBkdXJhdGlvbiB3aXRoIHVubGltaXRlZCByZXBldGl0aW9ucwogICAgLy8gYXNzZXJ0IHRpbWVfcGVyaW9kcy5sZW5ndGggPT0gVUludDY0KDEpLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NTYKICAgIC8vIGNvdXBvbl9wZXJpb2RfZHVyYXRpb24gPSB0aW1lX3BlcmlvZHNbMF1bMF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBleHRyYWN0IDAgMTYgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjU3CiAgICAvLyByZXBldGl0aW9ucyA9IHRpbWVfcGVyaW9kc1swXVsxXS5uYXRpdmUKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBhc3NlcnQgY291cG9uX3BlcmlvZF9kdXJhdGlvbiA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RfRFVSQVRJT04KICAgIHN3YXAKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZCBkdXJhdGlvbnMgbXVzdCBiZSBzdHJpY3RseSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBhc3NlcnQgcmVwZXRpdGlvbnMgPT0gVUludDY0KDApLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRF9SRVBFVElUSU9OUwogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kIHJlcGV0aXRpb25zIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBzZWxmLnRpbWVfcGVyaW9kcy52YWx1ZSA9IHRpbWVfcGVyaW9kcy5jb3B5KCkKICAgIGJ5dGVjIDI0IC8vIDB4NzQ2OTZkNjU1MDY1NzI2OTZmNjQ3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAyNCAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBzZWxmLmNvdXBvbl9wZXJpb2QgPSBzZWxmLnRpbWVfcGVyaW9kcy52YWx1ZVswXVswXS5uYXRpdmUKICAgIGJ5dGVjIDI0IC8vIDB4NzQ2OTZkNjU1MDY1NzI2OTZmNjQ3MwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9wZXJpb2RzIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIGV4dHJhY3QgMCAxNiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGludGNfMiAvLyAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTUtMTE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM4LTIzOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlbGYsIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cykgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MQogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MgogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQxLTI0MgogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQwLTI0MwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyAgICAgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRQogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDAKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ0CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4OgogICAgcHVzaGludCA3NSAvLyA3NQogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxNAogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDM0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ5CiAgICAvLyB0aW1lX2kgPSB0aW1lX2V2ZW50c1tfdF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gdGltZV9mID0gdGltZV9ldmVudHNbX3QgKyAxXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTEKICAgIC8vIGFzc2VydCB0aW1lX2YgPiB0aW1lX2ksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiAhPSBVSW50NjQoY3N0LkRDQ19DT05UKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBwdXNoaW50IDI1NSAvLyAyNTUKICAgICE9CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUzLTI1NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUzLTI1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIC8vICAgICBjc3QuREFZXzJfU0VDCiAgICAvLyApID09IDAsIGVyci5JTlZBTElEX1RJTUVfUEVSSU9ECiAgICBpbnRjIDYgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTYtNTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU3NwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDcgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTc4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTc5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4MQogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODIKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODMKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODUKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4Ni01ODgKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NS01ODgKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODQtNTg5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTAtNTkyCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MwogICAgLy8gaWYgc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk1CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk3CiAgICAvLyBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk2LTU5OAogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk1LTU5OAogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBkaWcgMQogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NC01OTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5tYXR1cml0eV9kYXRlCiAgICAvLyAgICAgPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gICAgIF0ubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfQ0xPU1VSRV9EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IGNsb3N1cmUgZGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAwCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMC02MDIKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDUKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDQtNjA2CiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA4CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA3LTYwOQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMy02MTAKICAgIC8vIHJldHVybiB0eXAuU2Vjb25kYXJ5TWFya2V0U2NoZWR1bGUoCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NpZ25fcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcywgY29uZmlnOiBieXRlcykgLT4gYnl0ZXM6CmFzc2lnbl9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEyLTYxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzaWduX3JvbGUoCiAgICAvLyAgICAgc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgsIGNvbmZpZzogYXJjNC5EeW5hbWljQnl0ZXMKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzMwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzYKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzgKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IGFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANwoKYXNzaWduX3JvbGVfYm9vbF90cnVlQDY6CiAgICBpbnRjXzEgLy8gMQoKYXNzaWduX3JvbGVfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDQKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwIC8vIDIwLCA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0My02NzIKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcy5uYXRpdmUKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgKAogICAgLy8gICAgICAgICAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgICAgICBjb25maWcubmF0aXZlCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgKAogICAgLy8gICAgICAgICAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgICAgICBjb25maWcubmF0aXZlCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5IGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTAgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8zQDEyIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzRAMTMgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjcyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV81QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY2CiAgICAvLyByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICBieXRlYyAyNiAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2NS02NjcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY5CiAgICAvLyBjb25maWcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjgtNjcwCiAgICAvLyBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjczCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICBzd2FwCiAgICByZXRzdWIKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzRAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2MwogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1OQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI5IC8vIDB4NTIzNjMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2MAogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzAgLy8gMHg1MjM1MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU2CiAgICAvLyBjb25maWcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTUtNjU3CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OAogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgYnl0ZWMgMzEgLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDctNjQ5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUwLTY1MgogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8wQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDUKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnJldm9rZV9yb2xlKHJvbGVfYWRkcmVzczogYnl0ZXMsIHJvbGU6IGJ5dGVzKSAtPiBieXRlczoKcmV2b2tlX3JvbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzUtNjc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiByZXZva2Vfcm9sZShzZWxmLCByb2xlX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcm9sZTogYXJjNC5VSW50OCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5MwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTYKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MCAvLyA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTcKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUtNzAxCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5OAogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTkKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MCAvLyA3MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiByZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDYKCnJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCnJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NS03MDEKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMy03MDQKICAgIC8vICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MCAvLyA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMi03MjAKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTEgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIwCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzODMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzExCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOSAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTIKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMwIC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMSAvLyAweDUyMzQzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDYKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Eub3Blbl9hY2NvdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpvcGVuX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjMtNzI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcGVuX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDcgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ1CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDcKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEKICAgIC8vIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICBieXRlYyA4IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MgogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTMKICAgIC8vIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTQKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIGJ5dGVjIDcgLy8gMHgwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOS0xMjAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICBieXRlYyAzMSAvLyAweDUyMzQzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMy0xMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9tYW5hZ2VyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQtMTI1CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9tYW5hZ2VyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjUtMTI2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMi0xMjcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmNsb3NlX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmNsb3NlX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTgtNzYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbG9zZV9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVHVwbGVbYXJjNC5VSW50NjQsIGFyYzQuVUludDY0XToKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzc2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzgwCiAgICAvLyBjbG9zZWRfdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODEKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UICsgaG9sZGluZ19hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODIKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNTcKICAgIC8vIGlmIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPT0gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGJueiBjbG9zZV9hY2NvdW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU4CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50YyA3IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmNsb3NlX2FjY291bnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg1CiAgICAvLyAoYXJjNC5VSW50NjQoY2xvc2VkX3VuaXRzKSwgYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApKQogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4NC03ODYKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKAogICAgLy8gICAgIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICAvLyApCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnByaW1hcnlfZGlzdHJpYnV0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg4LTc5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcHJpbWFyeV9kaXN0cmlidXRpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg0LTI4NwogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1LTI4NwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODcKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4Ni0yODcKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBmcmFtZV9kaWcgMgogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1LTI4NwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgzLTI4OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgYnl0ZWMgMzAgLy8gMHg1MjM1MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzLTEzNgogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2RlYWxlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0LTEzNQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0LTEzNgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUtMTM2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMyLTEzNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gICAgIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MTYKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODE3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgxOAogICAgLy8gYXNzZXJ0IHVuaXRzLm5hdGl2ZSA+IDAsIGVyci5aRVJPX1VOSVRTCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODE5LTgyMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMubmF0aXZlIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyMwogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArPSB1bml0cy5uYXRpdmUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjQtODI2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjQtODI2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBhcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmVwbGFjZTIgNDAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIC0KICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyOgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMwoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2Fzc2V0X3N1c3BlbnNpb24oc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMwLTgzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2Fzc2V0X3N1c3BlbnNpb24oc2VsZiwgc3VzcGVuZGVkOiBhcmM0LkJvb2wpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDQKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ1CiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NChzdXNwZW5kZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAyMSAvLyAic3VzcGVuZGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OS0xNTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICBieXRlYyAyOCAvLyAweDUyMzczMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1My0xNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0LTE1NgogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTUtMTU2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0LTE1NgogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Mi0xNTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyAgICAgYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9hY2NvdW50X3N1c3BlbnNpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hY2NvdW50X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDgtODUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODY2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBpbnRjIDQgLy8gNDQ4CiAgICBzd2FwCiAgICBzZXRiaXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2RlZmF1bHRfc3RhdHVzKGRlZmF1bHRlZDogYnl0ZXMpIC0+IHZvaWQ6CnNldF9kZWZhdWx0X3N0YXR1czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MS04NzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9kZWZhdWx0X3N0YXR1cyhzZWxmLCBkZWZhdWx0ZWQ6IGFyYzQuQm9vbCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgYnl0ZWMgMjkgLy8gMHg1MjM2MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzLTE0NgogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NgogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ2CiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NS0xNDYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NgogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDItMTQ3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vICAgICBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgzCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IFVJbnQ2NChkZWZhdWx0ZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfaW5mbygpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NS04ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9pbmZvKHNlbGYpIC0+IHR5cC5Bc3NldEluZm86CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NgogICAgLy8gZGVub21pbmF0aW9uX2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NwogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5OAogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTkKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAwCiAgICAvLyBkYXlfY291bnRfY29udmVudGlvbj1hcmM0LlVJbnQ4KHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24pLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDEKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAyCiAgICAvLyB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAzCiAgICAvLyBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDQtOTA2CiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDctOTA5CiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTAKICAgIC8vIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTEKICAgIC8vIG1hdHVyaXR5X2RhdGU9YXJjNC5VSW50NjQoc2VsZi5tYXR1cml0eV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEyCiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5zdXNwZW5kZWQpKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAic3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1c3BlbmRlZCBleGlzdHMKICAgIGJ5dGVjIDcgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTMKICAgIC8vIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgYnl0ZWMgNyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NS05MTQKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgLy8gKQogICAgdW5jb3ZlciAxMwogICAgdW5jb3ZlciAxMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgNjY1IC8vIDY2NQogICAgc3dhcAogICAgc2V0Yml0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYWNjb3VudF9pbmZvKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYWNjb3VudF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE2LTkxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FjY291bnRfaW5mbyhzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLkFjY291bnRJbmZvOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMxCiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfdGltZV9ldmVudHMoKSAtPiBieXRlczoKZ2V0X3RpbWVfZXZlbnRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMzLTkzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3RpbWVfZXZlbnRzKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDEKICAgIC8vIHRpbWVfZXZlbnRzID0gdHlwLlRpbWVFdmVudHMoKQogICAgYnl0ZWMgMzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQyCiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0MwogICAgLy8gdGltZV9ldmVudHMgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMjcgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKCmdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDQKICAgIC8vIHJldHVybiB0aW1lX2V2ZW50cwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKCkgLT4gYnl0ZXM6CmdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ2LTk0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoc2VsZikgLT4gdHlwLlRpbWVFdmVudHM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NQogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU2CiAgICAvLyBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQtOTU3CiAgICAvLyByZXR1cm4gdHlwLlRpbWVFdmVudHMoCiAgICAvLyAgICAgYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICAvLyApCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2Fzc2V0X21ldGFkYXRhKCkgLT4gYnl0ZXM6CmdldF9hc3NldF9tZXRhZGF0YToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1OS05NjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9tZXRhZGF0YShzZWxmKSAtPiB0eXAuQXNzZXRNZXRhZGF0YToKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY3CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0TWV0YWRhdGEoc2VsZi5tZXRhZGF0YSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGEgZXhpc3RzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKCkgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY0LTQ2NQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiBhc3NldF91cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY5LTQ3MgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMgT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSBkaXNhYmxlIEQtQVNBIGFwcGxpY2F0aW9uIHVwZGF0YWJpbGl0eSBvciBjaGFuZ2UgaXRzIGF1dGhvcml6YXRpb25zLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5IG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { @@ -462,7 +466,7 @@ "readonly": false, "returns": { "type": "(uint64,uint64,byte[])", - "desc": "Paid coupon amount, Payment timestamp, Payment context" + "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context" }, "desc": "Pay due coupon to an account" }, @@ -792,8 +796,8 @@ "args": [], "readonly": true, "returns": { - "type": "(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", - "desc": "Denomination Asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary Distribution Opening Date, Primary Distribution Closure Date, Issuance Date, Maturity Date, Suspended, Defaulted" + "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", + "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Defaulted" }, "desc": "Get D-ASA info" }, @@ -809,7 +813,7 @@ "readonly": true, "returns": { "type": "(address,uint64,uint64,uint64,bool)", - "desc": "Payment Address, D-ASA units, Unit value, Paid coupons, Suspended" + "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" }, "desc": "Get account info" }, @@ -828,16 +832,20 @@ "args": [], "readonly": true, "returns": { - "type": "uint64[]" - } + "type": "uint64[]", + "desc": "Secondary market schedule" + }, + "desc": "Get secondary market schedule" }, { "name": "get_asset_metadata", "args": [], "readonly": true, "returns": { - "type": "byte[]" - } + "type": "byte[]", + "desc": "Asset metadata" + }, + "desc": "Get D-ASA metadata" } ], "networks": {} diff --git a/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py b/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py index 1f0de86..cce3844 100644 --- a/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py +++ b/smart_contracts/artifacts/perpetual_bond/perpetual_bond_client.py @@ -212,7 +212,7 @@ "no_op": "CALL" } }, - "get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)": { + "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)": { "read_only": true, "structs": { "output": { @@ -222,6 +222,10 @@ "denomination_asset_id", "uint64" ], + [ + "settlement_asset_id", + "uint64" + ], [ "outstanding_principal", "uint64" @@ -330,7 +334,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMTAwIDggNDQ4IDEwMDAwIDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NTIzMzMwMjMgInN0YXR1cyIgImNpcmN1bGF0aW5nX3VuaXRzIiAiaXNzdWFuY2VfZGF0ZSIgImludGVyZXN0X3JhdGUiIDB4MDAgMHgwMDAwMDAwMDAwMDAwMDAwICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJ0b3RhbF9jb3Vwb25zIiAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIiAidW5pdF92YWx1ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAidG90YWxfdW5pdHMiICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIgInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIiAibWF0dXJpdHlfZGF0ZSIgImNvdXBvbl9wZXJpb2QiIDB4NTIzMjMwMjMgInNldHRsZW1lbnRfYXNzZXRfaWQiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiICJzdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJwYWlkX2NvdXBvbl91bml0cyIgMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczICJtZXRhZGF0YSIgMHg1MjM4MzAyMyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDAwIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDEtNDIKICAgIC8vICMgUm9sZSBCYXNlZCBBY2Nlc3MgQ29udHJvbAogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OS02MAogICAgLy8gIyBBc3NldCBDb25maWd1cmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IFVJbnQ2NCgpCiAgICBieXRlYyA4IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUtNjYKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OC02OQogICAgLy8gIyBTdXBwbHkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzItNzMKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODktOTAKICAgIC8vICMgU3RhdHVzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VNUFRZKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MQogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNS0zNgogICAgLy8gIyBTdGF0ZSBzY2hlbWEgdmFsaWRhdGlvbgogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkdMT0JBTF9CWVRFUywgZXJyLldST05HX0dMT0JBTF9CWVRFUwogICAgdHhuIEdsb2JhbE51bUJ5dGVTbGljZQogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX3VpbnQgPT0gY2ZnLkdMT0JBTF9VSU5UUywgZXJyLldST05HX0dMT0JBTF9VSU5UUwogICAgdHhuIEdsb2JhbE51bVVpbnQKICAgIHB1c2hpbnQgMTkgLy8gMTkKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyAjIENvdXBvbnMKICAgIC8vIHNlbGYuY291cG9uX3BlcmlvZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY291cG9uX3BlcmlvZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBzZWxmLnBhaWRfY291cG9uX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDIzIC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDI4CiAgICBwdXNoYnl0ZXNzIDB4NGZkNmEzY2MgMHg4Y2YxNGI1MSAweDgwZTUxZTlmIDB4NDQzNjNkNDkgMHg2N2RiNGYyMCAweGY2YTk2YzhkIDB4MjI5YjcwNmYgMHg2M2Y5OTU4OSAweGQzYTRkNmFiIDB4MWQ2ZmMyNTUgMHhmZWY3NDU2NyAweGI4ZmMxMzkwIDB4M2Q0M2QxZjAgMHhlYmQ5NmIyZiAweDZjODVlM2VlIDB4ZjYzYWNlOGQgMHhiYmNjYTE4YSAweDFhN2JhYmI0IDB4MzAxZGQ5MTkgMHhlZDAyNzU5ZiAweGZhZDIxNzNlIDB4MDhlZmVhMzUgMHhkZGNlYzA3YiAvLyBtZXRob2QgImFzc2V0X3RyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwYXlfY291cG9uKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LGJ5dGVbXSkiLCBtZXRob2QgInVwZGF0ZV9pbnRlcmVzdF9yYXRlKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCx1aW50NjQpKSIsIG1ldGhvZCAiZ2V0X3BheW1lbnRfYW1vdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfY291cG9uc19zdGF0dXMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCksYm9vbCkiLCBtZXRob2QgImdldF90aW1lX3BlcmlvZHMoKSh1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJhc3NldF9jcmVhdGUoYWRkcmVzcyxieXRlW10pdm9pZCIsIG1ldGhvZCAiYXNzZXRfY29uZmlnKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAic2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyh1aW50NjRbXSkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2lnbl9yb2xlKGFkZHJlc3MsdWludDgsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmV2b2tlX3JvbGUoYWRkcmVzcyx1aW50OCl1aW50NjQiLCBtZXRob2QgIm9wZW5fYWNjb3VudChhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJjbG9zZV9hY2NvdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9hc3NldF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfYWNjb3VudF9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9kZWZhdWx0X3N0YXR1cyhib29sKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9pbmZvKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsYm9vbCkiLCBtZXRob2QgImdldF9hY2NvdW50X2luZm8oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sKSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKWJ5dGVbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fYXNzZXRfdHJhbnNmZXJfcm91dGVANSBtYWluX3BheV9jb3Vwb25fcm91dGVANiBtYWluX3VwZGF0ZV9pbnRlcmVzdF9yYXRlX3JvdXRlQDcgbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDggbWFpbl9nZXRfcGF5bWVudF9hbW91bnRfcm91dGVAOSBtYWluX2dldF9jb3Vwb25zX3N0YXR1c19yb3V0ZUAxMCBtYWluX2dldF90aW1lX3BlcmlvZHNfcm91dGVAMTEgbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAMTIgbWFpbl9hc3NldF9jb25maWdfcm91dGVAMTMgbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDE0IG1haW5fYXNzaWduX3JvbGVfcm91dGVAMTUgbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUAxNiBtYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxNyBtYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTggbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxOSBtYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDIwIG1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAyMSBtYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAyMiBtYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDIzIG1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAyNCBtYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAyNSBtYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDI2IG1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDI3CgptYWluX2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWV0YWRhdGFfcm91dGVAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9tZXRhZGF0YQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3RpbWVfZXZlbnRzX3JvdXRlQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYWNjb3VudF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfaW5mbwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2RlZmF1bHRfc3RhdHVzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2FjY291bnRfc3VzcGVuc2lvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYXNzZXRfc3VzcGVuc2lvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNsb3NlX2FjY291bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fb3Blbl9hY2NvdW50X3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG9wZW5fYWNjb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiByZXZva2Vfcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NpZ25fcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2V0X2NvbmZpZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgY2FsbHN1YiBhc3NldF9jcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3RpbWVfcGVyaW9kc19yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozOTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF90aW1lX3BlcmlvZHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2NvdXBvbnNfc3RhdHVzX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2NvdXBvbnNfc3RhdHVzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9wYXltZW50X2Ftb3VudF9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X3BheW1lbnRfYW1vdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdXBkYXRlX2ludGVyZXN0X3JhdGVfcm91dGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHVwZGF0ZV9pbnRlcmVzdF9yYXRlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3BheV9jb3Vwb25fcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHBheV9jb3Vwb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfdHJhbnNmZXJfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2V0X3RyYW5zZmVyCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0AyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICBwdXNoaW50IDQgLy8gNAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgbWF0Y2ggbWFpbl9hc3NldF91cGRhdGVAMjkKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDMwCgptYWluX2Fzc2V0X3VwZGF0ZUAyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NgogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY2LTQ2NwogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiBhc3NldF91cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIGNhbGxzdWIgYXNzZXRfdXBkYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuYXNzZXRfdHJhbnNmZXIoc2VuZGVyX2hvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2V0X3RyYW5zZmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE0NS0xNTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLAogICAgLy8gICAgIHVuaXRzOiBhcmM0LlVJbnQ2NCwKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAzIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTc2CiAgICAvLyB1bml0cy5uYXRpdmUsCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTMtMjk2CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk1CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk2CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTYKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NS0yOTYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyA0CiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk2CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkyLTI5NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjktMzcxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLm5hdGl2ZSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzIKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzczCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlLCBlcnIuU1VTUEVOREVECiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgNiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc3LTM3OQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnN1c3BlbmRlZC5uYXRpdmUsIGVyci5TVVNQRU5ERUQKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgNiAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzgxCiAgICAvLyB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyA1CiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzgwLTM4MgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5MAogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzkxCiAgICAvLyBpZiBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPiAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0LTMwNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0LTMwNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzAzLTMwNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gICAgIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5OT05fRlVOR0lCTEVfVU5JVFMKICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIHVuaXRzIGFyZSBub3QgZnVuZ2libGUKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTc5LTE4MAogICAgLy8gIyBUcmFuc2ZlciBpcyBmb3JiaWRkZW4gaW4gY2FzZSBvZiBwZW5kaW5nIGNvdXBvbiBwYXltZW50cwogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxODEKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoc2VuZGVyX2hvbGRpbmdfYWRkcmVzcywgZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGRpZyAxCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTgzLTE4NAogICAgLy8gIyBUcmFuc2ZlcnJlZCB1bml0cyB2YWx1ZSAobXVzdCBiZSBjb21wdXRlZCBiZWZvcmUgdGhlIHRyYW5zZmVyKQogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE4NS0xODcKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZSwgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNwogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMgogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI2LTQyOAogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjYKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjYtNDI4CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDMwCiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI5LTQzMQogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI5CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjktNDMxCiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzUzCiAgICAvLyBpZiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPT0gMDoKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiA0MAogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gYXJjNC5VSW50NjQoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0Cgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5MgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHVuaXRzLm5hdGl2ZSAqIHNlbmRlcl91bml0X3ZhbHVlLm5hdGl2ZSArIGFjY3J1ZWRfaW50ZXJlc3QpCiAgICBmcmFtZV9kaWcgMAogICAgYnRvaQogICAgZnJhbWVfZGlnIDUKICAgICoKICAgIGZyYW1lX2RpZyAzCiAgICArCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMTUKCmFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NgogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk3LTM5OQogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0ucGFpZF9jb3Vwb25zCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NwogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTctMzk5CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5wYWlkX2NvdXBvbnMKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0CiAgICBiIGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTcKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDctMTA4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X3N1c3BlbmRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMS0xMTIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTEzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmNvdW50X2R1ZV9jb3Vwb25zKCkgLT4gdWludDY0Ogpjb3VudF9kdWVfY291cG9uczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo2Ni02NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjb3VudF9kdWVfY291cG9ucyhzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo2OAogICAgLy8gZHVlX2NvdXBvbnMgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NjkKICAgIC8vIGN1cnJlbnRfdHMgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NzAKICAgIC8vIGlmIGN1cnJlbnRfdHMgPiBzZWxmLmlzc3VhbmNlX2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NzEKICAgIC8vIGR1ZV9jb3Vwb25zID0gKGN1cnJlbnRfdHMgLSBzZWxmLmlzc3VhbmNlX2RhdGUpIC8vIHNlbGYuY291cG9uX3BlcmlvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICAtCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3BlcmlvZCBleGlzdHMKICAgIC8KICAgIGZyYW1lX2J1cnkgMAoKY291bnRfZHVlX2NvdXBvbnNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyAgICAgIyBkaXYtYnktemVybzogY291cG9uX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9wZXJpb2RzIGNoZWNrcwogICAgLy8gcmV0dXJuIGR1ZV9jb3Vwb25zCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBkdWVfY291cG9uczogdWludDY0KSAtPiB2b2lkOgphc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo5NC05NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTkKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTgtMTAwCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9PSBkdWVfY291cG9ucwogICAgLy8gKSwgZXJyLlBFTkRJTkdfQ09VUE9OX1BBWU1FTlQKICAgIGFzc2VydCAvLyBQZW5kaW5nIGR1ZSBjb3Vwb24gcGF5bWVudAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCwgZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NydWVkX2ludGVyZXN0X2Ftb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjctMTMwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogVUludDY0LCBkdWVfY291cG9uczogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzMS0xMzIKICAgIC8vICMgVGhlIGZvbGxvd2luZyBhc3NlcnQgc2FmZWd1YXJkcyB0aGUgc3Vicm91dGluZSBmcm9tIGZvcmJpZGRlbiBpbnZvY2F0aW9ucwogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzMKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNAogICAgLy8gY291cG9uX2FjY3J1ZWRfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNQogICAgLy8gY291cG9uX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IubmF0aXZlCiAgICBzd2FwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzcKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTM3LTEzOAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNy0xMzkKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDEKICAgIC8vIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIHVuY292ZXIgMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNy0xNDIKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICAvLyAvLyAoCiAgICAvLyAgICAgY3N0LkJQUyAqIGNvdXBvbl9wZXJpb2QKICAgIC8vICkgICMgZGl2LWJ5LXplcm86IGNvdXBvbl9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfcGVyaW9kcyBjaGVja3MKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzYtMTQzCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gICAgICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAgICAgKiBjb3Vwb25fYWNjcnVlZF9wZXJpb2QKICAgIC8vICAgICAvLyAoCiAgICAvLyAgICAgICAgIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICAvLyAgICAgKSAgIyBkaXYtYnktemVybzogY291cG9uX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9wZXJpb2RzIGNoZWNrcwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9uczogdWludDY0KSAtPiBieXRlczoKZGF5X2NvdW50X2ZhY3RvcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMDYtMTA3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGRheV9jb3VudF9mYWN0b3Ioc2VsZiwgZHVlX2NvdXBvbnM6IFVJbnQ2NCkgLT4gdHlwLkRheUNvdW50RmFjdG9yOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEwOC0xMDkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gaWYgbm90IGR1ZV9jb3Vwb25zOgogICAgZnJhbWVfZGlnIC0xCiAgICBibnogZGF5X2NvdW50X2ZhY3Rvcl9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExMAogICAgLy8gYWNjcnVpbmdfc3RhcnRfdGltZSA9IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExMwogICAgLy8gY291cG9uX2FjY3J1ZWRfcGVyaW9kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgLSBhY2NydWluZ19zdGFydF90aW1lCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBzd2FwCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExNAogICAgLy8gY291cG9uX3BlcmlvZCA9IHNlbGYuY291cG9uX3BlcmlvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfYnVyeSAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcGVyaW9kIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExNQogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9PSBVSW50NjQoY3N0LkRDQ19BX0EpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMQogICAgYnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0OQogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfZGlnIDMKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSA0CiAgICBmcmFtZV9idXJ5IDEKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTE5CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQoY291cG9uX2FjY3J1ZWRfcGVyaW9kKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjAKICAgIC8vIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGNvdXBvbl9wZXJpb2QpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExOC0xMjEKICAgIC8vIHJldHVybiB0eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KGNvdXBvbl9hY2NydWVkX3BlcmlvZCksCiAgICAvLyAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoY291cG9uX3BlcmlvZCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkYXlfY291bnRfZmFjdG9yX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBpZiBkdWVfY291cG9ucyA+PSBVSW50NjQoMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6ODMKICAgIC8vIGNvdXBvbl9kdWVfZGF0ZSA9IHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAyCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAyCiAgICBiIGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuY291cG9uX2R1ZV9kYXRlKGNvdXBvbjogdWludDY0KSAtPiB1aW50NjQ6CmNvdXBvbl9kdWVfZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo3NS03NgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBjb3Vwb25fZHVlX2RhdGUoc2VsZiwgY291cG9uOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5Ojc3CiAgICAvLyByZXR1cm4gc2VsZi5pc3N1YW5jZV9kYXRlICsgY291cG9uICogc2VsZi5jb3Vwb25fcGVyaW9kCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9wZXJpb2QgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgICsKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzM1LTMzOAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzM5CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlLm5hdGl2ZQogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQucGF5X2NvdXBvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2luZm86IGJ5dGVzKSAtPiBieXRlczoKcGF5X2NvdXBvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOTQtMTk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwYXlfY291cG9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2luZm86IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IHR5cC5QYXltZW50UmVzdWx0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIxNy0yMTgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZXN0cmljdCBjYWxsZXIgYXV0aG9yaXphdGlvbgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyMgogICAgLy8gdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5PX1VOSVRTCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMjQKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjI1CiAgICAvLyBhY2NvdW50X3BhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gYXNzZXJ0IGR1ZV9jb3Vwb25zID4gYWNjb3VudF9wYWlkX2NvdXBvbnMsIGVyci5OT19EVUVfQ09VUE9OCiAgICBzd2FwCiAgICBkaWcgMQogICAgPgogICAgYXNzZXJ0IC8vIE5vIGR1ZSBjb3Vwb24gdG8gcGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjI3LTIzMAogICAgLy8gIyBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgdmVyaWZ5IGlmIG90aGVyIGFjY291bnRzIGFyZSBzdGlsbCB3YWl0aW5nIGZvciB0aGUgcGF5bWVudCBvZiBwcmV2aW91cyBjb3Vwb25zCiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZCgKICAgIC8vICAgICBhY2NvdW50X3BhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLlBFTkRJTkdfQ09VUE9OX1BBWU1FTlQKICAgIGNhbGxzdWIgYWxsX2R1ZV9jb3Vwb25zX3BhaWQKICAgIGFzc2VydCAvLyBQZW5kaW5nIGR1ZSBjb3Vwb24gcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzExCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMgogICAgLy8gQXNzZXQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMS0zMTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzExLTMxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIC8vICAgICBBc3NldChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCkKICAgIC8vICkKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZQogICAgYnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTQKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDYgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDE0CiAgICBpbnRjXzEgLy8gMQoKcGF5X2NvdXBvbl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaWYgc2VsZi5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IHBheV9jb3Vwb25fZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMzUKICAgIC8vIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHByaW5jaXBhbF9hbW91bnQgKiBzZWxmLmludGVyZXN0X3JhdGUgLy8gY3N0LkJQUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgICoKICAgIGludGMgNSAvLyAxMDAwMAogICAgLwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjEKICAgIC8vIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjAKICAgIC8vIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5iYWxhbmNlKAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjAtMzIyCiAgICAvLyBBc3NldChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCkuYmFsYW5jZSgKICAgIC8vICAgICBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyMC0zMjMKICAgIC8vIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5iYWxhbmNlKAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICkKICAgIC8vID49IHBheW1lbnRfYW1vdW50CiAgICBkaWcgMQogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxOS0zMjQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgQXNzZXQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLmJhbGFuY2UoCiAgICAvLyAgICAgICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICAgICApCiAgICAvLyAgICAgPj0gcGF5bWVudF9hbW91bnQKICAgIC8vICksIGVyci5OT1RfRU5PVUdIX0ZVTkRTCiAgICBhc3NlcnQgLy8gTm90IGVub3VnaCBmdW5kcyBmb3IgdGhlIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMzktMjQwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIHRoZSBzYW1lIGFzc2V0IGZvciBkZW5vbWluYXRpb24gYW5kIHNldHRsZW1lbnQsIG5vIGNvbnZlcnNpb24gbmVlZGVkCiAgICAvLyBzZWxmLnBheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHBheW1lbnRfYW1vdW50KQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjgtMzMzCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzMgogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyOQogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjgKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyOC0zMzMKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCnBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zLm5hdGl2ZSArIDEKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0NS0yNDcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjQ1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0NS0yNDcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiA0OAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0OAogICAgLy8gc2VsZi5wYWlkX2NvdXBvbl91bml0cyArPSB1bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYWlkX2NvdXBvbl91bml0cyBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBieXRlYyAyMyAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTEKICAgIC8vIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjQ5LTI1MwogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICAvLyAgICAgdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mby5jb3B5KCksICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpwYXlfY291cG9uX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0Mi0yNDMKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9jb3Vwb25fYWZ0ZXJfaWZfZWxzZUAzCgpwYXlfY291cG9uX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwYXlfY291cG9uX2Jvb2xfbWVyZ2VAMTUKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9uczogdWludDY0KSAtPiB1aW50NjQ6CmFsbF9kdWVfY291cG9uc19wYWlkOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjkwLTkxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFsbF9kdWVfY291cG9uc19wYWlkKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo5MgogICAgLy8gcmV0dXJuIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgPj0gc2VsZi5jaXJjdWxhdGluZ191bml0cyAqIGR1ZV9jb3Vwb25zCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBhaWRfY291cG9uX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICA+PQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6CmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDEtMzQyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQ0CiAgICAvLyBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0My0zNDUKICAgIC8vIHJldHVybiBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC51cGRhdGVfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlOiBieXRlcykgLT4gYnl0ZXM6CnVwZGF0ZV9pbnRlcmVzdF9yYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI1NS0yNTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHVwZGF0ZV9pbnRlcmVzdF9yYXRlKHNlbGYsIGludGVyZXN0X3JhdGU6IGFyYzQuVUludDY0KSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2MwogICAgLy8gY2FsbGVyIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICBieXRlYyAyNiAvLyAweDUyMzgzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTYzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2My0xNjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHVwZGF0ZV9pbnRlcmVzdF9yYXRlX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY0CiAgICAvLyBhbmQgc2VsZi5pbnRlcmVzdF9vcmFjbGVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3Rfb3JhY2xlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjQtMTY1CiAgICAvLyBhbmQgc2VsZi5pbnRlcmVzdF9vcmFjbGVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY0LTE2NgogICAgLy8gYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHVwZGF0ZV9pbnRlcmVzdF9yYXRlX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY2CiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3Rfb3JhY2xlIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjUtMTY2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5pbnRlcmVzdF9vcmFjbGVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY0LTE2NgogICAgLy8gYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHVwZGF0ZV9pbnRlcmVzdF9yYXRlX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnVwZGF0ZV9pbnRlcmVzdF9yYXRlX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2Mi0xNjcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICAvLyAgICAgYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5pbnRlcmVzdF9vcmFjbGVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjczCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNzQKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gZHVlX2NvdXBvbnMgPSBzZWxmLmNvdW50X2R1ZV9jb3Vwb25zKCkKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNzYKICAgIC8vIGFzc2VydCBzZWxmLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zKSwgZXJyLlBFTkRJTkdfQ09VUE9OX1BBWU1FTlQKICAgIGNhbGxzdWIgYWxsX2R1ZV9jb3Vwb25zX3BhaWQKICAgIGFzc2VydCAvLyBQZW5kaW5nIGR1ZSBjb3Vwb24gcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI3OC0yNzkKICAgIC8vICMgVXBkYXRlIGludGVyZXN0IHJhdGUKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGJ5dGVjIDUgLy8gImludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI4MAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnVwZGF0ZV9pbnRlcmVzdF9yYXRlX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHVwZGF0ZV9pbnRlcmVzdF9yYXRlX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyODItMjg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlOgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMDMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzAzLTMwNAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMDQKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMDMtMzA0CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMwMi0zMDUKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksIGVyci5OT19QUklNQVJZX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMDgKICAgIC8vIDAgPCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWMgNyAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGI+CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANwogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIGI+PQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMDctMzA5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIDAgPCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1VOSVRTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhbW91bnQgb2YgdW5pdHMgZm9yIHRoZSBhY2NvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzEzCiAgICAvLyBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMxMS0zMTQKICAgIC8vICMgVmFsdWUgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uCiAgICAvLyBhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUgPSBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMTUtMzE2CiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0IGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbgogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzE3CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMxOAogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyMC0zMjEKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyMgogICAgLy8gc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudChob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzIzCiAgICAvLyBpZiBzZWxmLmlzX2FjY3J1aW5nX2ludGVyZXN0KCk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMjQKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnMpCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMjUtMzI3CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gc2VsZi5hY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZSwgZHVlX2NvdXBvbnMKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIDYKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzI4CiAgICAvLyBudW1lcmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMjkKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSAzCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzMxCiAgICAvLyB1bml0c192YWx1ZT1hcmM0LlVJbnQ2NChhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUpLAogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzIKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICBmcmFtZV9kaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICBmcmFtZV9kaWcgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzNQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzMtMzM2CiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzMwLTMzNwogICAgLy8gcmV0dXJuIHR5cC5DdXJyZW50VW5pdHNWYWx1ZSgKICAgIC8vICAgICB1bml0c192YWx1ZT1hcmM0LlVJbnQ2NChhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUpLAogICAgLy8gICAgIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICAvLyAgICAgZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAOAoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmlzX2FjY3J1aW5nX2ludGVyZXN0KCkgLT4gdWludDY0Ogppc19hY2NydWluZ19pbnRlcmVzdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjMtMTI0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGlzX2FjY3J1aW5nX2ludGVyZXN0KHNlbGYpIC0+IGJvb2w6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMjUKICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgIT0gMCBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICA+CiAgICBieiBpc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCmlzX2FjY3J1aW5nX2ludGVyZXN0X2Jvb2xfZmFsc2VAMzoKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTI1CiAgICAvLyByZXR1cm4gc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID4gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5nZXRfcGF5bWVudF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9wYXltZW50X2Ftb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzktMzQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfcGF5bWVudF9hbW91bnQoc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5QYXltZW50QW1vdW50czoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzU1CiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNTYKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM1NS0zNTYKICAgIC8vIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM1NwogICAgLy8gLy8gY3N0LkJQUwogICAgaW50YyA1IC8vIDEwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzU1LTM1NwogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAvLyBjc3QuQlBTCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzYwCiAgICAvLyBpbnRlcmVzdD1hcmM0LlVJbnQ2NChpbnRlcmVzdF9hbW91bnQpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM2MQogICAgLy8gcHJpbmNpcGFsPWFyYzQuVUludDY0KCksCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM1OS0zNjIKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9YXJjNC5VSW50NjQoaW50ZXJlc3RfYW1vdW50KSwKICAgIC8vICAgICBwcmluY2lwYWw9YXJjNC5VSW50NjQoKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuZ2V0X2NvdXBvbnNfc3RhdHVzKCkgLT4gYnl0ZXM6CmdldF9jb3Vwb25zX3N0YXR1czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNjQtMzY1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfY291cG9uc19zdGF0dXMoc2VsZikgLT4gdHlwLkNvdXBvbnNJbmZvOgogICAgcHJvdG8gMCAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpIGVsc2UgVUludDY0KCkKICAgIGJ6IGdldF9jb3Vwb25zX3N0YXR1c190ZXJuYXJ5X2ZhbHNlQDIKICAgIGNhbGxzdWIgY291bnRfZHVlX2NvdXBvbnMKICAgIGZyYW1lX2J1cnkgMgoKZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuIHNlbGYuY291cG9uX2R1ZV9kYXRlKGR1ZV9jb3Vwb25zICsgMSkKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBjYWxsc3ViIGNvdXBvbl9kdWVfZGF0ZQogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzc1CiAgICAvLyBhbGxfZHVlX2NvdXBvbnNfcGFpZCA9IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoZHVlX2NvdXBvbnMpCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzYKICAgIC8vIG51bWVyYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzc3CiAgICAvLyBkZW5vbWluYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzc4CiAgICAvLyBpZiBzZWxmLmlzX2FjY3J1aW5nX2ludGVyZXN0KCk6CiAgICBjYWxsc3ViIGlzX2FjY3J1aW5nX2ludGVyZXN0CiAgICBieiBnZXRfY291cG9uc19zdGF0dXNfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzc5CiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIDIKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4MAogICAgLy8gbnVtZXJhdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzgxCiAgICAvLyBkZW5vbWluYXRvciA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IubmF0aXZlCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2NvdXBvbnNfc3RhdHVzX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODMKICAgIC8vIHRvdGFsX2NvdXBvbnM9YXJjNC5VSW50NjQoc2VsZi50b3RhbF9jb3Vwb25zKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzg0CiAgICAvLyBkdWVfY291cG9ucz1hcmM0LlVJbnQ2NChkdWVfY291cG9ucyksCiAgICBmcmFtZV9kaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4NQogICAgLy8gbmV4dF9jb3Vwb25fZHVlX2RhdGU9YXJjNC5VSW50NjQobmV4dF9jb3Vwb25fZHVlX2RhdGUpLAogICAgZnJhbWVfZGlnIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODcKICAgIC8vIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODgKICAgIC8vIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzg2LTM4OQogICAgLy8gZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgLy8gKSwKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM5MAogICAgLy8gYWxsX2R1ZV9jb3Vwb25zX3BhaWQ9YXJjNC5Cb29sKGFsbF9kdWVfY291cG9uc19wYWlkKSwKICAgIGJ5dGVjIDYgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAwCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODItMzkxCiAgICAvLyByZXR1cm4gdHlwLkNvdXBvbnNJbmZvKAogICAgLy8gICAgIHRvdGFsX2NvdXBvbnM9YXJjNC5VSW50NjQoc2VsZi50b3RhbF9jb3Vwb25zKSwKICAgIC8vICAgICBkdWVfY291cG9ucz1hcmM0LlVJbnQ2NChkdWVfY291cG9ucyksCiAgICAvLyAgICAgbmV4dF9jb3Vwb25fZHVlX2RhdGU9YXJjNC5VSW50NjQobmV4dF9jb3Vwb25fZHVlX2RhdGUpLAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgLy8gICAgICksCiAgICAvLyAgICAgYWxsX2R1ZV9jb3Vwb25zX3BhaWQ9YXJjNC5Cb29sKGFsbF9kdWVfY291cG9uc19wYWlkKSwKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNzMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpIGVsc2UgVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgZ2V0X2NvdXBvbnNfc3RhdHVzX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmdldF90aW1lX3BlcmlvZHMoKSAtPiBieXRlczoKZ2V0X3RpbWVfcGVyaW9kczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozOTMtMzk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfdGltZV9wZXJpb2RzKHNlbGYpIC0+IHR5cC5UaW1lUGVyaW9kczoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQwMQogICAgLy8gdGltZV9wZXJpb2RzID0gdHlwLlRpbWVQZXJpb2RzKCkKICAgIGJ5dGVjIDMyIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MDIKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfcGVyaW9kc19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MDMKICAgIC8vIHRpbWVfcGVyaW9kcyA9IHNlbGYudGltZV9wZXJpb2RzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMjQgLy8gMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfcGVyaW9kcyBleGlzdHMKCmdldF90aW1lX3BlcmlvZHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQwNAogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kcwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NyZWF0ZShhcnJhbmdlcjogYnl0ZXMsIG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU0LTQ1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgYXNzZXRfY3JlYXRlKHNlbGYsIGFycmFuZ2VyOiBhcmM0LkFkZHJlc3MsIG1ldGFkYXRhOiB0eXAuQXNzZXRNZXRhZGF0YSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYzCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIubmF0aXZlCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjQKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDI1IC8vICJtZXRhZGF0YSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jb25maWcoZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBieXRlcywgc2V0dGxlbWVudF9hc3NldF9pZDogYnl0ZXMsIHByaW5jaXBhbDogYnl0ZXMsIG1pbmltdW1fZGVub21pbmF0aW9uOiBieXRlcywgZGF5X2NvdW50X2NvbnZlbnRpb246IGJ5dGVzLCBpbnRlcmVzdF9yYXRlOiBieXRlcywgY291cG9uX3JhdGVzOiBieXRlcywgdGltZV9ldmVudHM6IGJ5dGVzLCB0aW1lX3BlcmlvZHM6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzYtNDg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF9jb25maWcoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHByaW5jaXBhbDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgbWluaW11bV9kZW5vbWluYXRpb246IGFyYzQuVUludDY0LAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uOiBhcmM0LlVJbnQ4LAogICAgLy8gICAgIGludGVyZXN0X3JhdGU6IGFyYzQuVUludDE2LAogICAgLy8gICAgIGNvdXBvbl9yYXRlczogdHlwLkNvdXBvblJhdGVzLAogICAgLy8gICAgIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cywKICAgIC8vICAgICB0aW1lX3BlcmlvZHM6IHR5cC5UaW1lUGVyaW9kcywKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDkgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MTcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUxOAogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU1QVFksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTIwLTUyMQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9kZW5vbWluYXRpb25fYXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtOQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzcKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgZnJhbWVfZGlnIDMKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NS0xNzgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgLy8gKSwgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDggLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGZyYW1lX2RpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI0LTUyNQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9zZXR0bGVtZW50X2Fzc2V0KHNldHRsZW1lbnRfYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC04CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODgKICAgIC8vIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODYtMTg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTkzCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTQtMjAwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTkKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTYKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTcKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk4CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTQtMTk1CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0yMDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzAKICAgIC8vIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgZnJhbWVfZGlnIC03CiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTYKICAgIGJ0b2kKICAgIGR1cDIKICAgICUKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyOC01MzEKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJpbmNpcGFsLm5hdGl2ZSAlIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZSA9PSAwCiAgICAvLyApLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIE1pbmltdW0gZGVub21pbmF0aW9uIGlzIG5vdCBhIGRpdmlzb3Igb2YgcHJpbmNpcGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzIKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgYnl0ZWMgMTEgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMwogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbC5uYXRpdmUgLy8gbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlCiAgICAvCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTM1LTUzNgogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNgogICAgLy8gVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIGludGNfMiAvLyAxMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBibnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICBwdXNoaW50IDI1NSAvLyAyNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNwoKYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTIKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBkYXlfY291bnRfY29udmVudGlvbgogICAgYnl0ZWMgMTIgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzktNTQwCiAgICAvLyAjIFNldCBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLmFzc2VydF9pbnRlcmVzdF9yYXRlKGludGVyZXN0X3JhdGUubmF0aXZlKQogICAgZnJhbWVfZGlnIC00CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTYKICAgIC8vIGFzc2VydCBpbnRlcmVzdF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9JTlRFUkVTVF9SQVRFCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjAKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDUgLy8gImludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI0CiAgICAvLyBhc3NlcnQgbm90IGNvdXBvbl9yYXRlcy5sZW5ndGgsIGVyci5JTlZBTElEX0NPVVBPTl9SQVRFUwogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIENvdXBvbiByYXRlcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gY291cG9uX3JhdGVzLmxlbmd0aAogICAgYnl0ZWMgOSAvLyAidG90YWxfY291cG9ucyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjkKICAgIC8vIGlmIHNlbGYudG90YWxfY291cG9uczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjMwCiAgICAvLyBzZWxmLmNvdXBvbl9yYXRlcy52YWx1ZSA9IGNvdXBvbl9yYXRlcy5jb3B5KCkKICAgIGJ5dGVjIDMzIC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAzMyAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGZyYW1lX2RpZyAtMwogICAgYm94X3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NDkKICAgIC8vIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCAzIC8vIDMKICAgICsKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NDctNTAKICAgIC8vICMgVGhlIHBlcnBldHVhbCBib25kIGhhcyB1bmRlZmluZWQgY291cG9ucyAodG90YWxfY291cG9ucyA9IDApIGFuZCBubyBtYXR1cml0eSBkYXRlCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDkKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjAKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDI3IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjcgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEtMjYzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjYxLTI2MwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjQtMjY2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDIwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjQtMjY2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NwogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlID0gdGltZV9ldmVudHNbY2ZnLklTU1VBTkNFX0RBVEVfSURYXS5uYXRpdmUKICAgIGV4dHJhY3QgMTYgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY5LTI3MAogICAgLy8gIyBTb21lIEQtQVNBIG1heSBub3QgaGF2ZSBhIG1hdHVyaXR5IGRhdGUgKGUuZy4sIHBlcnBldHVhbHMpCiAgICAvLyBpZiB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgICsKICAgID09CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjcxCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDE2IC8vICJtYXR1cml0eV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjU0LTU1CiAgICAvLyAjIFRoZSBwZXJwZXR1YWwgYm9uZCBkZWZpbmVzIGEgc2luZ2xlIHRpbWUgcGVyaW9kIGZvciB0aGUgY291cG9uIGR1cmF0aW9uIHdpdGggdW5saW1pdGVkIHJlcGV0aXRpb25zCiAgICAvLyBhc3NlcnQgdGltZV9wZXJpb2RzLmxlbmd0aCA9PSBVSW50NjQoMSksIGVyci5JTlZBTElEX1RJTUVfUEVSSU9EUwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo1NgogICAgLy8gY291cG9uX3BlcmlvZF9kdXJhdGlvbiA9IHRpbWVfcGVyaW9kc1swXVswXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGV4dHJhY3QgMCAxNiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NTcKICAgIC8vIHJlcGV0aXRpb25zID0gdGltZV9wZXJpb2RzWzBdWzFdLm5hdGl2ZQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NTgKICAgIC8vIGFzc2VydCBjb3Vwb25fcGVyaW9kX2R1cmF0aW9uID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRF9EVVJBVElPTgogICAgc3dhcAogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kIGR1cmF0aW9ucyBtdXN0IGJlIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiB6ZXJvCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NTkKICAgIC8vIGFzc2VydCByZXBldGl0aW9ucyA9PSBVSW50NjQoMCksIGVyci5JTlZBTElEX1RJTUVfUEVSSU9EX1JFUEVUSVRJT05TCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2QgcmVwZXRpdGlvbnMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NjMKICAgIC8vIHNlbGYudGltZV9wZXJpb2RzLnZhbHVlID0gdGltZV9wZXJpb2RzLmNvcHkoKQogICAgYnl0ZWMgMjQgLy8gMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDI0IC8vIDB4NzQ2OTZkNjU1MDY1NzI2OTZmNjQ3MwogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NjQKICAgIC8vIHNlbGYuY291cG9uX3BlcmlvZCA9IHNlbGYudGltZV9wZXJpb2RzLnZhbHVlWzBdWzBdLm5hdGl2ZQogICAgYnl0ZWMgMjQgLy8gMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX3BlcmlvZHMgZXhpc3RzCiAgICBleHRyYWN0IDIgMAogICAgZXh0cmFjdCAwIDE2IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieXRlYyAxNyAvLyAiY291cG9uX3BlcmlvZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTYKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfQUNUSVZFKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50Y18yIC8vIDEwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUAxOAoKYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkgLT4gdm9pZDoKYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNS0xMTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTcKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuYXJyYW5nZXIudmFsdWUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJyYW5nZXIgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzgtMjM5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2VsZiwgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzKSAtPiBOb25lOgogICAgcHJvdG8gMSAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQxCiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQyCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDEtMjQyCiAgICAvLyB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDAtMjQzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vICAgICA+IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzZXQgaW4gdGhlIGZ1dHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ0CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzAgLy8gMAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDQKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDYKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDg6CiAgICBwdXNoaW50IDc1IC8vIDc1CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDE0CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMzQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAzNCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfd2hpbGVfdG9wQDgKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDkKICAgIC8vIHRpbWVfaSA9IHRpbWVfZXZlbnRzW190XS5uYXRpdmUKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUwCiAgICAvLyB0aW1lX2YgPSB0aW1lX2V2ZW50c1tfdCArIDFdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gYXNzZXJ0IHRpbWVfZiA+IHRpbWVfaSwgZXJyLklOVkFMSURfU09SVElORwogICAgPAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUyCiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uICE9IFVJbnQ2NChjc3QuRENDX0NPTlQpOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIHB1c2hpbnQgMjU1IC8vIDI1NQogICAgIT0KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTMtMjU0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTMtMjU2CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGltZSBwZXJpb2RzIGV4cHJlc3NlZCBpbiBkYXlzIGZvciByZWd1bGFyIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0ICh0aW1lX2YgLSB0aW1lX2kpICUgVUludDY0KAogICAgLy8gICAgIGNzdC5EQVlfMl9TRUMKICAgIC8vICkgPT0gMCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0QKICAgIGludGMgNiAvLyA4NjQwMAogICAgJQogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBpbiBBY3R1YWwvQWN0dWFsIGRheSBjb3VudCBjb252ZW50aW9uIG11c3QgYmUgbXVsdGlwbGVzIG9mIGEgZGF5IChpbiBzZWNvbmRzKQogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANjoKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1OC01NjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMoCiAgICAvLyAgICAgc2VsZiwgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMKICAgIC8vICkgLT4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlOgogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTc5CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNyAvLyAyMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODEKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgzCiAgICAvLyBhc3NlcnQgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPj0gMSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NAogICAgLy8gaWYgc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cy5sZW5ndGggPiAxOgogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgYnogc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NQogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZHVwCiAgICBmcmFtZV9idXJ5IC0xCiAgICBmcmFtZV9idXJ5IDEKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NwogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTg4LTU5MAogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTg3LTU5MAogICAgLy8gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBkaWcgMQogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4Ni01OTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5pc3N1YW5jZV9kYXRlCiAgICAvLyAgICAgPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gICAgIF0ubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfT1BFTklOR19EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IG9wZW5pbmcgZGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkyCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDE0IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5Mi01OTQKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk1CiAgICAvLyBpZiBzZWxmLm1hdHVyaXR5X2RhdGU6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTkKICAgIC8vIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTgtNjAwCiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTctNjAwCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk2LTYwMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vICAgICA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9DTE9TVVJFX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgY2xvc3VyZSBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDIKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAyLTYwNAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNwogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNi02MDgKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTAKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDktNjExCiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA1LTYxMgogICAgLy8gcmV0dXJuIHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZSgKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2lnbl9yb2xlKHJvbGVfYWRkcmVzczogYnl0ZXMsIHJvbGU6IGJ5dGVzLCBjb25maWc6IGJ5dGVzKSAtPiBieXRlczoKYXNzaWduX3JvbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTQtNjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NpZ25fcm9sZSgKICAgIC8vICAgICBzZWxmLCByb2xlX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcm9sZTogYXJjNC5VSW50OCwgY29uZmlnOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzYKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzOAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzkKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MCAvLyA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0MAogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDIKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MCAvLyA3MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0MwogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogYXNzaWduX3JvbGVfYm9vbF9mYWxzZUA3Cgphc3NpZ25fcm9sZV9ib29sX3RydWVANjoKICAgIGludGNfMSAvLyAxCgphc3NpZ25fcm9sZV9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NgogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAgLy8gMjAsIDQwLCA1MCwgNjAsIDcwLCA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ1LTY3NAogICAgLy8gbWF0Y2ggcm9sZS5uYXRpdmU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCAoCiAgICAvLyAgICAgICAgICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgICAgICBjb25maWcubmF0aXZlCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCAoCiAgICAvLyAgICAgICAgICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKCkKICAgIGZyYW1lX2RpZyAwCiAgICBtYXRjaCBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8wQDkgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMUAxMCBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMyBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV81QDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzQKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjgKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIGJ5dGVjIDI2IC8vIDB4NTIzODMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY3LTY2OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzEKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3MC02NzIKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2NAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjggLy8gMHg1MjM3MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY1CiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8zQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjkgLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYyCiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1NgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMCAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTgKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1Ny02NTkKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUwCiAgICAvLyByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICBieXRlYyAzMSAvLyAweDUyMzQzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OS02NTEKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUzCiAgICAvLyBjb25maWcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTItNjU0CiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcy5uYXRpdmUKICAgIGJ5dGVjIDE4IC8vIDB4NTIzMjMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzaWduX3JvbGVfYm9vbF9tZXJnZUA4CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EucmV2b2tlX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMpIC0+IGJ5dGVzOgpyZXZva2Vfcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3Ny02NzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHJldm9rZV9yb2xlKHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4KSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTYKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk3CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5OAogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5OQogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMQogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMgogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IHJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANgoKcmV2b2tlX3JvbGVfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk3LTcwMwogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA1LTcwNgogICAgLy8gIyBBcnJhbmdlciByb2xlIGNhbiBub3QgYmUgcmV2b2tlZCAoanVzdCByb3RhdGVkKQogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwIC8vIDQwLCA1MCwgNjAsIDcwLCA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA0LTcyMgogICAgLy8gbWF0Y2ggcm9sZS5uYXRpdmU6CiAgICAvLyAgICAgIyBBcnJhbmdlciByb2xlIGNhbiBub3QgYmUgcmV2b2tlZCAoanVzdCByb3RhdGVkKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQVVUSE9SSVRZICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfSU5URVJFU1RfT1JBQ0xFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKCkKICAgIGZyYW1lX2RpZyAwCiAgICBtYXRjaCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMUA5IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzJAMTAgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTkKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjYgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIwCiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfSU5URVJFU1RfT1JBQ0xFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIzCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICBzd2FwCiAgICByZXRzdWIKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTYKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjggLy8gMHg1MjM3MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE3CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQVVUSE9SSVRZICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzJAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTMKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI5IC8vIDB4NTIzNjMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzEwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzAgLy8gMHg1MjM1MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzExCiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMxIC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYiByZXZva2Vfcm9sZV9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5vcGVuX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6Cm9wZW5fYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyNS03MjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wZW5fYWNjb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNyAvLyAyMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDYKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDcKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ4CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUxLTc1NwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MwogICAgLy8gdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU0CiAgICAvLyB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUxLTc1NwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NQogICAgLy8gcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUxLTc1NwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NgogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgYnl0ZWMgNiAvLyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU4CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE5LTEyMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDMxIC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIzLTEyNgogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNC0xMjUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQtMTI2CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNS0xMjYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQtMTI2CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuY2xvc2VfYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKY2xvc2VfYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2MC03NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5UdXBsZVthcmM0LlVJbnQ2NCwgYXJjNC5VSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzc5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODIKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MwogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlQgKyBob2xkaW5nX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4NAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBjbG9zZWRfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIHN3YXAKICAgIC0KICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1OQogICAgLy8gaWYgc2VsZi5jaXJjdWxhdGluZ191bml0cyA9PSAwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgYm56IGNsb3NlX2FjY291bnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjAKICAgIC8vIHNlbGYuc3RhdHVzID0gVUludDY0KGNmZy5TVEFUVVNfRU5ERUQpCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBpbnRjIDcgLy8gMjAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY2xvc2VfYWNjb3VudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODcKICAgIC8vIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg2LTc4OAogICAgLy8gcmV0dXJuIGFyYzQuVHVwbGUoCiAgICAvLyAgICAgKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIC8vICkKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EucHJpbWFyeV9kaXN0cmlidXRpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKcHJpbWFyeV9kaXN0cmlidXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3OTAtNzkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODQtMjg3CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NS0yODYKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg3CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg2LTI4NwogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg3CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODMtMjg4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzMKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBieXRlYyAzMCAvLyAweDUyMzUzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzMtMTM2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM1CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNS0xMzYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNC0xMzYKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzItMTM3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgxOAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIwCiAgICAvLyBhc3NlcnQgdW5pdHMubmF0aXZlID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyMgogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjEtODIzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI1CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICs9IHVuaXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNi04MjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNi04MjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IGFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBzd2FwCiAgICByZXBsYWNlMiA0MAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMwCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyAtIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgLQogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYXNzZXRfc3VzcGVuc2lvbihzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzItODMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYXNzZXRfc3VzcGVuc2lvbihzZWxmLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0NgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDcKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KHN1c3BlbmRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDIxIC8vICJzdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ5LTE1MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNzMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzLTE1NgogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NC0xNTUKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU2CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NS0xNTYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU2CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUyLTE1NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vICAgICBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2FjY291bnRfc3VzcGVuc2lvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2FjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1MC04NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hY2NvdW50X3N1c3BlbnNpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHN1c3BlbmRlZDogYXJjNC5Cb29sCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGludGMgNCAvLyA0NDgKICAgIHN3YXAKICAgIHNldGJpdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfZGVmYXVsdF9zdGF0dXMoZGVmYXVsdGVkOiBieXRlcykgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODczLTg3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2RlZmF1bHRfc3RhdHVzKHNlbGYsIGRlZmF1bHRlZDogYXJjNC5Cb29sKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBieXRlYyAyOSAvLyAweDUyMzYzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDMtMTQ2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1LTE0NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Mi0xNDcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gICAgIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODUKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KGRlZmF1bHRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9pbmZvKCkgLT4gYnl0ZXM6CmdldF9hc3NldF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg3LTg4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2luZm8oc2VsZikgLT4gdHlwLkFzc2V0SW5mbzoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk4CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTkKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAwCiAgICAvLyB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMQogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAyCiAgICAvLyBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMwogICAgLy8gdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNAogICAgLy8gY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA1LTkwNwogICAgLy8gcHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA5CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA4LTkxMAogICAgLy8gcHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTExCiAgICAvLyBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEyCiAgICAvLyBtYXR1cml0eV9kYXRlPWFyYzQuVUludDY0KHNlbGYubWF0dXJpdHlfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMwogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICBieXRlYyA2IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE0CiAgICAvLyBkZWZhdWx0ZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5kZWZhdWx0ZWQpKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgIGJ5dGVjIDYgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTctOTE1CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgLy8gKQogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBwdXNoaW50IDYwMSAvLyA2MDEKICAgIHN3YXAKICAgIHNldGJpdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNy05MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNC05MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQyCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIGJ5dGVjIDMyIC8vIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0MwogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDQKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDI3IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ1CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0Ny05NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTAKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1MQogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ5LTk1MgogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQtOTU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NgogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjUgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X3VwZGF0ZSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2Ni00NjcKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgYXNzZXRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3MS00NzQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMTAwIDggNDQ4IDEwMDAwIDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NTIzMzMwMjMgInN0YXR1cyIgImNpcmN1bGF0aW5nX3VuaXRzIiAiaXNzdWFuY2VfZGF0ZSIgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpbnRlcmVzdF9yYXRlIiAweDAwIDB4MDAwMDAwMDAwMDAwMDAwMCAidG90YWxfY291cG9ucyIgInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIgInVuaXRfdmFsdWUiICJkYXlfY291bnRfY29udmVudGlvbiIgInRvdGFsX3VuaXRzIiAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIgIm1hdHVyaXR5X2RhdGUiICJjb3Vwb25fcGVyaW9kIiAweDUyMzIzMDIzICJkZW5vbWluYXRpb25fYXNzZXRfaWQiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiICJzdXNwZW5kZWQiICJkZWZhdWx0ZWQiICJwYWlkX2NvdXBvbl91bml0cyIgMHg3NDY5NmQ2NTUwNjU3MjY5NmY2NDczICJtZXRhZGF0YSIgMHg1MjM4MzAyMyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHgwMDAwIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MyAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDEtNDIKICAgIC8vICMgUm9sZSBCYXNlZCBBY2Nlc3MgQ29udHJvbAogICAgLy8gc2VsZi5hcnJhbmdlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfQVJSQU5HRVIpCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OS02MAogICAgLy8gIyBBc3NldCBDb25maWd1cmF0aW9uCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDUgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTEgLy8gInVuaXRfdmFsdWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gVUludDY0KCkKICAgIGJ5dGVjIDEyIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUtNjYKICAgIC8vICMgTWV0YWRhdGEKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBCeXRlcygpCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OC02OQogICAgLy8gIyBTdXBwbHkKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyA9IFVJbnQ2NCgpCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzItNzMKICAgIC8vICMgSW50ZXJlc3QKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODktOTAKICAgIC8vICMgU3RhdHVzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VNUFRZKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MQogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjEgLy8gInN1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNS0zNgogICAgLy8gIyBTdGF0ZSBzY2hlbWEgdmFsaWRhdGlvbgogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkdMT0JBTF9CWVRFUywgZXJyLldST05HX0dMT0JBTF9CWVRFUwogICAgdHhuIEdsb2JhbE51bUJ5dGVTbGljZQogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIEJ5dGVzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IFR4bi5nbG9iYWxfbnVtX3VpbnQgPT0gY2ZnLkdMT0JBTF9VSU5UUywgZXJyLldST05HX0dMT0JBTF9VSU5UUwogICAgdHhuIEdsb2JhbE51bVVpbnQKICAgIHB1c2hpbnQgMTkgLy8gMTkKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgR2xvYmFsIFVJbnRzIGFsbG9jYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBhc3NlcnQgVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTCiAgICB0eG4gTG9jYWxOdW1VaW50CiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgVUludHMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyAjIENvdXBvbnMKICAgIC8vIHNlbGYuY291cG9uX3BlcmlvZCA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNyAvLyAiY291cG9uX3BlcmlvZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQzCiAgICAvLyBzZWxmLnBhaWRfY291cG9uX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDIzIC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDI4CiAgICBwdXNoYnl0ZXNzIDB4NGZkNmEzY2MgMHg4Y2YxNGI1MSAweDgwZTUxZTlmIDB4NDQzNjNkNDkgMHg2N2RiNGYyMCAweGY2YTk2YzhkIDB4MjI5YjcwNmYgMHg2M2Y5OTU4OSAweGQzYTRkNmFiIDB4MWQ2ZmMyNTUgMHhmZWY3NDU2NyAweGI4ZmMxMzkwIDB4M2Q0M2QxZjAgMHhlYmQ5NmIyZiAweDZjODVlM2VlIDB4ZjYzYWNlOGQgMHhiYmNjYTE4YSAweDFhN2JhYmI0IDB4ODBiZmNkZDEgMHhlZDAyNzU5ZiAweGZhZDIxNzNlIDB4MDhlZmVhMzUgMHhkZGNlYzA3YiAvLyBtZXRob2QgImFzc2V0X3RyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpdWludDY0IiwgbWV0aG9kICJwYXlfY291cG9uKGFkZHJlc3MsYnl0ZVtdKSh1aW50NjQsdWludDY0LGJ5dGVbXSkiLCBtZXRob2QgInVwZGF0ZV9pbnRlcmVzdF9yYXRlKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUoYWRkcmVzcyx1aW50NjQpKHVpbnQ2NCx1aW50NjQsKHVpbnQ2NCx1aW50NjQpKSIsIG1ldGhvZCAiZ2V0X3BheW1lbnRfYW1vdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRfY291cG9uc19zdGF0dXMoKSh1aW50NjQsdWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCksYm9vbCkiLCBtZXRob2QgImdldF90aW1lX3BlcmlvZHMoKSh1aW50NjQsdWludDY0KVtdIiwgbWV0aG9kICJhc3NldF9jcmVhdGUoYWRkcmVzcyxieXRlW10pdm9pZCIsIG1ldGhvZCAiYXNzZXRfY29uZmlnKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDE2W10sdWludDY0W10sKHVpbnQ2NCx1aW50NjQpW10pdm9pZCIsIG1ldGhvZCAic2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyh1aW50NjRbXSkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2lnbl9yb2xlKGFkZHJlc3MsdWludDgsYnl0ZVtdKXVpbnQ2NCIsIG1ldGhvZCAicmV2b2tlX3JvbGUoYWRkcmVzcyx1aW50OCl1aW50NjQiLCBtZXRob2QgIm9wZW5fYWNjb3VudChhZGRyZXNzLGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJjbG9zZV9hY2NvdW50KGFkZHJlc3MpKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbihhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInNldF9hc3NldF9zdXNwZW5zaW9uKGJvb2wpdWludDY0IiwgbWV0aG9kICJzZXRfYWNjb3VudF9zdXNwZW5zaW9uKGFkZHJlc3MsYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9kZWZhdWx0X3N0YXR1cyhib29sKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9pbmZvKCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sLGJvb2wpIiwgbWV0aG9kICJnZXRfYWNjb3VudF9pbmZvKGFkZHJlc3MpKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCkiLCBtZXRob2QgImdldF90aW1lX2V2ZW50cygpdWludDY0W10iLCBtZXRob2QgImdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X21ldGFkYXRhKClieXRlW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2Fzc2V0X3RyYW5zZmVyX3JvdXRlQDUgbWFpbl9wYXlfY291cG9uX3JvdXRlQDYgbWFpbl91cGRhdGVfaW50ZXJlc3RfcmF0ZV9yb3V0ZUA3IG1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA4IG1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDkgbWFpbl9nZXRfY291cG9uc19zdGF0dXNfcm91dGVAMTAgbWFpbl9nZXRfdGltZV9wZXJpb2RzX3JvdXRlQDExIG1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyIG1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDEzIG1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUAxNCBtYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDE1IG1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTYgbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTcgbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDE4IG1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMTkgbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAyMCBtYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMjEgbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMjIgbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyMyBtYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMjQgbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjUgbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyNiBtYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyNwoKbWFpbl9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfbWV0YWRhdGEKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAyNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hY2NvdW50X2luZm9fcm91dGVAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2FjY291bnRfaW5mbwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfaW5mb19yb3V0ZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2RlZmF1bHRfc3RhdHVzX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9kZWZhdWx0X3N0YXR1cwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hY2NvdW50X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2Fzc2V0X3N1c3BlbnNpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcHJpbWFyeV9kaXN0cmlidXRpb25fcm91dGVAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcHJpbWFyeV9kaXN0cmlidXRpb24KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjbG9zZV9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBvcGVuX2FjY291bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmV2b2tlX3JvbGVfcm91dGVAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcmV2b2tlX3JvbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzaWduX3JvbGVfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzaWduX3JvbGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X2NvbmZpZ19yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgUGVycGV0dWFsQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF9jb25maWcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgYXNzZXRfY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF90aW1lX3BlcmlvZHNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfdGltZV9wZXJpb2RzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9jb3Vwb25zX3N0YXR1c19yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9jb3Vwb25zX3N0YXR1cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfcGF5bWVudF9hbW91bnRfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9wYXltZW50X2Ftb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3VwZGF0ZV9pbnRlcmVzdF9yYXRlX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB1cGRhdGVfaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wYXlfY291cG9uX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTk0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwYXlfY291cG9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X3RyYW5zZmVyX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBQZXJwZXR1YWxCb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFBlcnBldHVhbEJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIG1haW5fYXNzZXRfdXBkYXRlQDI5CiAgICBiIG1haW5fYWZ0ZXJfaWZfZWxzZUAzMAoKbWFpbl9hc3NldF91cGRhdGVAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjQKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NC00NjUKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgYXNzZXRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBjYWxsc3ViIGFzc2V0X3VwZGF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmFzc2V0X3RyYW5zZmVyKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NldF90cmFuc2ZlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxNDUtMTUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF90cmFuc2ZlcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICB1bml0czogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gdW5pdHMubmF0aXZlLAogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkzLTI5NgogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NAogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0LTI5NQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0LTI5NgogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk2CiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTUtMjk2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBmcmFtZV9kaWcgNAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0LTI5NgogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5Mi0yOTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuU0VDT05EQVJZX01BUktFVF9DTE9TRUQKICAgIGFzc2VydCAvLyBTZWNvbmRhcnkgbWFya2V0IGlzIGNsb3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY3LTM2OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0cmFuc2ZlciByaWdodCB0byBELUFTQSBvd25lcnMuIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgcmVsYXkgb24gb3RoZXIKICAgIC8vICMgcm9sZXMsIGV4dGVybmFsIEFwcHMgdGhyb3VnaCBDMkMgY2FsbHMgKGUuZy4sIGFuIG9yZGVyIGJvb2spLCBvciBvZmYtY2hhaW4gdHJhbnNmZXIgYWdlbnRzLgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VuZGVyX2hvbGRpbmdfYWRkcmVzcy5uYXRpdmUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzcwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3NAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZSwgZXJyLlNVU1BFTkRFRAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDcgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3NS0zNzcKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5zdXNwZW5kZWQubmF0aXZlLCBlcnIuU1VTUEVOREVECiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDcgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3OQogICAgLy8gdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9kaWcgNQogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3OC0zODAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdW5pdHMgPD0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgLy8gKSwgZXJyLk9WRVJfVFJBTlNGRVIKICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgc2VuZGVyIHVuaXRzIHRvIHRyYW5zZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODgKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4OQogICAgLy8gaWYgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlID4gMDoKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieiBhc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwNAogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwNC0zMDUKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBiPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwNC0zMDUKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwMy0zMDYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICAvLyApLCBlcnIuTk9OX0ZVTkdJQkxFX1VOSVRTCiAgICBhc3NlcnQgLy8gU2VuZGVyIGFuZCByZWNlaXZlciB1bml0cyBhcmUgbm90IGZ1bmdpYmxlCgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE3OS0xODAKICAgIC8vICMgVHJhbnNmZXIgaXMgZm9yYmlkZGVuIGluIGNhc2Ugb2YgcGVuZGluZyBjb3Vwb24gcGF5bWVudHMKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTgxCiAgICAvLyBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50KHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0zCiAgICBkaWcgMQogICAgY2FsbHN1YiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjE4My0xODQKICAgIC8vICMgVHJhbnNmZXJyZWQgdW5pdHMgdmFsdWUgKG11c3QgYmUgY29tcHV0ZWQgYmVmb3JlIHRoZSB0cmFuc2ZlcikKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxODUtMTg3CiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gc2VsZi5hY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUsIGR1ZV9jb3Vwb25zCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjUKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgLSB1bml0cwogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDIKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNC00MjYKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgLSB1bml0cwogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI0CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI0LTQyNgogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyOAogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICB1bmNvdmVyIDMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNy00MjkKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNwogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI3LTQyOQogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gaWYgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlID09IDA6CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYm56IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IGFyYzQuVUludDY0KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA4IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgNDAKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KCkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiA0OAogICAgYm94X3B1dAoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxOTIKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCh1bml0cy5uYXRpdmUgKiBzZW5kZXJfdW5pdF92YWx1ZS5uYXRpdmUgKyBhY2NydWVkX2ludGVyZXN0KQogICAgZnJhbWVfZGlnIDAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyA1CiAgICAqCiAgICBmcmFtZV9kaWcgMwogICAgKwogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDE1Cgphc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTQKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBzZW5kZXJfdW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICByZXBsYWNlMiA0MAogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NS0zOTcKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnBhaWRfY291cG9ucwogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTUKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk1LTM5NwogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0ucGFpZF9jb3Vwb25zCiAgICBzd2FwCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICByZXBsYWNlMiA0OAogICAgYm94X3B1dAogICAgYiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDE3Cgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3RfZGVmYXVsdGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA3LTEwOAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5kZWZhdWx0ZWQsIGVyci5ERUZBVUxURUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBEZWZhdWx0ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTEtMTEyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN1c3BlbmRlZCwgZXJyLlNVU1BFTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIxIC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5jb3VudF9kdWVfY291cG9ucygpIC0+IHVpbnQ2NDoKY291bnRfZHVlX2NvdXBvbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NjYtNjcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291bnRfZHVlX2NvdXBvbnMoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NjgKICAgIC8vIGR1ZV9jb3Vwb25zID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBjdXJyZW50X3RzID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjcwCiAgICAvLyBpZiBjdXJyZW50X3RzID4gc2VsZi5pc3N1YW5jZV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgID4KICAgIGJ6IGNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBkdWVfY291cG9ucyA9IChjdXJyZW50X3RzIC0gc2VsZi5pc3N1YW5jZV9kYXRlKSAvLyBzZWxmLmNvdXBvbl9wZXJpb2QKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgLQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJjb3Vwb25fcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdXBvbl9wZXJpb2QgZXhpc3RzCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKCmNvdW50X2R1ZV9jb3Vwb25zX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo3Mi03MwogICAgLy8gICAgICMgZGl2LWJ5LXplcm86IGNvdXBvbl9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfcGVyaW9kcyBjaGVja3MKICAgIC8vIHJldHVybiBkdWVfY291cG9ucwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdm9pZDoKYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTQtOTcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIGR1ZV9jb3Vwb25zOiBVSW50NjQKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPT0gZHVlX2NvdXBvbnMKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5Ojk4LTEwMAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPT0gZHVlX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiB1aW50NjQsIGR1ZV9jb3Vwb25zOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTI3LTEzMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IFVJbnQ2NCwgZHVlX2NvdXBvbnM6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzEtMTMyCiAgICAvLyAjIFRoZSBmb2xsb3dpbmcgYXNzZXJ0IHNhZmVndWFyZHMgdGhlIHN1YnJvdXRpbmUgZnJvbSBmb3JiaWRkZW4gaW52b2NhdGlvbnMKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF9ub19wZW5kaW5nX2NvdXBvbl9wYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTMzCiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzQKICAgIC8vIGNvdXBvbl9hY2NydWVkX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzUKICAgIC8vIGNvdXBvbl9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTM3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzgKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEzNy0xMzgKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzctMTM5CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTQxCiAgICAvLyBjc3QuQlBTICogY291cG9uX3BlcmlvZAogICAgaW50YyA1IC8vIDEwMDAwCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMzctMTQyCiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAvLyAqIGNvdXBvbl9hY2NydWVkX3BlcmlvZAogICAgLy8gLy8gKAogICAgLy8gICAgIGNzdC5CUFMgKiBjb3Vwb25fcGVyaW9kCiAgICAvLyApICAjIGRpdi1ieS16ZXJvOiBjb3Vwb25fcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX3BlcmlvZHMgY2hlY2tzCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTM2LTE0MwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgLy8gICAgICogY291cG9uX2FjY3J1ZWRfcGVyaW9kCiAgICAvLyAgICAgLy8gKAogICAgLy8gICAgICAgICBjc3QuQlBTICogY291cG9uX3BlcmlvZAogICAgLy8gICAgICkgICMgZGl2LWJ5LXplcm86IGNvdXBvbl9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfcGVyaW9kcyBjaGVja3MKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmRheV9jb3VudF9mYWN0b3IoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gYnl0ZXM6CmRheV9jb3VudF9mYWN0b3I6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTA2LTEwNwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBkYXlfY291bnRfZmFjdG9yKHNlbGYsIGR1ZV9jb3Vwb25zOiBVSW50NjQpIC0+IHR5cC5EYXlDb3VudEZhY3RvcjoKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMDgtMTA5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGlmIG5vdCBkdWVfY291cG9uczoKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IGRheV9jb3VudF9mYWN0b3JfZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMTAKICAgIC8vIGFjY3J1aW5nX3N0YXJ0X3RpbWUgPSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMTMKICAgIC8vIGNvdXBvbl9hY2NydWVkX3BlcmlvZCA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIC0gYWNjcnVpbmdfc3RhcnRfdGltZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgc3dhcAogICAgLQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMTQKICAgIC8vIGNvdXBvbl9wZXJpb2QgPSBzZWxmLmNvdXBvbl9wZXJpb2QKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY291cG9uX3BlcmlvZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY291cG9uX3BlcmlvZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMTUKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPT0gVUludDY0KGNzdC5EQ0NfQV9BKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpbnRjXzIgLy8gMTAwCiAgICA9PQogICAgc3dhcAogICAgZnJhbWVfYnVyeSA0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEKICAgIGJ6IGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDcKICAgIC8vIHJldHVybiB0aW1lX3BlcmlvZCAvLyBVSW50NjQoY3N0LkRBWV8yX1NFQykKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjIDYgLy8gODY0MDAKICAgIC8KICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjIDYgLy8gODY0MDAKICAgIC8KICAgIGZyYW1lX2J1cnkgNAogICAgZnJhbWVfYnVyeSAxCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VANToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjExOQogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KGNvdXBvbl9hY2NydWVkX3BlcmlvZCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTIwCiAgICAvLyBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChjb3Vwb25fcGVyaW9kKSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToxMTgtMTIxCiAgICAvLyByZXR1cm4gdHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChjb3Vwb25fYWNjcnVlZF9wZXJpb2QpLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGNvdXBvbl9wZXJpb2QpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZGF5X2NvdW50X2ZhY3Rvcl9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo4MQogICAgLy8gY291cG9uX2R1ZV9kYXRlID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo4MgogICAgLy8gaWYgZHVlX2NvdXBvbnMgPj0gVUludDY0KDEpOgogICAgZnJhbWVfZGlnIC0xCiAgICBieiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBjb3Vwb25fZHVlX2RhdGUgPSBzZWxmLmNvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2J1cnkgMgoKZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDg6CiAgICBmcmFtZV9kaWcgMgogICAgYiBkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmNvdXBvbl9kdWVfZGF0ZShjb3Vwb246IHVpbnQ2NCkgLT4gdWludDY0Ogpjb3Vwb25fZHVlX2RhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NzUtNzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY291cG9uX2R1ZV9kYXRlKHNlbGYsIGNvdXBvbjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo3NwogICAgLy8gcmV0dXJuIHNlbGYuaXNzdWFuY2VfZGF0ZSArIGNvdXBvbiAqIHNlbGYuY291cG9uX3BlcmlvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAiY291cG9uX3BlcmlvZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3Vwb25fcGVyaW9kIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICArCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWNjb3VudF91bml0c192YWx1ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzMy0zMzYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzNwogICAgLy8gcmV0dXJuIHVuaXRzICogc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZS5uYXRpdmUKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLnBheV9jb3Vwb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9pbmZvOiBieXRlcykgLT4gYnl0ZXM6CnBheV9jb3Vwb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTk0LTE5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X2NvdXBvbigKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMTctMjE4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjE5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMjAKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMjIKICAgIC8vIHVuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMjMKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5OT19VTklUUwogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjI0CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gYWNjb3VudF9wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMjYKICAgIC8vIGFzc2VydCBkdWVfY291cG9ucyA+IGFjY291bnRfcGFpZF9jb3Vwb25zLCBlcnIuTk9fRFVFX0NPVVBPTgogICAgc3dhcAogICAgZGlnIDEKICAgID4KICAgIGFzc2VydCAvLyBObyBkdWUgY291cG9uIHRvIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIyNy0yMzAKICAgIC8vICMgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHZlcmlmeSBpZiBvdGhlciBhY2NvdW50cyBhcmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHBheW1lbnQgb2YgcHJldmlvdXMgY291cG9ucwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoCiAgICAvLyAgICAgYWNjb3VudF9wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTIKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTEtMzEzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgLy8gICAgIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTEtMzE0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgLy8gICAgIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkKICAgIC8vICkKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZQogICAgYnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTQKICAgIC8vIGFuZCBub3Qgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDcgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBibnogcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDE0CiAgICBpbnRjXzEgLy8gMQoKcGF5X2NvdXBvbl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIzMwogICAgLy8gaWYgc2VsZi5pc19wYXltZW50X2V4ZWN1dGFibGUoaG9sZGluZ19hZGRyZXNzKToKICAgIGJ6IHBheV9jb3Vwb25fZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyMzUKICAgIC8vIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYWNjb3VudF90b3RhbF91bml0c192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEwNAogICAgLy8gcmV0dXJuIHByaW5jaXBhbF9hbW91bnQgKiBzZWxmLmludGVyZXN0X3JhdGUgLy8gY3N0LkJQUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgICoKICAgIGludGMgNSAvLyAxMDAwMAogICAgLwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjAKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyMC0zMjEKICAgIC8vIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE5LTMyMgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjIzOS0yNDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUgYXNzZXQgZm9yIGRlbm9taW5hdGlvbiBhbmQgc2V0dGxlbWVudCwgbm8gY29udmVyc2lvbiBuZWVkZWQKICAgIC8vIHNlbGYucGF5KHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcywgcGF5bWVudF9hbW91bnQpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyNi0zMzEKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlci5uYXRpdmUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMwCiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI3CiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjYtMzMxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucy5uYXRpdmUgKyAxCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDUtMjQ3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlICsgMQogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDUtMjQ3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMubmF0aXZlICsgMQogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDgKICAgIC8vIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgKz0gdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAicGFpZF9jb3Vwb25fdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGFpZF9jb3Vwb25fdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgYnl0ZWMgMjMgLy8gInBhaWRfY291cG9uX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTAKICAgIC8vIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjUxCiAgICAvLyB0aW1lc3RhbXA9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI0OS0yNTMKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudFJlc3VsdCgKICAgIC8vICAgICBhbW91bnQ9YXJjNC5VSW50NjQocGF5bWVudF9hbW91bnQpLAogICAgLy8gICAgIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICAvLyAgICAgY29udGV4dD1wYXltZW50X2luZm8uY29weSgpLCAgIyBUT0RPOiBBZGQgaW5mbyBvbiBmYWlsZWQgcGF5bWVudAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDEyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKcGF5X2NvdXBvbl9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNDItMjQzCiAgICAvLyAjIEFjY291bnRzIHN1c3BlbmRlZCBvciBub3Qgb3B0ZWQgaW4gYXQgdGhlIHRpbWUgb2YgcGF5bWVudHMgbXVzdCBub3Qgc3RhbGwgdGhlIEQtQVNBCiAgICAvLyBwYXltZW50X2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgYiBwYXlfY291cG9uX2FmdGVyX2lmX2Vsc2VAMwoKcGF5X2NvdXBvbl9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X2NvdXBvbl9ib29sX21lcmdlQDE1CgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuYWxsX2R1ZV9jb3Vwb25zX3BhaWQoZHVlX2NvdXBvbnM6IHVpbnQ2NCkgLT4gdWludDY0OgphbGxfZHVlX2NvdXBvbnNfcGFpZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo5MC05MQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhbGxfZHVlX2NvdXBvbnNfcGFpZChzZWxmLCBkdWVfY291cG9uczogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6OTIKICAgIC8vIHJldHVybiBzZWxmLnBhaWRfY291cG9uX3VuaXRzID49IHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBkdWVfY291cG9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIzIC8vICJwYWlkX2NvdXBvbl91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYWlkX2NvdXBvbl91bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgPj0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdWludDY0OgphY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzM5LTM0MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0MgogICAgLy8gaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDEtMzQzCiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQudXBkYXRlX2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZTogYnl0ZXMpIC0+IGJ5dGVzOgp1cGRhdGVfaW50ZXJlc3RfcmF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNTUtMjU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB1cGRhdGVfaW50ZXJlc3RfcmF0ZShzZWxmLCBpbnRlcmVzdF9yYXRlOiBhcmM0LlVJbnQ2NCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMjYgLy8gMHg1MjM4MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTYxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2MwogICAgLy8gY2FsbGVyIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjMtMTY2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2NAogICAgLy8gYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X29yYWNsZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY0LTE2NQogICAgLy8gYW5kIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2NC0xNjYKICAgIC8vIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2NgogICAgLy8gPD0gc2VsZi5pbnRlcmVzdF9vcmFjbGVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X29yYWNsZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTY1LTE2NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE2NC0xNjYKICAgIC8vIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgp1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNjItMTY3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gICAgIGFuZCBzZWxmLmludGVyZXN0X29yYWNsZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHNlbGYuaW50ZXJlc3Rfb3JhY2xlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjI3MwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mjc0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNzUKICAgIC8vIGR1ZV9jb3Vwb25zID0gc2VsZi5jb3VudF9kdWVfY291cG9ucygpCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mjc2CiAgICAvLyBhc3NlcnQgc2VsZi5hbGxfZHVlX2NvdXBvbnNfcGFpZChkdWVfY291cG9ucyksIGVyci5QRU5ESU5HX0NPVVBPTl9QQVlNRU5UCiAgICBjYWxsc3ViIGFsbF9kdWVfY291cG9uc19wYWlkCiAgICBhc3NlcnQgLy8gUGVuZGluZyBkdWUgY291cG9uIHBheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyNzgtMjc5CiAgICAvLyAjIFVwZGF0ZSBpbnRlcmVzdCByYXRlCiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weToyODAKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiB1cGRhdGVfaW50ZXJlc3RfcmF0ZV9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MjgyLTI4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IHR5cC5DdXJyZW50VW5pdHNWYWx1ZToKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzAzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMwMy0zMDQKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzA0CiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzAzLTMwNAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMDItMzA1CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyApLCBlcnIuTk9fUFJJTUFSWV9ESVNUUklCVVRJT04KICAgIGFzc2VydCAvLyBQcmltYXJ5IGRpc3RyaWJ1dGlvbiBub3QgeWV0IGV4ZWN1dGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzA4CiAgICAvLyAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjIDggLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDcKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBiPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzA3LTMwOQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9VTklUUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYW1vdW50IG9mIHVuaXRzIGZvciB0aGUgYWNjb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMTEtMzE0CiAgICAvLyAjIFZhbHVlIGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbgogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlID0gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzE1LTMxNgogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdCBkdXJpbmcgcHJpbWFyeSBkaXN0cmlidXRpb24KICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMxNwogICAgLy8gbnVtZXJhdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMTgKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMjAtMzIxCiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0CiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKQogICAgY2FsbHN1YiBjb3VudF9kdWVfY291cG9ucwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMjIKICAgIC8vIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfY291cG9uX3BheW1lbnQoaG9sZGluZ19hZGRyZXNzLCBkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgY2FsbHN1YiBhc3NlcnRfbm9fcGVuZGluZ19jb3Vwb25fcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyMwogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdCgpOgogICAgY2FsbHN1YiBpc19hY2NydWluZ19pbnRlcmVzdAogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzI0CiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKGR1ZV9jb3Vwb25zKQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzI1LTMyNwogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IHNlbGYuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUsIGR1ZV9jb3Vwb25zCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyA2CiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMyOAogICAgLy8gbnVtZXJhdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzI5CiAgICAvLyBkZW5vbWluYXRvciA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IubmF0aXZlCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgMwoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzMQogICAgLy8gdW5pdHNfdmFsdWU9YXJjNC5VSW50NjQoYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlKSwKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzMyCiAgICAvLyBhY2NydWVkX2ludGVyZXN0PWFyYzQuVUludDY0KGFjY3J1ZWRfaW50ZXJlc3QpLAogICAgZnJhbWVfZGlnIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzQKICAgIC8vIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgZnJhbWVfZGlnIDUKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozMzUKICAgIC8vIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIGZyYW1lX2RpZyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzMzLTMzNgogICAgLy8gZGF5X2NvdW50X2ZhY3Rvcj10eXAuRGF5Q291bnRGYWN0b3IoCiAgICAvLyAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgLy8gKSwKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjMzMC0zMzcKICAgIC8vIHJldHVybiB0eXAuQ3VycmVudFVuaXRzVmFsdWUoCiAgICAvLyAgICAgdW5pdHNfdmFsdWU9YXJjNC5VSW50NjQoYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlKSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PWFyYzQuVUludDY0KGFjY3J1ZWRfaW50ZXJlc3QpLAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDgKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5pc19hY2NydWluZ19pbnRlcmVzdCgpIC0+IHVpbnQ2NDoKaXNfYWNjcnVpbmdfaW50ZXJlc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTIzLTEyNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBpc19hY2NydWluZ19pbnRlcmVzdChzZWxmKSAtPiBib29sOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MTI1CiAgICAvLyByZXR1cm4gc2VsZi5pc3N1YW5jZV9kYXRlICE9IDAgYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID4gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgYnogaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUAzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgPgogICAgYnogaXNfYWNjcnVpbmdfaW50ZXJlc3RfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgppc19hY2NydWluZ19pbnRlcmVzdF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gcmV0dXJuIHNlbGYuaXNzdWFuY2VfZGF0ZSAhPSAwIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnBlcnBldHVhbF9ib25kLmNvbnRyYWN0LlBlcnBldHVhbEJvbmQuZ2V0X3BheW1lbnRfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfcGF5bWVudF9hbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzM5LTM0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3BheW1lbnRfYW1vdW50KHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiB0eXAuUGF5bWVudEFtb3VudHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM1NQogICAgLy8gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzU2CiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNTUtMzU2CiAgICAvLyBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNTcKICAgIC8vIC8vIGNzdC5CUFMKICAgIGludGMgNSAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM1NS0zNTcKICAgIC8vIHNlbGYuYWNjb3VudF90b3RhbF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MpCiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgLy8gLy8gY3N0LkJQUwogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM2MAogICAgLy8gaW50ZXJlc3Q9YXJjNC5VSW50NjQoaW50ZXJlc3RfYW1vdW50KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNjEKICAgIC8vIHByaW5jaXBhbD1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozNTktMzYyCiAgICAvLyByZXR1cm4gdHlwLlBheW1lbnRBbW91bnRzKAogICAgLy8gICAgIGludGVyZXN0PWFyYzQuVUludDY0KGludGVyZXN0X2Ftb3VudCksCiAgICAvLyAgICAgcHJpbmNpcGFsPWFyYzQuVUludDY0KCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5wZXJwZXR1YWxfYm9uZC5jb250cmFjdC5QZXJwZXR1YWxCb25kLmdldF9jb3Vwb25zX3N0YXR1cygpIC0+IGJ5dGVzOgpnZXRfY291cG9uc19zdGF0dXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzY0LTM2NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2NvdXBvbnNfc3RhdHVzKHNlbGYpIC0+IHR5cC5Db3Vwb25zSW5mbzoKICAgIHByb3RvIDAgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzczCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKSBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSBlbHNlIFVJbnQ2NCgpCiAgICBieiBnZXRfY291cG9uc19zdGF0dXNfdGVybmFyeV9mYWxzZUAyCiAgICBjYWxsc3ViIGNvdW50X2R1ZV9jb3Vwb25zCiAgICBmcmFtZV9idXJ5IDIKCmdldF9jb3Vwb25zX3N0YXR1c190ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6ODgKICAgIC8vIHJldHVybiBzZWxmLmNvdXBvbl9kdWVfZGF0ZShkdWVfY291cG9ucyArIDEpCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgY2FsbHN1YiBjb3Vwb25fZHVlX2RhdGUKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM3NQogICAgLy8gYWxsX2R1ZV9jb3Vwb25zX3BhaWQgPSBzZWxmLmFsbF9kdWVfY291cG9uc19wYWlkKGR1ZV9jb3Vwb25zKQogICAgY2FsbHN1YiBhbGxfZHVlX2NvdXBvbnNfcGFpZAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzc2CiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM3NwogICAgLy8gZGVub21pbmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM3OAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdCgpOgogICAgY2FsbHN1YiBpc19hY2NydWluZ19pbnRlcmVzdAogICAgYnogZ2V0X2NvdXBvbnNfc3RhdHVzX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM3OQogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcihkdWVfY291cG9ucykKICAgIGZyYW1lX2RpZyAyCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODAKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4MQogICAgLy8gZGVub21pbmF0b3IgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDEKCmdldF9jb3Vwb25zX3N0YXR1c19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzgzCiAgICAvLyB0b3RhbF9jb3Vwb25zPWFyYzQuVUludDY0KHNlbGYudG90YWxfY291cG9ucyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4NAogICAgLy8gZHVlX2NvdXBvbnM9YXJjNC5VSW50NjQoZHVlX2NvdXBvbnMpLAogICAgZnJhbWVfZGlnIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozODUKICAgIC8vIG5leHRfY291cG9uX2R1ZV9kYXRlPWFyYzQuVUludDY0KG5leHRfY291cG9uX2R1ZV9kYXRlKSwKICAgIGZyYW1lX2RpZyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzg3CiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIGZyYW1lX2RpZyA0CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6Mzg4CiAgICAvLyBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjM4Ni0zODkKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICksCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTozOTAKICAgIC8vIGFsbF9kdWVfY291cG9uc19wYWlkPWFyYzQuQm9vbChhbGxfZHVlX2NvdXBvbnNfcGFpZCksCiAgICBieXRlYyA3IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgMAogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzgyLTM5MQogICAgLy8gcmV0dXJuIHR5cC5Db3Vwb25zSW5mbygKICAgIC8vICAgICB0b3RhbF9jb3Vwb25zPWFyYzQuVUludDY0KHNlbGYudG90YWxfY291cG9ucyksCiAgICAvLyAgICAgZHVlX2NvdXBvbnM9YXJjNC5VSW50NjQoZHVlX2NvdXBvbnMpLAogICAgLy8gICAgIG5leHRfY291cG9uX2R1ZV9kYXRlPWFyYzQuVUludDY0KG5leHRfY291cG9uX2R1ZV9kYXRlKSwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICAgICApLAogICAgLy8gICAgIGFsbF9kdWVfY291cG9uc19wYWlkPWFyYzQuQm9vbChhbGxfZHVlX2NvdXBvbnNfcGFpZCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9jb3Vwb25zX3N0YXR1c190ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzczCiAgICAvLyBkdWVfY291cG9ucyA9IHNlbGYuY291bnRfZHVlX2NvdXBvbnMoKSBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSBlbHNlIFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCiAgICBiIGdldF9jb3Vwb25zX3N0YXR1c190ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMucGVycGV0dWFsX2JvbmQuY29udHJhY3QuUGVycGV0dWFsQm9uZC5nZXRfdGltZV9wZXJpb2RzKCkgLT4gYnl0ZXM6CmdldF90aW1lX3BlcmlvZHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6MzkzLTM5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3RpbWVfcGVyaW9kcyhzZWxmKSAtPiB0eXAuVGltZVBlcmlvZHM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MDEKICAgIC8vIHRpbWVfcGVyaW9kcyA9IHR5cC5UaW1lUGVyaW9kcygpCiAgICBieXRlYyAzMiAvLyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NDAyCiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF90aW1lX3BlcmlvZHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NDAzCiAgICAvLyB0aW1lX3BlcmlvZHMgPSBzZWxmLnRpbWVfcGVyaW9kcy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDI0IC8vIDB4NzQ2OTZkNjU1MDY1NzI2OTZmNjQ3MwogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX3BlcmlvZHMgZXhpc3RzCgpnZXRfdGltZV9wZXJpb2RzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo0MDQKICAgIC8vIHJldHVybiB0aW1lX3BlcmlvZHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jcmVhdGUoYXJyYW5nZXI6IGJ5dGVzLCBtZXRhZGF0YTogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1Mi00NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGFzc2V0X2NyZWF0ZShzZWxmLCBhcnJhbmdlcjogYXJjNC5BZGRyZXNzLCBtZXRhZGF0YTogdHlwLkFzc2V0TWV0YWRhdGEpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2MQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IGFycmFuZ2VyLm5hdGl2ZQogICAgYnl0ZWMgMTggLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYyCiAgICAvLyBzZWxmLm1ldGFkYXRhID0gbWV0YWRhdGEubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfY29uZmlnKGRlbm9taW5hdGlvbl9hc3NldF9pZDogYnl0ZXMsIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGJ5dGVzLCBwcmluY2lwYWw6IGJ5dGVzLCBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYnl0ZXMsIGRheV9jb3VudF9jb252ZW50aW9uOiBieXRlcywgaW50ZXJlc3RfcmF0ZTogYnl0ZXMsIGNvdXBvbl9yYXRlczogYnl0ZXMsIHRpbWVfZXZlbnRzOiBieXRlcywgdGltZV9wZXJpb2RzOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDc0LTQ4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzZXRfY29uZmlnKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBzZXR0bGVtZW50X2Fzc2V0X2lkOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwcmluY2lwYWw6IGFyYzQuVUludDY0LAogICAgLy8gICAgIG1pbmltdW1fZGVub21pbmF0aW9uOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBkYXlfY291bnRfY29udmVudGlvbjogYXJjNC5VSW50OCwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlOiBhcmM0LlVJbnQxNiwKICAgIC8vICAgICBjb3Vwb25fcmF0ZXM6IHR5cC5Db3Vwb25SYXRlcywKICAgIC8vICAgICB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMsCiAgICAvLyAgICAgdGltZV9wZXJpb2RzOiB0eXAuVGltZVBlcmlvZHMsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA5IDAKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTE1CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MTYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VNUFRZLCBlcnIuQUxSRUFEWV9DT05GSUdVUkVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBELUFTQSBhbHJlYWR5IGNvbmZpZ3VyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUxOC01MTkKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5hc3NlcnRfZGVub21pbmF0aW9uX2Fzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTkKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc3CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGZyYW1lX2RpZyAzCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzUtMTc4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIGRlbm9taW5hdGlvbiB3aXRoIEFTQQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQgIT0gVUludDY0KDApIGFuZCBBc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQpLmNyZWF0b3IKICAgIC8vICksIGVyci5JTlZBTElEX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIERlbm9taW5hdGlvbiBhc3NldCBpcyBub3QgcHJvcGVybHkgc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODIKICAgIC8vIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkID0gZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjItNTIzCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTgKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkIGV4aXN0cwogICAgZGlnIDEKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxODYtMTg5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc2V0dGxlbWVudCBhc3NldCBpcyB0aGUgZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQgPT0gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIC8vICksIGVyci5JTlZBTElEX1NFVFRMRU1FTlRfQVNTRVQKICAgIGFzc2VydCAvLyBEaWZmZXJlbnQgc2V0dGxlbWVudCBhc3NldCBub3Qgc3VwcG9ydGVkLCBtdXN0IGJlIGVxdWFsIHRvIGRlbm9taW5hdGlvbiBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTkzCiAgICAvLyBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgPSBzZXR0bGVtZW50X2Fzc2V0X2lkCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0yMDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NgogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk3CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk0LTE5NQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTQtMjAwCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI4CiAgICAvLyBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIGZyYW1lX2RpZyAtNwogICAgYnRvaQogICAgZnJhbWVfZGlnIC02CiAgICBidG9pCiAgICBkdXAyCiAgICAlCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjYtNTI5CiAgICAvLyAjIFNldCBQcmluY2lwYWwgYW5kIE1pbmltdW0gRGVub21pbmF0aW9uCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgLy8gKSwgZXJyLklOVkFMSURfTUlOSU1VTV9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBNaW5pbXVtIGRlbm9taW5hdGlvbiBpcyBub3QgYSBkaXZpc29yIG9mIHByaW5jaXBhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMwCiAgICAvLyBzZWxmLnVuaXRfdmFsdWUgPSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIGJ5dGVjIDExIC8vICJ1bml0X3ZhbHVlIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzEKICAgIC8vIHNlbGYudG90YWxfdW5pdHMgPSBwcmluY2lwYWwubmF0aXZlIC8vIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgLwogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMy01MzQKICAgIC8vICMgU2V0IERheS1Db3VudCBDb252ZW50aW9uCiAgICAvLyBzZWxmLmFzc2VydF9kYXlfY291bnRfY29udmVudGlvbihkYXlfY291bnRfY29udmVudGlvbi5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTUKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDYKICAgIC8vIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICBpbnRjXzIgLy8gMTAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDQtMjA4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYm56IGFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTYKICAgIGZyYW1lX2RpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDcKICAgIC8vIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDQtMjA4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VAMTcKCmFzc2V0X2NvbmZpZ19ib29sX3RydWVAMTY6CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMDQtMjA4CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCBkYXlfY291bnRfY29udmVudGlvbiBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIC8vICksIGVyci5JTlZBTElEX0RBWV9DT1VOVF9DT05WRU5USU9OCiAgICBhc3NlcnQgLy8gSW52YWxpZCBkYXktY291bnQgY29udmVudGlvbiBJRAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjEyCiAgICAvLyBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID0gZGF5X2NvdW50X2NvbnZlbnRpb24KICAgIGJ5dGVjIDEyIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGZyYW1lX2RpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTM3LTUzOAogICAgLy8gIyBTZXQgSW50ZXJlc3QgUmF0ZQogICAgLy8gc2VsZi5hc3NlcnRfaW50ZXJlc3RfcmF0ZShpbnRlcmVzdF9yYXRlLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjE2CiAgICAvLyBhc3NlcnQgaW50ZXJlc3RfcmF0ZSA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfSU5URVJFU1RfUkFURQogICAgZHVwCiAgICBhc3NlcnQgLy8gSW50ZXJlc3QgcmF0ZSBpcyBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjIwCiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBpbnRlcmVzdF9yYXRlCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gYXNzZXJ0IG5vdCBjb3Vwb25fcmF0ZXMubGVuZ3RoLCBlcnIuSU5WQUxJRF9DT1VQT05fUkFURVMKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgICEKICAgIGFzc2VydCAvLyBDb3Vwb24gcmF0ZXMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjgKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IGNvdXBvbl9yYXRlcy5sZW5ndGgKICAgIGJ5dGVjIDkgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI5CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAzMyAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMzMgLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9wdXQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjQ3LTUwCiAgICAvLyAjIFRoZSBwZXJwZXR1YWwgYm9uZCBoYXMgdW5kZWZpbmVkIGNvdXBvbnMgKHRvdGFsX2NvdXBvbnMgPSAwKSBhbmQgbm8gbWF0dXJpdHkgZGF0ZQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICAvLyApLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTQ3CiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjYwCiAgICAvLyBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlID0gdGltZV9ldmVudHMuY29weSgpCiAgICBieXRlYyAyNyAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDI3IC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGZyYW1lX2RpZyAtMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjYxLTI2MwogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjYxCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MS0yNjMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0LTI2NgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjQKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAyMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0LTI2NgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjcKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5JU1NVQU5DRV9EQVRFX0lEWF0ubmF0aXZlCiAgICBleHRyYWN0IDE2IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OS0yNzAKICAgIC8vICMgU29tZSBELUFTQSBtYXkgbm90IGhhdmUgYSBtYXR1cml0eSBkYXRlIChlLmcuLCBwZXJwZXR1YWxzKQogICAgLy8gaWYgdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUzoKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIHB1c2hpbnQgNCAvLyA0CiAgICArCiAgICA9PQogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI3MQogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlID0gdGltZV9ldmVudHNbY2ZnLk1BVFVSSVRZX0RBVEVfSURYXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieXRlYyAxNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wZXJwZXR1YWxfYm9uZC9jb250cmFjdC5weTo1NC01NQogICAgLy8gIyBUaGUgcGVycGV0dWFsIGJvbmQgZGVmaW5lcyBhIHNpbmdsZSB0aW1lIHBlcmlvZCBmb3IgdGhlIGNvdXBvbiBkdXJhdGlvbiB3aXRoIHVubGltaXRlZCByZXBldGl0aW9ucwogICAgLy8gYXNzZXJ0IHRpbWVfcGVyaW9kcy5sZW5ndGggPT0gVUludDY0KDEpLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgYXJlIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvcGVycGV0dWFsX2JvbmQvY29udHJhY3QucHk6NTYKICAgIC8vIGNvdXBvbl9wZXJpb2RfZHVyYXRpb24gPSB0aW1lX3BlcmlvZHNbMF1bMF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBleHRyYWN0IDAgMTYgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjU3CiAgICAvLyByZXBldGl0aW9ucyA9IHRpbWVfcGVyaW9kc1swXVsxXS5uYXRpdmUKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBhc3NlcnQgY291cG9uX3BlcmlvZF9kdXJhdGlvbiA+IFVJbnQ2NCgwKSwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RfRFVSQVRJT04KICAgIHN3YXAKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZCBkdXJhdGlvbnMgbXVzdCBiZSBzdHJpY3RseSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBhc3NlcnQgcmVwZXRpdGlvbnMgPT0gVUludDY0KDApLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRF9SRVBFVElUSU9OUwogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kIHJlcGV0aXRpb25zIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBzZWxmLnRpbWVfcGVyaW9kcy52YWx1ZSA9IHRpbWVfcGVyaW9kcy5jb3B5KCkKICAgIGJ5dGVjIDI0IC8vIDB4NzQ2OTZkNjU1MDY1NzI2OTZmNjQ3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAyNCAvLyAweDc0Njk2ZDY1NTA2NTcyNjk2ZjY0NzMKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BlcnBldHVhbF9ib25kL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBzZWxmLmNvdXBvbl9wZXJpb2QgPSBzZWxmLnRpbWVfcGVyaW9kcy52YWx1ZVswXVswXS5uYXRpdmUKICAgIGJ5dGVjIDI0IC8vIDB4NzQ2OTZkNjU1MDY1NzI2OTZmNjQ3MwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9wZXJpb2RzIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIGV4dHJhY3QgMCAxNiAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgMTcgLy8gImNvdXBvbl9wZXJpb2QiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU0CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGludGNfMiAvLyAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTUtMTE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM4LTIzOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlbGYsIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cykgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MQogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MgogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQxLTI0MgogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQwLTI0MwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyAgICAgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRQogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDAKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ0CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4OgogICAgcHVzaGludCA3NSAvLyA3NQogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxNAogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDM0IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMzQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ5CiAgICAvLyB0aW1lX2kgPSB0aW1lX2V2ZW50c1tfdF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gdGltZV9mID0gdGltZV9ldmVudHNbX3QgKyAxXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTEKICAgIC8vIGFzc2VydCB0aW1lX2YgPiB0aW1lX2ksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiAhPSBVSW50NjQoY3N0LkRDQ19DT05UKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBwdXNoaW50IDI1NSAvLyAyNTUKICAgICE9CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUzLTI1NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUzLTI1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIC8vICAgICBjc3QuREFZXzJfU0VDCiAgICAvLyApID09IDAsIGVyci5JTlZBTElEX1RJTUVfUEVSSU9ECiAgICBpbnRjIDYgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTYtNTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU3NwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDcgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTc4CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTc5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4MQogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODIKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODMKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODUKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4Ni01ODgKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4NS01ODgKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODQtNTg5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTAtNTkyCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MwogICAgLy8gaWYgc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk1CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk3CiAgICAvLyBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk2LTU5OAogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk1LTU5OAogICAgLy8gc2VsZi5tYXR1cml0eV9kYXRlCiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBkaWcgMQogICAgPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NC01OTkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5tYXR1cml0eV9kYXRlCiAgICAvLyAgICAgPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gICAgIF0ubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9TRUNPTkRBUllfQ0xPU1VSRV9EQVRFCiAgICBhc3NlcnQgLy8gSW52YWxpZCBzZWNvbmRhcnkgbWFya2V0IGNsb3N1cmUgZGF0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAwCiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMC02MDIKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDUKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDQtNjA2CiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA4CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA3LTYwOQogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMy02MTAKICAgIC8vIHJldHVybiB0eXAuU2Vjb25kYXJ5TWFya2V0U2NoZWR1bGUoCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NpZ25fcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcywgY29uZmlnOiBieXRlcykgLT4gYnl0ZXM6CmFzc2lnbl9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEyLTYxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzaWduX3JvbGUoCiAgICAvLyAgICAgc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgsIGNvbmZpZzogYXJjNC5EeW5hbWljQnl0ZXMKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzMwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzYKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzgKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDEKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IGFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANwoKYXNzaWduX3JvbGVfYm9vbF90cnVlQDY6CiAgICBpbnRjXzEgLy8gMQoKYXNzaWduX3JvbGVfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDQKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIHB1c2hpbnRzIDIwIDQwIDUwIDYwIDcwIDgwIC8vIDIwLCA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0My02NzIKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKToKICAgIC8vICAgICAgICAgc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcy5uYXRpdmUKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgKAogICAgLy8gICAgICAgICAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgICAgICBjb25maWcubmF0aXZlCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgKAogICAgLy8gICAgICAgICAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgICAgICBjb25maWcubmF0aXZlCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5IGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTAgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8zQDEyIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzRAMTMgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjcyCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV81QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY2CiAgICAvLyByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICBieXRlYyAyNiAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2NS02NjcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY5CiAgICAvLyBjb25maWcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjgtNjcwCiAgICAvLyBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjczCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICBzd2FwCiAgICByZXRzdWIKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzRAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjIKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2MwogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1OQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI5IC8vIDB4NTIzNjMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2MAogICAgLy8gc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzAgLy8gMHg1MjM1MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU2CiAgICAvLyBjb25maWcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTUtNjU3CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0OAogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgYnl0ZWMgMzEgLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDctNjQ5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1MQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUwLTY1MgogICAgLy8gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8wQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDUKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICBieXRlYyAxOCAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnJldm9rZV9yb2xlKHJvbGVfYWRkcmVzczogYnl0ZXMsIHJvbGU6IGJ5dGVzKSAtPiBieXRlczoKcmV2b2tlX3JvbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzUtNjc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiByZXZva2Vfcm9sZShzZWxmLCByb2xlX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcm9sZTogYXJjNC5VSW50OCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5MwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk0CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTYKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MCAvLyA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTcKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUtNzAxCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5OAogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTkKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MCAvLyA3MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgcHVzaGludCA4MCAvLyA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiByZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDYKCnJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCnJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NS03MDEKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMy03MDQKICAgIC8vICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICBwdXNoaW50cyA0MCA1MCA2MCA3MCA4MCAvLyA0MCwgNTAsIDYwLCA3MCwgODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMi03MjAKICAgIC8vIG1hdGNoIHJvbGUubmF0aXZlOgogICAgLy8gICAgICMgQXJyYW5nZXIgcm9sZSBjYW4gbm90IGJlIHJldm9rZWQgKGp1c3Qgcm90YXRlZCkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycigpCiAgICBmcmFtZV9kaWcgMAogICAgbWF0Y2ggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTEgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIwCiAgICAvLyBvcC5lcnIoKQogICAgZXJyCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzODMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxOAogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0lOVEVSRVNUX09SQUNMRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI4IC8vIDB4NTIzNzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FVVEhPUklUWSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8yQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzExCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyOSAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTIKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzFAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDMwIC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwOQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMSAvLyAweDUyMzQzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDYKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Eub3Blbl9hY2NvdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpvcGVuX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjMtNzI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBvcGVuX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDMKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDcgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ1CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDcKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18xIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEKICAgIC8vIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICBieXRlYyA4IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MgogICAgLy8gdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTMKICAgIC8vIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgOCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0OS03NTUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTQKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIGJ5dGVjIDcgLy8gMHgwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOS0xMjAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICBieXRlYyAzMSAvLyAweDUyMzQzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMy0xMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9tYW5hZ2VyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQtMTI1CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9tYW5hZ2VyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjUtMTI2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMi0xMjcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmNsb3NlX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmNsb3NlX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTgtNzYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbG9zZV9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVHVwbGVbYXJjNC5VSW50NjQsIGFyYzQuVUludDY0XToKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzc2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzgwCiAgICAvLyBjbG9zZWRfdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODEKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UICsgaG9sZGluZ19hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODIKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gY2xvc2VkX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBzd2FwCiAgICAtCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNTcKICAgIC8vIGlmIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPT0gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGJueiBjbG9zZV9hY2NvdW50X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU4CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMiAvLyAic3RhdHVzIgogICAgaW50YyA3IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmNsb3NlX2FjY291bnRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg1CiAgICAvLyAoYXJjNC5VSW50NjQoY2xvc2VkX3VuaXRzKSwgYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApKQogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4NC03ODYKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKAogICAgLy8gICAgIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICAvLyApCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnByaW1hcnlfZGlzdHJpYnV0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg4LTc5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcHJpbWFyeV9kaXN0cmlidXRpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg0LTI4NwogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1LTI4NwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODcKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4Ni0yODcKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBmcmFtZV9kaWcgMgogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1LTI4NwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgzLTI4OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgYnl0ZWMgMzAgLy8gMHg1MjM1MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzLTEzNgogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2RlYWxlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0LTEzNQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0LTEzNgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUtMTM2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMyLTEzNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gICAgIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MTYKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODE3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgxOAogICAgLy8gYXNzZXJ0IHVuaXRzLm5hdGl2ZSA+IDAsIGVyci5aRVJPX1VOSVRTCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODE5LTgyMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMubmF0aXZlIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyMwogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArPSB1bml0cy5uYXRpdmUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjQtODI2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjQtODI2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBhcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmVwbGFjZTIgNDAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIC0KICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyOgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMwoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2Fzc2V0X3N1c3BlbnNpb24oc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMwLTgzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2Fzc2V0X3N1c3BlbnNpb24oc2VsZiwgc3VzcGVuZGVkOiBhcmM0LkJvb2wpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDQKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ1CiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NChzdXNwZW5kZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAyMSAvLyAic3VzcGVuZGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OS0xNTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICBieXRlYyAyOCAvLyAweDUyMzczMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1My0xNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0LTE1NgogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTUtMTU2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0LTE1NgogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Mi0xNTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyAgICAgYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9hY2NvdW50X3N1c3BlbnNpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hY2NvdW50X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDgtODUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODY2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMSAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBpbnRjIDQgLy8gNDQ4CiAgICBzd2FwCiAgICBzZXRiaXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2RlZmF1bHRfc3RhdHVzKGRlZmF1bHRlZDogYnl0ZXMpIC0+IHZvaWQ6CnNldF9kZWZhdWx0X3N0YXR1czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MS04NzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9kZWZhdWx0X3N0YXR1cyhzZWxmLCBkZWZhdWx0ZWQ6IGFyYzQuQm9vbCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgYnl0ZWMgMjkgLy8gMHg1MjM2MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzLTE0NgogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NgogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ2CiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NS0xNDYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NgogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDItMTQ3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vICAgICBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgzCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IFVJbnQ2NChkZWZhdWx0ZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAyMiAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfaW5mbygpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NS04ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9pbmZvKHNlbGYpIC0+IHR5cC5Bc3NldEluZm86CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NgogICAgLy8gZGVub21pbmF0aW9uX2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NwogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5OAogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTkKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAwCiAgICAvLyBkYXlfY291bnRfY29udmVudGlvbj1hcmM0LlVJbnQ4KHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24pLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDEKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAyCiAgICAvLyB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAzCiAgICAvLyBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDQtOTA2CiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDgKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDctOTA5CiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTAKICAgIC8vIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTEKICAgIC8vIG1hdHVyaXR5X2RhdGU9YXJjNC5VSW50NjQoc2VsZi5tYXR1cml0eV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTEyCiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKGJvb2woc2VsZi5zdXNwZW5kZWQpKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAic3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1c3BlbmRlZCBleGlzdHMKICAgIGJ5dGVjIDcgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTMKICAgIC8vIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgYnl0ZWMgNyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NS05MTQKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgLy8gKQogICAgdW5jb3ZlciAxMwogICAgdW5jb3ZlciAxMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgNjY1IC8vIDY2NQogICAgc3dhcAogICAgc2V0Yml0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYWNjb3VudF9pbmZvKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYWNjb3VudF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE2LTkxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FjY291bnRfaW5mbyhzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLkFjY291bnRJbmZvOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzEgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMxCiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfdGltZV9ldmVudHMoKSAtPiBieXRlczoKZ2V0X3RpbWVfZXZlbnRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMzLTkzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3RpbWVfZXZlbnRzKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDEKICAgIC8vIHRpbWVfZXZlbnRzID0gdHlwLlRpbWVFdmVudHMoKQogICAgYnl0ZWMgMzIgLy8gMHgwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQyCiAgICAvLyBpZiBzZWxmLnN0YXR1c19pc19hY3RpdmUoKToKICAgIGJ6IGdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0MwogICAgLy8gdGltZV9ldmVudHMgPSBzZWxmLnRpbWVfZXZlbnRzLnZhbHVlLmNvcHkoKQogICAgYnl0ZWMgMjcgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50aW1lX2V2ZW50cyBleGlzdHMKCmdldF90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDQKICAgIC8vIHJldHVybiB0aW1lX2V2ZW50cwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKCkgLT4gYnl0ZXM6CmdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ2LTk0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoc2VsZikgLT4gdHlwLlRpbWVFdmVudHM6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NQogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU2CiAgICAvLyBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTQtOTU3CiAgICAvLyByZXR1cm4gdHlwLlRpbWVFdmVudHMoCiAgICAvLyAgICAgYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICAvLyApCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2Fzc2V0X21ldGFkYXRhKCkgLT4gYnl0ZXM6CmdldF9hc3NldF9tZXRhZGF0YToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1OS05NjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9tZXRhZGF0YShzZWxmKSAtPiB0eXAuQXNzZXRNZXRhZGF0YToKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTY3CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0TWV0YWRhdGEoc2VsZi5tZXRhZGF0YSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyNSAvLyAibWV0YWRhdGEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWV0YWRhdGEgZXhpc3RzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfdXBkYXRlKCkgLT4gdm9pZDoKYXNzZXRfdXBkYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY0LTQ2NQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiBhc3NldF91cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY5LTQ3MgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0aGUgdXBkYXRlIHBlcm1pc3Npb25zIHRvIHRoZSBBcnJhbmdlci4KICAgIC8vICMgT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSBkaXNhYmxlIEQtQVNBIGFwcGxpY2F0aW9uIHVwZGF0YWJpbGl0eSBvciBjaGFuZ2UgaXRzIGF1dGhvcml6YXRpb25zLgogICAgLy8gIyDimqDvuI8gV0FSTklORzogQXBwbGljYXRpb24gdXBkYXRlcyBtdXN0IGJlIGV4ZWN1dGVkIFZFUlkgY2FyZWZ1bGx5LCBhcyB0aGV5IG1pZ2h0IGludHJvZHVjZSBicmVha2luZyBjaGFuZ2VzLgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { @@ -482,7 +486,7 @@ ], "returns": { "type": "(uint64,uint64,byte[])", - "desc": "Paid coupon amount, Payment timestamp, Payment context" + "desc": "Paid coupon amount in denomination asset, Payment timestamp, Payment context" }, "desc": "Pay due coupon to an account" }, @@ -795,8 +799,8 @@ "name": "get_asset_info", "args": [], "returns": { - "type": "(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", - "desc": "Denomination Asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary Distribution Opening Date, Primary Distribution Closure Date, Issuance Date, Maturity Date, Suspended, Defaulted" + "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", + "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Defaulted" }, "desc": "Get D-ASA info" }, @@ -811,7 +815,7 @@ ], "returns": { "type": "(address,uint64,uint64,uint64,bool)", - "desc": "Payment Address, D-ASA units, Unit value, Paid coupons, Suspended" + "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" }, "desc": "Get account info" }, @@ -828,15 +832,19 @@ "name": "get_secondary_market_schedule", "args": [], "returns": { - "type": "uint64[]" - } + "type": "uint64[]", + "desc": "Secondary market schedule" + }, + "desc": "Get secondary market schedule" }, { "name": "get_asset_metadata", "args": [], "returns": { - "type": "byte[]" - } + "type": "byte[]", + "desc": "Asset metadata" + }, + "desc": "Get D-ASA metadata" } ], "networks": {}, @@ -1196,6 +1204,7 @@ def method() -> str: @dataclasses.dataclass(kw_only=True) class AssetInfo: denomination_asset_id: int + settlement_asset_id: int outstanding_principal: int unit_value: int day_count_convention: int @@ -1216,7 +1225,7 @@ class GetAssetInfoArgs(_ArgsBase[AssetInfo]): @staticmethod def method() -> str: - return "get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)" + return "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)" @dataclasses.dataclass(kw_only=True) @@ -1251,6 +1260,8 @@ def method() -> str: @dataclasses.dataclass(kw_only=True) class GetSecondaryMarketScheduleArgs(_ArgsBase[list[int]]): + """Get secondary market schedule""" + @staticmethod def method() -> str: return "get_secondary_market_schedule()uint64[]" @@ -1258,6 +1269,8 @@ def method() -> str: @dataclasses.dataclass(kw_only=True) class GetAssetMetadataArgs(_ArgsBase[bytes | bytearray]): + """Get D-ASA metadata""" + @staticmethod def method() -> str: return "get_asset_metadata()byte[]" @@ -1832,7 +1845,7 @@ def get_asset_info( ) -> "Composer": """Get D-ASA info - Adds a call to `get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)` ABI method + Adds a call to `get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters :returns Composer: This Composer instance""" @@ -1897,7 +1910,9 @@ def get_secondary_market_schedule( *, transaction_parameters: algokit_utils.TransactionParameters | None = None, ) -> "Composer": - """Adds a call to `get_secondary_market_schedule()uint64[]` ABI method + """Get secondary market schedule + + Adds a call to `get_secondary_market_schedule()uint64[]` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters :returns Composer: This Composer instance""" @@ -1916,7 +1931,9 @@ def get_asset_metadata( *, transaction_parameters: algokit_utils.TransactionParameters | None = None, ) -> "Composer": - """Adds a call to `get_asset_metadata()byte[]` ABI method + """Get D-ASA metadata + + Adds a call to `get_asset_metadata()byte[]` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters :returns Composer: This Composer instance""" @@ -2171,7 +2188,7 @@ def pay_coupon( :param str holding_address: Account Holding Address :param bytes | bytearray payment_info: Additional payment information (Optional) :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[PaymentResult]: Paid coupon amount, Payment timestamp, Payment context""" + :returns algokit_utils.ABITransactionResponse[PaymentResult]: Paid coupon amount in denomination asset, Payment timestamp, Payment context""" args = PayCouponArgs( holding_address=holding_address, @@ -2603,10 +2620,10 @@ def get_asset_info( ) -> algokit_utils.ABITransactionResponse[AssetInfo]: """Get D-ASA info - Calls `get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)` ABI method + Calls `get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[AssetInfo]: Denomination Asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary Distribution Opening Date, Primary Distribution Closure Date, Issuance Date, Maturity Date, Suspended, Defaulted""" + :returns algokit_utils.ABITransactionResponse[AssetInfo]: Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Defaulted""" args = GetAssetInfoArgs() result = self.app_client.call( @@ -2631,7 +2648,7 @@ def get_account_info( :param str holding_address: Account Holding Address :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[AccountInfo]: Payment Address, D-ASA units, Unit value, Paid coupons, Suspended""" + :returns algokit_utils.ABITransactionResponse[AccountInfo]: Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended""" args = GetAccountInfoArgs( holding_address=holding_address, @@ -2671,10 +2688,12 @@ def get_secondary_market_schedule( *, transaction_parameters: algokit_utils.TransactionParameters | None = None, ) -> algokit_utils.ABITransactionResponse[list[int]]: - """Calls `get_secondary_market_schedule()uint64[]` ABI method + """Get secondary market schedule + + Calls `get_secondary_market_schedule()uint64[]` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[list[int]]: The result of the transaction""" + :returns algokit_utils.ABITransactionResponse[list[int]]: Secondary market schedule""" args = GetSecondaryMarketScheduleArgs() result = self.app_client.call( @@ -2689,10 +2708,12 @@ def get_asset_metadata( *, transaction_parameters: algokit_utils.TransactionParameters | None = None, ) -> algokit_utils.ABITransactionResponse[bytes | bytearray]: - """Calls `get_asset_metadata()byte[]` ABI method + """Get D-ASA metadata + + Calls `get_asset_metadata()byte[]` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[bytes | bytearray]: The result of the transaction""" + :returns algokit_utils.ABITransactionResponse[bytes | bytearray]: Asset metadata""" args = GetAssetMetadataArgs() result = self.app_client.call( diff --git a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.puya.map b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.puya.map index 7f22951..dfd3bf8 100644 --- a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.puya.map +++ b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.puya.map @@ -4,7 +4,7 @@ "../../base_d_asa/contract.py", "../../zero_coupon_bond/contract.py" ], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCmD;;AAAf;;AAA5B;AAkBA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AACA;;AAAkB;AAAlB;AACA;;AAA4B;AAA5B;AAGA;;AAAgB;;AAAhB;AAGA;;AAAmB;AAAnB;AACA;AAAyB;AAAzB;AAGA;;AAAqB;AAArB;AAIA;;AAAqB;AAArB;AAKA;;AAAyC;AAAzC;AACA;;AAAyC;AAAzC;AACA;;AAAqB;AAArB;AACA;;AAAqC;AAArC;AACA;;AAAqC;AAArC;AACA;;AAAqB;AAArB;AAGA;AAAc;AAAd;AACA;;AAAiB;AAAjB;AACA;;AAAiB;AAAjB;ACxDO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AApBR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;ADu6BK;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAPA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjBA;;AAAA;AAAA;AAAA;;AAAA;ACl4BL;;;ADk4BK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9BA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAdA;;AAAA;AAAA;AAAA;;AAAA;ACt1BL;;;ADs1BK;;;AAAA;;AAvBA;;AAAA;AAAA;AAAA;;AAAA;AC/zBL;;;AAAA;;;AD+zBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlBA;;AAAA;AAAA;AAAA;;AAAA;AC7yBL;;;AD6yBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA1CA;;AAAA;AAAA;AAAA;;AAAA;ACnwBL;;;AAAA;;;ADmwBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9BA;;AAAA;AAAA;AAAA;;AAAA;ACruBL;;;ADquBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAnCA;;AAAA;AAAA;AAAA;;AAAA;AClsBL;;;AAAA;;;ADksBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhDA;;AAAA;AAAA;AAAA;;AAAA;AClpBL;;;AAAA;;;ADkpBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/DA;;AAAA;AAAA;AAAA;;AAAA;ACnlBL;;;AAAA;;;AAAA;;;ADmlBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAxDA;;AAAA;AAAA;AAAA;;AAAA;AC3hBL;;;AD2hBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlFA;;AAAA;AAAA;AAAA;;AAAA;ACzcL;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;ADycK;;;AAAA;;AAtBA;;AAAA;AAAA;AAAA;;AAAA;AAAA;ACnbL;;;AAAA;;;ADmbK;;;AAAA;;AClOA;;AAAA;AAAA;AAAA;;AAAA;AAjNL;;;AAiNK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAnEA;;AAAA;AAAA;AAAA;;AAAA;AA9IL;;;AAAA;;;AA8IK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA1CA;;AAAA;AAAA;AAAA;;AAAA;AApGL;;;AAAA;;;AAoGK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA5CA;;AAAA;AAAA;AAAA;;AAAA;AAxDL;;;AAAA;;;AAAA;;;AAwDK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAxDL;;AAAA;;AAAA;;;;AAAA;;;AD+bK;;AAAA;AAAL;;;AAAA;;ACvYA;;;;;;;;;AA8BY;;AAAA;ADJG;AAAA;AAAA;AAAA;AAAe;AAAf;AAgMH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AA+EO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AA1M0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AA6MW;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;AAAP;AACW;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;AAAP;AAIa;;AAAA;AAAA;AAAA;;;AAAA;AAAT;;AAAA;AADJ;AAUoB;AAAA;AAAA;AAAA;;;AAApB;;AACG;AAAA;AAAA;;;AAAA;AAAX;;;AAvFY;;AAAA;AAAA;AAAA;;;AAAmC;;AAAA;AAAA;AAAA;;;AAAnC;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AAAqC;;AAAA;AAAA;AAAA;;;AAArC;AADJ;;;;AADJ;AClMoB;;AAAA;AAAA;AAAA;AAAA;;;AAApB;;AACA;;AAAA;;AAAA;AAAA;;AAAmB;;;AAAnB;;AD6TI;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AADyC;AAA7C;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAII;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAD2C;AAA/C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AA5EG;AAAA;AAAA;;;AAAA;AAAX;;;AACY;;AAAA;AAAA;AAAA;AAA2C;;AAA3C;;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAA6C;;AAA7C;;AAAA;AC9O8B;;AAAA;AAAf;;AAAA;AAAA;;AAAA;AAAZ;AAAP;;AAAA;;;;;ADuRI;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AACsD;;AAAA;AAAA;AAAtD;;AAAA;AAAA;AAAA;AAAsD;;;AAAtD;;AAAA;;;;;;;;AAlSZ;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAER;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;ACtDR;;;AAI2B;;;AACF;AAAA;;;AAAA;AACE;AAAA;;;AAAA;AAEf;;AAAA;;AAAA;;;AACE;AAAA;;AAAA;AAAA;AADF;AAAA;;AAAA;AAII;;AAAA;;AAAA;AAJJ;AADJ;AAzBR;;;AAGyB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AAAjB;AACmB;AAAA;;AAAA;AAAA;AAAqB;AAAA;;AAAA;AAAA;AAArB;AAAnB;AAAA;;AACG;AAAA;;AAAA;AAAA;AAA6B;AAA7B;;;;AAAX;;;AD+Se;;AAAe;;AAAf;AAAA;;AAAe;;AAAf;;;;;;;;;AC3SO;AACE;AAAA;AAFT;AAAP;;AAAA;AD8RR;;;AAIuB;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAR;;AAAA;AAAP;AC5NR;;;ADlBe;AAAA;AAAA;AAAA;AAAe;AAAf;AAgVP;AACA;;;AACA;;;AA5Q0B;AAAnB;;AAAA;AAAA;;AAAA;AAAA;;AAAP;AA8QQ;AAAA;AAAA;AAAA;;;AAAA;AACR;AACO;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AAAP;AApII;AAAA;AAAA;;;AACU;AAAA;;AAAA;AAAA;AADV;;AAAA;;AAAA;;;AAGQ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;;;;AC1KhB;;;AACY;;AAAiB;;;AAAjB;ADgLI;;AADE;AAAA;;AAAA;AAAA;AAAN;;AAAA;AAAA;;AAAA;AADJ;AC1Ka;;AAAA;AAAA;AAAA;;;ADmLb;AAIQ;;AAHO;AAAA;;AAAA;AAAA;;;;;;;;;;;AADf;;;;;;AAAA;AA0HA;AAAA;AAAA;AAAA;AAA0B;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAA1B;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAsC;;AAAtC;;AAAA;AACA;;;ACxSW;AACe;;AAAZ;AAFP;AAAA;;;;AAAA;AAAA;;AAAA;AAAP;AAAA;AAHqB;;;;;;;;AD6L7B;;;AAG6B;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AADd;;AAAA;AAAA;;;AAAP;AAcR;;;AAEW;AAAA;AAAA;AAAA;AAAX;;;AACY;AAAc;;AAAd;;ACvMZ;;;;;;;;AAoBY;AAAA;;AAAA;AAAA;AAAA;;;AACI;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;;;;AADJ;ADT0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;ACeI;;AAAA;;AAAA;AAAA;;;AAAa;;AAAA;AAAA;AAAA;;;AAAA;AAAT;AAAA;;AAAA;AAAJ;;;;AADJ;AAKqB;;AAAA;AAAA;AAAA;;AADrB;;AAAA;AAA8B;;;AAA9B;AAAA;;AAIkC;AAAA;;AAAA;AAAA;AAA9B;;AAAA;AAAoD;;AAApD;AAKA;AADJ;;AAKmB;AAAnB;;AACY;AAAZ;;AACc;AAAd;;AAnJO;AAAA;;AAAA;AAAA;AAAsB;;AAAA;AAAA;;AAAtB;AAAA;;;AAAgD;AAAA;;AAAA;AAAA;AAA1B;;AAAA;AAAtB;;;;AAsJf;;;AAC+B;;;AACnB;;AAAA;;AAAmB;;;AAAnB;;AAGY;AAAA;;;AAAA;AAAZ;;AACc;;;AAAA;AAAd;;AAGD;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AAAX;;;;;;;AAIwB;;AAAA;AACK;;AAAA;AAEH;;AAAA;AACE;;AAAA;AAFC;AAHd;;AAAA;AAAA;AAAA;AAAP;;AAAA;;;;;;;;;;;;;AASR;;;ADzDkC;AAAnB;;AAAA;AAAA;AAAA;;AAAP;ACyEkB;AACC;;ADhJZ;AAAA;AAAA;AAAe;AAAf;ACiJf;;;AACY;;AAAmB;;;AAAnB;AAAA;;AACqC;AAAA;;AAAA;AAAA;AAAnB;AAAyC;;AAAzC;AAAlB;;AAES;;AAAA;AACC;;AAAA;AAFP;AAAP;;AAAA;AD6MR;;;AASQ;;AAAA;;AAAA;AACgB;;AAAA;;;AAAhB;;AAAA;AAAA;;AAYR;;;;;;;AAyCQ;;;AACO;AAAA;AAAA;AAAA;AAAA;AAAP;AAG+B;;AAAA;AAAA;AAxV3B;;;AAAuC;;AAAA;;AAAA;AAAA;;AAAA;AAAvC;;;;AADJ;AAMA;;AAAA;;AAAA;AAuV6B;;AAAA;AAjVF;AAAA;;AAAA;AAAA;AAAvB;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAEA;AAIQ;;AAHO;AAAA;;AAAA;AAAA;AACI;;AACF;;;;;;;AAHjB;;;;;;AAAA;AA+UI;;AAAA;AAAmB;;AAAA;AAAnB;AAAA;AAAA;AADJ;AAGA;;AAAA;;AAAA;AACmB;AAAnB;;AAAA;AAAA;AAGiC;;AAAA;AAAA;AAAA;;AA1U7B;AADG;AAAA;;;AAAA;;AAEH;;;AAFG;AAAA;;;;AAAP;AAOA;;AAAA;;AAAA;AAwU0B;;AAAA;AApU1B;AAAA;AAIA;;AAAA;AAAA;AAIW;;AAAA;AAAA;AAAJ;AAAA;AAAP;AAIA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AAAX;;;AACY;;AAAA;;AAAA;;AAAA;;AAAA;AAKA;;AAAA;AAAA;AAAsB;AAAA;;AAAA;AAAA;AAAqB;;AAArB;AAAtB;AADJ;AA2TA;;AAAA;;;AAAA;;AAjSA;;AAAA;;AAAA;;AAAA;;AAAA;AACyC;;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGyC;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGqB;;;AAAA;AAArB;;AAAA;AAAA;AAGG;;AAAA;AAAA;AAAA;AAAA;;AAAsB;AAAA;;AAAA;AAAA;AAAqB;;AAArB;AAAtB;AAAX;;;AACiC;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAArB;;AAAA;AAAA;AAIO;;AAAA;AAAA;AAAJ;AAAP;AAyRA;AAAc;AAAd;;;;;;;;;;AAzbR;;;AAEe;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAP;;AAyHR;;;;;;AAGY;;AAAA;;;AAAA;AAAA;;;AAAA;AACE;;AADF;AADJ;AAIiB;;AAAA;AAAA;AAAqB;AAArB;AAAP;AAAA;;AAAA;;AAAA;AAAlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKqB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AAAA;;AAC0B;AAAL;AAAA;AAAA;;AAAZ;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AACO;AAAP;AACG;AAAA;;AAAA;AAAA;AAA6B;;;AAA7B;AAAf;;;AAEwB;;AAAA;;AAAA;AAAmB;;AAApB;AAAA;AAAP;;;;;;;;;AAgThB;;;;AAqBQ;;;AA1dO;AAAA;AAAA;AAAA;AAAe;;AAAf;AA2dA;AAAP;AACA;;;AAEO;;AAAA;AAAA;AAAP;AAAA;AACyC;AAAtC;;;;AAAX;;;AACY;;AAAA;;;;AAAA;;;;;;;;AAEA;AAAA;;AAAA;AAAA;AACG;;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAEI;;AAAA;AAAA;AADD;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAKI;AAAA;;AAAA;AAAA;AAD0B;AAI1B;AAAA;;AAAA;AAAA;AAD0B;AAJ3B;AAAP;;AAAA;AASR;;;AAqBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;AASS;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA6BQ;AANwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;AAKW;;AAAZ;AAAP;AAAA;AAXmC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACyD;;AAAA;;;AAAzD;;;;AAJ2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACuD;;AAAA;;;AAAvD;;;;AAN2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEI;;AAAA;;;AADJ;;;;AAPwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;;;;AALA;;AAAA;;AAAA;;;;;;;;AA8BhB;;;AAkBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAAP;AASS;;;;;;;AAFT;;AAAA;;;;;;;;;;;;AAkBQ;AAHuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAGW;;AAAZ;AAAP;AAAA;AAP+B;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;;;;;AAiBhB;;;AAoBQ;;;AAhoBO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAioBA;AAAP;AACA;;;AACA;;;AAC8B;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEgC;;AAEtB;;AAFsB;AAGjB;;AAHiB;AAIf;;AAJe;AAKlB;;AALkB;AAAhC;AAOmB;;AAAZ;AAAP;AA/nBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AA8nBR;;;AAkBQ;;;AACA;;;AAhmB0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAmmBe;AAAA;AAAA;AAAA;;;AAAA;AACf;AAAA;;AACA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AACA;;;AAEK;AAAuC;;AAAZ;AADzB;AAAP;AAIR;;;;;;;AAjrBe;AAAA;AAAA;AAAA;AAAe;AAAf;AAuLH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AAtJc;;AAFQ;;AAElB;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAuC0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAuoBA;;;AACA;;;AACO;;AAAA;AAAP;AAAA;AAEI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAyC;AAAA;;AAAA;AAAA;AAAzC;AADJ;AAIA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAEI;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AADkC;AAAtC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAGuD;AAAA;;AAAA;AAAA;AAAZ;AAA3C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AACmB;AAAA;;AAAA;AAAA;AAAmB;AAAA;AAAA;AAAA;AAAnB;AAAZ;AAAP;;AAAA;;;;;;;;;AAER;;;AAcQ;;;AACiB;;;AAAO;AAAxB;;AAAA;AAAA;AACmB;;AAAZ;AAAP;AA3rBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AA0rBR;;;AAkBQ;;;AAzrB0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AA2rBA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AACmB;;AAAZ;AAAP;AAER;;;;AA1tBsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAuuBiB;;;AAAO;AAAxB;;AAAA;AAAA;;;;;;AAER;;;AAW8C;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AAAZ;AACC;AAAA;;AAAA;AAAA;AAAZ;AACqB;AAAA;;AAAA;AAAA;AAAX;AAAA;;;AACK;AAAA;;AAAA;AAAA;AAAZ;AAAA;;;AACW;AAAA;;AAAA;AAAA;AAAZ;AACkB;AAAA;AAAA;AAAA;AAAZ;AAEf;AAAA;;AAAA;AAAA;AAD8B;AAI9B;AAAA;;AAAA;AAAA;AAD8B;AAGR;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AACW;AAAA;;AAAA;AAAA;AAAf;;AAAA;AAAA;;AAAA;AACe;AAAA;;AAAA;AAAA;AAAf;;AAAA;AAAA;;AAAA;AAjBP;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAP;AAoBR;;;AA1uBkC;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAyvBO;AAAA;AAAP;AAER;;;AAQsB;;;;AAz0BP;AAAA;AAAA;AAAA;AAAe;AAAf;AA00Bf;;;AAC0B;;AAAA;AAAA;AAAA;;AAAA;AAClB;;AAAA;AAAA;AAER;;;AAGwB;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AAFG;AAAA;;;;AAAA;AAAA;AAAP;AAKR;;;AAEiC;AAAA;;AAAA;AAAA;AAAlB;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAP;AA1eR;;;AAQQ;;;", + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCmD;;AAAf;;AAA5B;AAkBA;;AAA6B;AAA7B;AACA;;AAA2B;AAA3B;AACA;;AAAkB;AAAlB;AACA;;AAA4B;AAA5B;AAGA;;AAAgB;;AAAhB;AAGA;;AAAmB;AAAnB;AACA;AAAyB;AAAzB;AAGA;;AAAqB;AAArB;AAIA;;AAAqB;AAArB;AAKA;;AAAyC;AAAzC;AACA;;AAAyC;AAAzC;AACA;;AAAqB;AAArB;AACA;;AAAqC;AAArC;AACA;;AAAqC;AAArC;AACA;;AAAqB;AAArB;AAGA;AAAc;AAAd;AACA;;AAAiB;AAAjB;AACA;;AAAiB;AAAjB;ACxDO;;AAA6B;;AAA7B;AAAP;AACO;;AAAuB;;AAAvB;AAAP;AACO;;AAAA;AAAP;AACO;;AAAA;AAAP;AApBR;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AD46BK;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAbA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAjBA;;AAAA;AAAA;AAAA;;AAAA;ACj4BL;;;ADi4BK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/BA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAdA;;AAAA;AAAA;AAAA;;AAAA;ACp1BL;;;ADo1BK;;;AAAA;;AAvBA;;AAAA;AAAA;AAAA;;AAAA;AC7zBL;;;AAAA;;;AD6zBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlBA;;AAAA;AAAA;AAAA;;AAAA;AC3yBL;;;AD2yBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA1CA;;AAAA;AAAA;AAAA;;AAAA;ACjwBL;;;AAAA;;;ADiwBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA9BA;;AAAA;AAAA;AAAA;;AAAA;ACnuBL;;;ADmuBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAnCA;;AAAA;AAAA;AAAA;;AAAA;AChsBL;;;AAAA;;;ADgsBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAhDA;;AAAA;AAAA;AAAA;;AAAA;AChpBL;;;AAAA;;;ADgpBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA/DA;;AAAA;AAAA;AAAA;;AAAA;ACjlBL;;;AAAA;;;AAAA;;;ADilBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAxDA;;AAAA;AAAA;AAAA;;AAAA;ACzhBL;;;ADyhBK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAlFA;;AAAA;AAAA;AAAA;;AAAA;ACvcL;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;AAAA;;;ADucK;;;AAAA;;AAtBA;;AAAA;AAAA;AAAA;;AAAA;AAAA;ACjbL;;;AAAA;;;ADibK;;;AAAA;;AChOA;;AAAA;AAAA;AAAA;;AAAA;AAjNL;;;AAiNK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAnEA;;AAAA;AAAA;AAAA;;AAAA;AA9IL;;;AAAA;;;AA8IK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA1CA;;AAAA;AAAA;AAAA;;AAAA;AApGL;;;AAAA;;;AAoGK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AA5CA;;AAAA;AAAA;AAAA;;AAAA;AAxDL;;;AAAA;;;AAAA;;;AAwDK;;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAxDL;;AAAA;;AAAA;;;;AAAA;;;AD6bK;;AAAA;AAAL;;;AAAA;;ACrYA;;;;;;;;;AA8BY;;AAAA;ADJG;AAAA;AAAA;AAAA;AAAe;AAAf;AAgMH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AA6EO;;AAAA;;AAAA;AAAP;AACA;;;AACA;;;AAxM0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AAA0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAP;AA2MW;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;AAAP;AACW;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;AAAP;AAIa;;AAAA;AAAA;AAAA;;;AAAA;AAAT;;AAAA;AADJ;AAUoB;AAAA;AAAA;AAAA;;;AAApB;;AACG;AAAA;AAAA;;;AAAA;AAAX;;;AArFY;;AAAA;AAAA;AAAA;;;AAAmC;;AAAA;AAAA;AAAA;;;AAAnC;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AAAqC;;AAAA;AAAA;AAAA;;;AAArC;AADJ;;;;AADJ;AClMoB;;AAAA;AAAA;AAAA;AAAA;;;AAApB;;AACA;;AAAA;;AAAA;AAAA;;AAAmB;;;AAAnB;;AD2TI;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AADyC;AAA7C;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAII;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;;AAAA;AAD2C;AAA/C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AA5EG;AAAA;AAAA;;;AAAA;AAAX;;;AACY;;AAAA;AAAA;AAAA;AAA2C;;AAA3C;;AAAA;;AAAA;AAAA;AACA;AAAA;AAAA;AAA6C;;AAA7C;;AAAA;AC5O8B;;AAAA;AAAf;;AAAA;AAAA;;AAAA;AAAZ;AAAP;;AAAA;;;;;ADqRI;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AACsD;;AAAA;AAAA;AAAtD;;AAAA;AAAA;AAAA;AAAsD;;;AAAtD;;AAAA;;;;;;;;AAhSZ;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;AAER;;;AAEmB;AAAA;;AAAA;AAAA;AAAJ;AAAP;;ACtDR;;;AAI2B;;;AACF;AAAA;;;AAAA;AACE;AAAA;;;AAAA;AAEf;;AAAA;;AAAA;;;AACE;AAAA;;AAAA;AAAA;AADF;AAAA;;AAAA;AAII;;AAAA;;AAAA;AAJJ;AADJ;AAzBR;;;AAGyB;;AAA0B;AAAA;;AAAA;AAAA;AAA1B;AAAjB;AACmB;AAAA;;AAAA;AAAA;AAAqB;AAAA;;AAAA;AAAA;AAArB;AAAnB;AAAA;;AACG;AAAA;;AAAA;AAAA;AAA6B;AAA7B;;;;AAAX;;;AD6Se;;AAAe;;AAAf;AAAA;;AAAe;;AAAf;;;;;;;;;ACzSO;AACE;AAAA;AAFT;AAAP;;AAAA;AD4RR;;;AAIuB;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAR;;AAAA;AAAP;AC1NR;;;ADlBe;AAAA;AAAA;AAAA;AAAe;AAAf;AA8UP;AACA;;;AACA;;;AA1Q0B;AAAnB;;AAAA;AAAA;;AAAA;AAAA;;AAAP;AA4QQ;AAAA;AAAA;AAAA;;;AAAA;AACR;AACO;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AAAP;AAlII;AAAA;AAAA;;;AACU;AAAA;;AAAA;AAAA;AADV;;AAAA;;AAAA;;;AAGQ;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAJ;;;;AC1KhB;;;AACY;;AAAiB;;;AAAjB;AD+KwC;;AAAlC;AAAA;;AAAA;AAAA;AAAN;;AAAA;AAAA;;AAAA;AADJ;AC1Ka;;AAAA;AAAA;AAAA;;;ADiLb;AAIQ;;AAHO;AAAA;;AAAA;AAAA;;;;;;;;;;;AADf;;;;;;AAAA;AA0HA;AAAA;AAAA;AAAA;AAA0B;;AAAA;AAAA;;AAAA;AAAA;AAAA;;;AAAA;AAA1B;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAsC;;AAAtC;;AAAA;AACA;;;ACtSW;AACe;;AAAZ;AAFP;AAAA;;;;AAAA;AAAA;;AAAA;AAAP;AAAA;AAHqB;;;;;;;;AD2L7B;;;AAG6B;AAAA;;AAAA;AAAA;AAAA;AAAA;;;AAAA;AADd;;AAAA;AAAA;;;AAAP;AAcR;;;AAEW;AAAA;AAAA;AAAA;AAAX;;;AACY;AAAc;;AAAd;;ACrMZ;;;;;;;;AAoBY;AAAA;;AAAA;AAAA;AAAA;;;AACI;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AADJ;;;;AADJ;ADT0B;AAAnB;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAP;ACeI;;AAAA;;AAAA;AAAA;;;AAAa;;AAAA;AAAA;AAAA;;;AAAA;AAAT;AAAA;;AAAA;AAAJ;;;;AADJ;AAKqB;;AAAA;AAAA;AAAA;;AADrB;;AAAA;AAA8B;;;AAA9B;AAAA;;AAIkC;AAAA;;AAAA;AAAA;AAA9B;;AAAA;AAAoD;;AAApD;AAKA;AADJ;;AAKmB;AAAnB;;AACY;AAAZ;;AACc;AAAd;;AAnJO;AAAA;;AAAA;AAAA;AAAsB;;AAAA;AAAA;;AAAtB;AAAA;;;AAAgD;AAAA;;AAAA;AAAA;AAA1B;;AAAA;AAAtB;;;;AAsJf;;;AAC+B;;;AACnB;;AAAA;;AAAmB;;;AAAnB;;AAGY;AAAA;;;AAAA;AAAZ;;AACc;;;AAAA;AAAd;;AAGD;;AAA2B;AAAA;;AAAA;AAAA;AAA3B;AAAX;;;;;;;AAIwB;;AAAA;AACK;;AAAA;AAEH;;AAAA;AACE;;AAAA;AAFC;AAHd;;AAAA;AAAA;AAAA;AAAP;;AAAA;;;;;;;;;;;;;AASR;;;ADzDkC;AAAnB;;AAAA;AAAA;AAAA;;AAAP;ACyEkB;AACC;;ADhJZ;AAAA;AAAA;AAAe;AAAf;ACiJf;;;AACY;;AAAmB;;;AAAnB;AAAA;;AACqC;AAAA;;AAAA;AAAA;AAAnB;AAAyC;;AAAzC;AAAlB;;AAES;;AAAA;AACC;;AAAA;AAFP;AAAP;;AAAA;AD2MR;;;AASQ;;AAAA;;AAAA;AACgB;;AAAA;;;AAAhB;;AAAA;AAAA;;AAYR;;;;;;;AAyCQ;;;AACO;AAAA;AAAA;AAAA;AAAA;AAAP;AAG+B;;AAAA;AAAA;AAtV3B;;;AAAuC;;AAAA;;AAAA;AAAA;;AAAA;AAAvC;;;;AADJ;AAMA;;AAAA;;AAAA;AAqV6B;;AAAA;AA/UF;AAAA;;AAAA;AAAA;AAAvB;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAEA;AAIQ;;AAHO;AAAA;;AAAA;AAAA;AACI;;AACF;;;;;;;AAHjB;;;;;;AAAA;AA6UI;;AAAA;AAAmB;;AAAA;AAAnB;AAAA;AAAA;AADJ;AAGA;;AAAA;;AAAA;AACmB;AAAnB;;AAAA;AAAA;AAGiC;;AAAA;AAAA;AAAA;;AAxU7B;AADG;AAAA;;;AAAA;;AAEH;;;AAFG;AAAA;;;;AAAP;AAOA;;AAAA;;AAAA;AAsU0B;;AAAA;AAlU1B;AAAA;AAIA;;AAAA;AAAA;AAIW;;AAAA;AAAA;AAAJ;AAAA;AAAP;AAIA;;AAAA;AAAA;AACG;AAAA;;AAAA;AAAA;AAAX;;;AACY;;AAAA;;AAAA;;AAAA;;AAAA;AAKA;;AAAA;AAAA;AAAsB;AAAA;;AAAA;AAAA;AAAqB;;AAArB;AAAtB;AADJ;AAyTA;;AAAA;;;AAAA;;AA/RA;;AAAA;;AAAA;;AAAA;;AAAA;AACyC;;AAAA;;;AAAA;AAAA;;AAAA;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGyC;AAAA;;;AAAA;AAAzC;;AAAA;AAAA;AAGqB;;;AAAA;AAArB;;AAAA;AAAA;AAGG;;AAAA;AAAA;AAAA;AAAA;;AAAsB;AAAA;;AAAA;AAAA;AAAqB;;AAArB;AAAtB;AAAX;;;AACiC;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAArB;;AAAA;AAAA;AAIO;;AAAA;AAAA;AAAJ;AAAP;AAuRA;AAAc;AAAd;;;;;;;;;;AAvbR;;;AAEe;;AAAc;AAAA;;AAAA;AAAA;AAAd;AAAP;;AAyHR;;;;;;AAGY;;AAAA;;;AAAA;AAAA;;;AAAA;AACE;;AADF;AADJ;AAIiB;;AAAA;AAAA;AAAqB;AAArB;AAAP;AAAA;;AAAA;;AAAA;AAAlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKqB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AAAA;;AAC0B;AAAL;AAAA;AAAA;;AAAZ;AAAA;AAAA;AAAA;AAAA;AAAT;AAAA;;AACO;AAAP;AACG;AAAA;;AAAA;AAAA;AAA6B;;;AAA7B;AAAf;;;AAEwB;;AAAA;;AAAA;AAAmB;;AAApB;AAAA;AAAP;;;;;;;;;AA8ShB;;;;AAqBQ;;;AAxdO;AAAA;AAAA;AAAA;AAAe;;AAAf;AAydA;AAAP;AACA;;;AAEO;;AAAA;AAAA;AAAP;AAAA;AACyC;AAAtC;;;;AAAX;;;AACY;;AAAA;;;;AAAA;;;;;;;;AAEA;AAAA;;AAAA;AAAA;AACG;;AAAA;;;AAAA;AAAA;;AAAA;;;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAGG;AAAA;;AAAA;AAAA;AAAX;;;AAEgB;AAAA;;AAAA;AAAA;AAEI;;AAAA;AAAA;AADD;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AADH;AAAA;;AAAA;AADJ;AAMA;;AAAA;AAAA;AAKI;AAAA;;AAAA;AAAA;AAD0B;AAI1B;AAAA;;AAAA;AAAA;AAD0B;AAJ3B;AAAP;;AAAA;AASR;;;AAqBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;AAAA;;AAMH;;AANG;AAAA;;;;AAAP;AASS;;;;;;;;AADT;;AAAA;;;;;;;;;;;;;;AA6BQ;AANwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;AAKW;;AAAZ;AAAP;AAAA;AAXmC;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACyD;;AAAA;;;AAAzD;;;;AAJ2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AACuD;;AAAA;;;AAAvD;;;;AAN2B;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEI;;AAAA;;;AADJ;;;;AAPwB;;AAApB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AADJ;AAII;;AAAA;;;AADJ;;;;AALA;;AAAA;;AAAA;;;;;;;;AA8BhB;;;AAkBQ;;;AACA;;;AACO;;AAAA;AAAA;AACH;;AADG;AAAA;;;AAAA;;AAEH;;AAFG;AAAA;;;AAAA;;AAGH;;AAHG;AAAA;;;AAAA;;AAIH;;AAJG;AAAA;;;AAAA;;AAKH;;AALG;AAAA;;;;AAAP;AASS;;;;;;;AAFT;;AAAA;;;;;;;;;;;;AAkBQ;AAHuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;AAGW;;AAAZ;AAAP;AAAA;AAP+B;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;AAJuB;;AAAhB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AACA;;;;;;;;;AAiBhB;;;AAoBQ;;;AA9nBO;AAAA;AAAA;AAAA;AAAe;;AAAf;AA+nBA;AAAP;AACA;;;AACA;;;AAC8B;AAAvB;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAP;AAEgC;;AAEtB;;AAFsB;AAGjB;;AAHiB;AAIf;;AAJe;AAKlB;;AALkB;AAAhC;AAOmB;;AAAZ;AAAP;AA7nBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AA4nBR;;;AAkBQ;;;AACA;;;AA9lB0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAimBe;AAAA;AAAA;AAAA;;;AAAA;AACf;AAAA;;AACA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AACA;;;AAEK;AAAuC;;AAAZ;AADzB;AAAP;AAIR;;;;;;;AA/qBe;AAAA;AAAA;AAAA;AAAe;AAAf;AAuLH;;;AACI;AAAA;;AAAA;AAAA;AACD;;AAAA;AAAA;;AADC;AAAA;;;AAEF;AAAA;;AAAA;AAAA;AADC;;AAAA;AADC;;;;AAFR;AAtJc;;AAFQ;;AAElB;AAAA;AAAA;;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAuC0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAqoBA;;;AACA;;;AACO;;AAAA;AAAP;AAAA;AAEI;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAyC;AAAA;;AAAA;AAAA;AAAzC;AADJ;AAIA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAEI;;AAAA;AAAA;AAAA;;;AAAA;AAAA;AADkC;AAAtC;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAGuD;AAAA;;AAAA;AAAA;AAAZ;AAA3C;;AAAA;AAAA;AAAA;AAAA;;AAAA;AACmB;AAAA;;AAAA;AAAA;AAAmB;AAAA;AAAA;AAAA;AAAnB;AAAZ;AAAP;;AAAA;;;;;;;;;AAER;;;AAcQ;;;AACiB;;;AAAO;AAAxB;;AAAA;AAAA;AACmB;;AAAZ;AAAP;AAzrBR;;;;AAIsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;;;;;;AAwrBR;;;AAkBQ;;;AAvrB0B;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAyrBA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AACmB;;AAAZ;AAAP;AAER;;;;AAxtBsB;;AAFQ;;AAElB;AAAA;AAAA;AAAA;;AAAA;;;AACI;;AAAA;AAAA;AAAA;;;AACD;;AADC;AAAA;AAAA;;AAAA;AAAA;;;AAED;;AAAA;AAAA;AAAA;;;AADA;;AAAA;AADC;;;;AAFR;AAquBiB;;;AAAO;AAAxB;;AAAA;AAAA;;;;;;AAER;;;AAW8C;AAAA;;AAAA;AAAA;AAAZ;AACU;AAAA;;AAAA;AAAA;AAAZ;AACc;AAAA;AAAA;AAAA;AAAyB;AAAA;;AAAA;AAAA;AAAzB;AAAZ;AACC;AAAA;;AAAA;AAAA;AAAZ;AACqB;AAAA;;AAAA;AAAA;AAAX;AAAA;;;AACK;AAAA;;AAAA;AAAA;AAAZ;AAAA;;;AACW;AAAA;;AAAA;AAAA;AAAZ;AACkB;AAAA;AAAA;AAAA;AAAZ;AAEf;AAAA;;AAAA;AAAA;AAD8B;AAI9B;AAAA;;AAAA;AAAA;AAD8B;AAGR;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AACW;AAAA;;AAAA;AAAA;AAAf;;AAAA;AAAA;;AAAA;AACe;AAAA;;AAAA;AAAA;AAAf;;AAAA;AAAA;;AAAA;AAlBP;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAP;AAqBR;;;AAzuBkC;AAAnB;;AAAA;AAAA;AAAA;AAAA;;AAAP;AAwvBO;AAAA;AAAP;AAER;;;AAQsB;;;;AAx0BP;AAAA;AAAA;AAAA;AAAe;AAAf;AAy0Bf;;;AAC0B;;AAAA;AAAA;AAAA;;AAAA;AAClB;;AAAA;AAAA;AAER;;;AASwB;AAAA;;AAAA;AAAA;AAAZ;AACY;AAAA;;AAAA;AAAA;AAAZ;AAFG;AAAA;;;;AAAA;AAAA;AAAP;AAKR;;;AAQiC;AAAA;;AAAA;AAAA;AAAlB;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAP;AAvfR;;;AAQQ;;;", "op_pc_offset": 0, "pc_events": { "1": { @@ -15,7 +15,7 @@ "op": "intcblock 0 1 100 8 448 10000 86400 200" }, "16": { - "op": "bytecblock 0x151f7c75 \"circulating_units\" 0x52333023 \"status\" \"maturity_date\" \"issuance_date\" 0x0000000000000000 \"denomination_asset_id\" \"interest_rate\" \"primary_distribution_opening_date\" 0x00 \"unit_value\" \"day_count_convention\" \"total_units\" \"total_coupons\" \"secondary_market_opening_date\" \"secondary_market_closure_date\" 0x52323023 \"settlement_asset_id\" \"primary_distribution_closure_date\" \"suspended\" \"defaulted\" \"metadata\" 0x74696d654576656e7473 0x52373023 0x52363023 0x52353023 0x52343023 0x636f75706f6e5261746573 0x068101 0x52383023" + "op": "bytecblock 0x151f7c75 \"circulating_units\" 0x52333023 \"status\" \"maturity_date\" \"settlement_asset_id\" \"issuance_date\" 0x0000000000000000 \"interest_rate\" \"primary_distribution_opening_date\" 0x00 \"unit_value\" \"day_count_convention\" \"total_units\" \"total_coupons\" \"secondary_market_opening_date\" \"secondary_market_closure_date\" 0x52323023 \"denomination_asset_id\" \"primary_distribution_closure_date\" \"suspended\" \"defaulted\" \"metadata\" 0x74696d654576656e7473 0x52373023 0x52363023 0x52353023 0x52343023 0x636f75706f6e5261746573 0x068101 0x52383023" }, "420": { "op": "txn ApplicationID", @@ -40,7 +40,7 @@ "op": "app_global_put" }, "430": { - "op": "bytec 7 // \"denomination_asset_id\"" + "op": "bytec 18 // \"denomination_asset_id\"" }, "432": { "op": "intc_0 // 0" @@ -49,7 +49,7 @@ "op": "app_global_put" }, "434": { - "op": "bytec 18 // \"settlement_asset_id\"" + "op": "bytec 5 // \"settlement_asset_id\"" }, "436": { "op": "intc_0 // 0" @@ -139,7 +139,7 @@ "op": "app_global_put" }, "474": { - "op": "bytec 5 // \"issuance_date\"" + "op": "bytec 6 // \"issuance_date\"" }, "476": { "op": "intc_0 // 0" @@ -263,7 +263,7 @@ "stack_out": [] }, "526": { - "op": "pushbytess 0x4fd6a3cc 0x9c76b6a3 0x44363d49 0x67db4f20 0x63f99589 0xd3a4d6ab 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x301dd919 0xed02759f 0xfad2173e 0x08efea35 0xddcec07b // method \"asset_transfer(address,address,uint64)uint64\", method \"pay_principal(address,byte[])(uint64,uint64,byte[])\", method \"get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))\", method \"get_payment_amount(address)(uint64,uint64)\", method \"asset_create(address,byte[])void\", method \"asset_config(uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void\", method \"set_secondary_time_events(uint64[])(uint64,uint64)\", method \"assign_role(address,uint8,byte[])uint64\", method \"revoke_role(address,uint8)uint64\", method \"open_account(address,address)uint64\", method \"close_account(address)(uint64,uint64)\", method \"primary_distribution(address,uint64)uint64\", method \"set_asset_suspension(bool)uint64\", method \"set_account_suspension(address,bool)uint64\", method \"set_default_status(bool)void\", method \"get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)\", method \"get_account_info(address)(address,uint64,uint64,uint64,bool)\", method \"get_time_events()uint64[]\", method \"get_secondary_market_schedule()uint64[]\", method \"get_asset_metadata()byte[]\"" + "op": "pushbytess 0x4fd6a3cc 0x9c76b6a3 0x44363d49 0x67db4f20 0x63f99589 0xd3a4d6ab 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x80bfcdd1 0xed02759f 0xfad2173e 0x08efea35 0xddcec07b // method \"asset_transfer(address,address,uint64)uint64\", method \"pay_principal(address,byte[])(uint64,uint64,byte[])\", method \"get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))\", method \"get_payment_amount(address)(uint64,uint64)\", method \"asset_create(address,byte[])void\", method \"asset_config(uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void\", method \"set_secondary_time_events(uint64[])(uint64,uint64)\", method \"assign_role(address,uint8,byte[])uint64\", method \"revoke_role(address,uint8)uint64\", method \"open_account(address,address)uint64\", method \"close_account(address)(uint64,uint64)\", method \"primary_distribution(address,uint64)uint64\", method \"set_asset_suspension(bool)uint64\", method \"set_account_suspension(address,bool)uint64\", method \"set_default_status(bool)void\", method \"get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)\", method \"get_account_info(address)(address,uint64,uint64,uint64,bool)\", method \"get_time_events()uint64[]\", method \"get_secondary_market_schedule()uint64[]\", method \"get_asset_metadata()byte[]\"" }, "628": { "op": "txna ApplicationArgs 0" @@ -4633,7 +4633,7 @@ "op": "assert // check self.account entry exists" }, "1371": { - "op": "bytec 6 // 0x0000000000000000" + "op": "bytec 7 // 0x0000000000000000" }, "1373": { "op": "replace2 40" @@ -4658,7 +4658,7 @@ "op": "assert // check self.account entry exists" }, "1382": { - "op": "bytec 6 // 0x0000000000000000" + "op": "bytec 7 // 0x0000000000000000" }, "1384": { "op": "replace2 48" @@ -5598,7 +5598,7 @@ ] }, "1506": { - "op": "bytec 5 // \"issuance_date\"", + "op": "bytec 6 // \"issuance_date\"", "defined_out": [ "\"issuance_date\"", "0", @@ -5705,7 +5705,7 @@ ] }, "1518": { - "op": "bytec 5 // \"issuance_date\"", + "op": "bytec 6 // \"issuance_date\"", "stack_out": [ "accrued_period#0", "accrued_period#0", @@ -6459,9 +6459,9 @@ ] }, "1630": { - "op": "bytec 7 // \"denomination_asset_id\"", + "op": "bytec 5 // \"settlement_asset_id\"", "defined_out": [ - "\"denomination_asset_id\"", + "\"settlement_asset_id\"", "0", "tmp%0#5", "tmp%1#1" @@ -6470,7 +6470,7 @@ "tmp%0#5", "tmp%1#1", "0", - "\"denomination_asset_id\"" + "\"settlement_asset_id\"" ] }, "1632": { @@ -6483,8 +6483,8 @@ ] }, "1633": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists", + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", "stack_out": [ "tmp%0#5", "tmp%1#1", @@ -6586,14 +6586,14 @@ "op": "intc_0 // 0" }, "1672": { - "op": "bytec 7 // \"denomination_asset_id\"" + "op": "bytec 5 // \"settlement_asset_id\"" }, "1674": { "op": "app_global_get_ex" }, "1675": { - "error": "check self.denomination_asset_id exists", - "op": "assert // check self.denomination_asset_id exists" + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists" }, "1676": { "op": "asset_holding_get AssetBalance" @@ -6636,7 +6636,7 @@ "op": "intc_0 // 0" }, "1694": { - "op": "bytec 18 // \"settlement_asset_id\"" + "op": "bytec 5 // \"settlement_asset_id\"" }, "1696": { "op": "app_global_get_ex" @@ -6896,7 +6896,7 @@ ] }, "1737": { - "op": "bytec 6 // 0x0000000000000000", + "op": "bytec 7 // 0x0000000000000000", "defined_out": [ "0x0000000000000000", "maybe_value%2#0", @@ -7565,7 +7565,7 @@ ] }, "1845": { - "op": "bytec 6 // 0x0000000000000000", + "op": "bytec 7 // 0x0000000000000000", "defined_out": [ "0x0000000000000000", "tmp%0#2", @@ -8145,7 +8145,7 @@ ] }, "1907": { - "op": "bytec 5 // \"issuance_date\"", + "op": "bytec 6 // \"issuance_date\"", "defined_out": [ "\"issuance_date\"", "0", @@ -9447,7 +9447,7 @@ ] }, "2113": { - "op": "bytec 7 // \"denomination_asset_id\"", + "op": "bytec 18 // \"denomination_asset_id\"", "defined_out": [ "\"denomination_asset_id\"" ], @@ -9528,7 +9528,7 @@ ] }, "2122": { - "op": "bytec 7 // \"denomination_asset_id\"", + "op": "bytec 18 // \"denomination_asset_id\"", "stack_out": [ "array_head_and_tail%0#0", "day_count_convention#1", @@ -9615,7 +9615,7 @@ ] }, "2130": { - "op": "bytec 18 // \"settlement_asset_id\"", + "op": "bytec 5 // \"settlement_asset_id\"", "defined_out": [ "\"settlement_asset_id\"", "denomination_asset_id#1", @@ -9679,7 +9679,7 @@ ] }, "2138": { - "op": "bytec 18 // \"settlement_asset_id\"", + "op": "bytec 5 // \"settlement_asset_id\"", "stack_out": [ "array_head_and_tail%0#0", "day_count_convention#1", @@ -11002,7 +11002,7 @@ ] }, "2302": { - "op": "bytec 5 // \"issuance_date\"", + "op": "bytec 6 // \"issuance_date\"", "defined_out": [ "\"issuance_date\"", "array_head_and_tail%0#0", @@ -12683,7 +12683,7 @@ ] }, "2552": { - "op": "bytec 5 // \"issuance_date\"", + "op": "bytec 6 // \"issuance_date\"", "defined_out": [ "\"issuance_date\"", "0" @@ -14954,7 +14954,7 @@ ] }, "3018": { - "op": "bytec 6 // 0x0000000000000000", + "op": "bytec 7 // 0x0000000000000000", "defined_out": [ "0x0000000000000000", "payment_address#0 (copy)", @@ -14978,7 +14978,7 @@ ] }, "3021": { - "op": "bytec 6 // 0x0000000000000000", + "op": "bytec 7 // 0x0000000000000000", "stack_out": [ "tmp%2#0", "encoded_tuple_buffer%2#0", @@ -14997,7 +14997,7 @@ ] }, "3024": { - "op": "bytec 6 // 0x0000000000000000", + "op": "bytec 7 // 0x0000000000000000", "stack_out": [ "tmp%2#0", "encoded_tuple_buffer%3#0", @@ -17545,7 +17545,7 @@ ] }, "3492": { - "op": "bytec 7 // \"denomination_asset_id\"", + "op": "bytec 18 // \"denomination_asset_id\"", "defined_out": [ "\"denomination_asset_id\"", "0" @@ -17590,19 +17590,19 @@ ] }, "3498": { - "op": "bytec_1 // \"circulating_units\"", + "op": "bytec 5 // \"settlement_asset_id\"", "defined_out": [ - "\"circulating_units\"", + "\"settlement_asset_id\"", "0", "val_as_bytes%0#0" ], "stack_out": [ "val_as_bytes%0#0", "0", - "\"circulating_units\"" + "\"settlement_asset_id\"" ] }, - "3499": { + "3500": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -17615,231 +17615,317 @@ "maybe_exists%1#0" ] }, - "3500": { + "3501": { + "error": "check self.settlement_asset_id exists", + "op": "assert // check self.settlement_asset_id exists", + "stack_out": [ + "val_as_bytes%0#0", + "maybe_value%1#0" + ] + }, + "3502": { + "op": "itob", + "defined_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ] + }, + "3503": { + "op": "intc_0 // 0", + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "0" + ] + }, + "3504": { + "op": "bytec_1 // \"circulating_units\"", + "defined_out": [ + "\"circulating_units\"", + "0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "0", + "\"circulating_units\"" + ] + }, + "3505": { + "op": "app_global_get_ex", + "defined_out": [ + "maybe_exists%2#0", + "maybe_value%2#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" + ], + "stack_out": [ + "val_as_bytes%0#0", + "val_as_bytes%1#0", + "maybe_value%2#0", + "maybe_exists%2#0" + ] + }, + "3506": { "error": "check self.circulating_units exists", "op": "assert // check self.circulating_units exists", "stack_out": [ "val_as_bytes%0#0", - "maybe_value%1#0" + "val_as_bytes%1#0", + "maybe_value%2#0" ] }, - "3501": { + "3507": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", - "maybe_value%1#0", + "val_as_bytes%1#0", + "maybe_value%2#0", "0" ] }, - "3502": { + "3508": { "op": "bytec 11 // \"unit_value\"", "defined_out": [ "\"unit_value\"", "0", - "maybe_value%1#0", - "val_as_bytes%0#0" + "maybe_value%2#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" ], "stack_out": [ "val_as_bytes%0#0", - "maybe_value%1#0", + "val_as_bytes%1#0", + "maybe_value%2#0", "0", "\"unit_value\"" ] }, - "3504": { + "3510": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%2#0", - "maybe_value%1#0", + "maybe_exists%3#0", "maybe_value%2#0", - "val_as_bytes%0#0" + "maybe_value%3#0", + "val_as_bytes%0#0", + "val_as_bytes%1#0" ], "stack_out": [ "val_as_bytes%0#0", - "maybe_value%1#0", + "val_as_bytes%1#0", "maybe_value%2#0", - "maybe_exists%2#0" + "maybe_value%3#0", + "maybe_exists%3#0" ] }, - "3505": { + "3511": { "error": "check self.unit_value exists", "op": "assert // check self.unit_value exists", "stack_out": [ "val_as_bytes%0#0", - "maybe_value%1#0", - "maybe_value%2#0" + "val_as_bytes%1#0", + "maybe_value%2#0", + "maybe_value%3#0" ] }, - "3506": { + "3512": { "op": "*", "defined_out": [ "to_encode%0#0", - "val_as_bytes%0#0" + "val_as_bytes%0#0", + "val_as_bytes%1#0" ], "stack_out": [ "val_as_bytes%0#0", + "val_as_bytes%1#0", "to_encode%0#0" ] }, - "3507": { + "3513": { "op": "itob", "defined_out": [ "val_as_bytes%0#0", - "val_as_bytes%1#0" + "val_as_bytes%1#0", + "val_as_bytes%2#0" ], "stack_out": [ "val_as_bytes%0#0", - "val_as_bytes%1#0" + "val_as_bytes%1#0", + "val_as_bytes%2#0" ] }, - "3508": { + "3514": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", + "val_as_bytes%2#0", "0" ] }, - "3509": { + "3515": { "op": "bytec 11 // \"unit_value\"", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", + "val_as_bytes%2#0", "0", "\"unit_value\"" ] }, - "3511": { + "3517": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%3#0", - "maybe_value%3#0", + "maybe_exists%4#0", + "maybe_value%4#0", "val_as_bytes%0#0", - "val_as_bytes%1#0" + "val_as_bytes%1#0", + "val_as_bytes%2#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", - "maybe_value%3#0", - "maybe_exists%3#0" + "val_as_bytes%2#0", + "maybe_value%4#0", + "maybe_exists%4#0" ] }, - "3512": { + "3518": { "error": "check self.unit_value exists", "op": "assert // check self.unit_value exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", - "maybe_value%3#0" + "val_as_bytes%2#0", + "maybe_value%4#0" ] }, - "3513": { + "3519": { "op": "itob", "defined_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ] }, - "3514": { + "3520": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "0" ] }, - "3515": { + "3521": { "op": "bytec 12 // \"day_count_convention\"", "defined_out": [ "\"day_count_convention\"", "0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "0", "\"day_count_convention\"" ] }, - "3517": { + "3523": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%4#0", - "maybe_value%4#0", + "maybe_exists%5#0", + "maybe_value%5#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "maybe_value%4#0", - "maybe_exists%4#0" + "val_as_bytes%3#0", + "maybe_value%5#0", + "maybe_exists%5#0" ] }, - "3518": { + "3524": { "error": "check self.day_count_convention exists", "op": "assert // check self.day_count_convention exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "maybe_value%4#0" + "val_as_bytes%3#0", + "maybe_value%5#0" ] }, - "3519": { + "3525": { "op": "itob", "defined_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%3#0" + "val_as_bytes%3#0", + "val_as_bytes%4#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%3#0" + "val_as_bytes%3#0", + "val_as_bytes%4#0" ] }, - "3520": { + "3526": { "op": "extract 7 1", "defined_out": [ "tmp%0#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0" ] }, - "3523": { + "3529": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "0" ] }, - "3524": { + "3530": { "op": "bytec 8 // \"interest_rate\"", "defined_out": [ "\"interest_rate\"", @@ -17847,93 +17933,103 @@ "tmp%0#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "0", "\"interest_rate\"" ] }, - "3526": { + "3532": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%5#0", - "maybe_value%5#0", + "maybe_exists%6#0", + "maybe_value%6#0", "tmp%0#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "maybe_value%5#0", - "maybe_exists%5#0" + "maybe_value%6#0", + "maybe_exists%6#0" ] }, - "3527": { + "3533": { "error": "check self.interest_rate exists", "op": "assert // check self.interest_rate exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "maybe_value%5#0" + "maybe_value%6#0" ] }, - "3528": { + "3534": { "op": "itob", "defined_out": [ "tmp%0#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%4#0" + "val_as_bytes%3#0", + "val_as_bytes%5#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", - "val_as_bytes%4#0" + "val_as_bytes%5#0" ] }, - "3529": { + "3535": { "op": "extract 6 2", "defined_out": [ "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0" ] }, - "3532": { + "3538": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", "0" ] }, - "3533": { + "3539": { "op": "bytec 13 // \"total_units\"", "defined_out": [ "\"total_units\"", @@ -17942,52 +18038,57 @@ "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", "0", "\"total_units\"" ] }, - "3535": { + "3541": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%6#0", - "maybe_value%6#0", + "maybe_exists%7#0", + "maybe_value%7#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", - "val_as_bytes%2#0" + "val_as_bytes%2#0", + "val_as_bytes%3#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "maybe_value%6#0", - "maybe_exists%6#0" + "maybe_value%7#0", + "maybe_exists%7#0" ] }, - "3536": { + "3542": { "error": "check self.total_units exists", "op": "assert // check self.total_units exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "maybe_value%6#0" + "maybe_value%7#0" ] }, - "3537": { + "3543": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -17995,79 +18096,86 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0" + "val_as_bytes%3#0", + "val_as_bytes%6#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0" + "val_as_bytes%6#0" ] }, - "3538": { + "3544": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", + "val_as_bytes%6#0", "0" ] }, - "3539": { + "3545": { "op": "bytec_1 // \"circulating_units\"", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", + "val_as_bytes%6#0", "0", "\"circulating_units\"" ] }, - "3540": { + "3546": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%7#0", - "maybe_value%7#0", + "maybe_exists%8#0", + "maybe_value%8#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0" + "val_as_bytes%3#0", + "val_as_bytes%6#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", - "maybe_value%7#0", - "maybe_exists%7#0" + "val_as_bytes%6#0", + "maybe_value%8#0", + "maybe_exists%8#0" ] }, - "3541": { + "3547": { "error": "check self.circulating_units exists", "op": "assert // check self.circulating_units exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", - "maybe_value%7#0" + "val_as_bytes%6#0", + "maybe_value%8#0" ] }, - "3542": { + "3548": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -18075,33 +18183,36 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", - "val_as_bytes%6#0" + "val_as_bytes%3#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", - "val_as_bytes%6#0" + "val_as_bytes%6#0", + "val_as_bytes%7#0" ] }, - "3543": { + "3549": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", + "val_as_bytes%7#0", "0" ] }, - "3544": { + "3550": { "op": "bytec 9 // \"primary_distribution_opening_date\"", "defined_out": [ "\"primary_distribution_opening_date\"", @@ -18111,61 +18222,66 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", - "val_as_bytes%6#0" + "val_as_bytes%3#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", + "val_as_bytes%7#0", "0", "\"primary_distribution_opening_date\"" ] }, - "3546": { + "3552": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%8#0", - "maybe_value%8#0", + "maybe_exists%9#0", + "maybe_value%9#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", - "val_as_bytes%6#0" + "val_as_bytes%3#0", + "val_as_bytes%6#0", + "val_as_bytes%7#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", - "maybe_value%8#0", - "maybe_exists%8#0" + "val_as_bytes%7#0", + "maybe_value%9#0", + "maybe_exists%9#0" ] }, - "3547": { + "3553": { "error": "check self.primary_distribution_opening_date exists", "op": "assert // check self.primary_distribution_opening_date exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", - "maybe_value%8#0" + "val_as_bytes%7#0", + "maybe_value%9#0" ] }, - "3548": { + "3554": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -18173,36 +18289,39 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", - "val_as_bytes%7#0" + "val_as_bytes%7#0", + "val_as_bytes%8#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", - "val_as_bytes%7#0" + "val_as_bytes%7#0", + "val_as_bytes%8#0" ] }, - "3549": { + "3555": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", + "val_as_bytes%8#0", "0" ] }, - "3550": { + "3556": { "op": "bytec 19 // \"primary_distribution_closure_date\"", "defined_out": [ "\"primary_distribution_closure_date\"", @@ -18212,66 +18331,71 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", - "val_as_bytes%7#0" + "val_as_bytes%7#0", + "val_as_bytes%8#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", + "val_as_bytes%8#0", "0", "\"primary_distribution_closure_date\"" ] }, - "3552": { + "3558": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%9#0", - "maybe_value%9#0", + "maybe_exists%10#0", + "maybe_value%10#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", - "val_as_bytes%7#0" + "val_as_bytes%7#0", + "val_as_bytes%8#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", - "maybe_value%9#0", - "maybe_exists%9#0" + "val_as_bytes%8#0", + "maybe_value%10#0", + "maybe_exists%10#0" ] }, - "3553": { + "3559": { "error": "check self.primary_distribution_closure_date exists", "op": "assert // check self.primary_distribution_closure_date exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", - "maybe_value%9#0" + "val_as_bytes%8#0", + "maybe_value%10#0" ] }, - "3554": { + "3560": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -18279,40 +18403,43 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", - "val_as_bytes%8#0" + "val_as_bytes%8#0", + "val_as_bytes%9#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", - "val_as_bytes%8#0" + "val_as_bytes%8#0", + "val_as_bytes%9#0" ] }, - "3555": { + "3561": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", + "val_as_bytes%9#0", "0" ] }, - "3556": { - "op": "bytec 5 // \"issuance_date\"", + "3562": { + "op": "bytec 6 // \"issuance_date\"", "defined_out": [ "\"issuance_date\"", "0", @@ -18321,79 +18448,85 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", - "val_as_bytes%8#0" + "val_as_bytes%8#0", + "val_as_bytes%9#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", + "val_as_bytes%9#0", "0", "\"issuance_date\"" ] }, - "3558": { + "3564": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%10#0", - "maybe_value%10#0", + "maybe_exists%11#0", + "maybe_value%11#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", - "val_as_bytes%8#0" + "val_as_bytes%8#0", + "val_as_bytes%9#0" ], "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", - "maybe_value%10#0", - "maybe_exists%10#0" + "val_as_bytes%9#0", + "maybe_value%11#0", + "maybe_exists%11#0" ] }, - "3559": { + "3565": { "error": "check self.issuance_date exists", "op": "assert // check self.issuance_date exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", - "maybe_value%10#0" + "val_as_bytes%9#0", + "maybe_value%11#0" ] }, - "3560": { + "3566": { "op": "itob", "defined_out": [ "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", + "val_as_bytes%10#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -18403,32 +18536,34 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", - "val_as_bytes%9#0" + "val_as_bytes%9#0", + "val_as_bytes%10#0" ] }, - "3561": { + "3567": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", + "val_as_bytes%10#0", "0" ] }, - "3562": { + "3568": { "op": "bytec 4 // \"maturity_date\"", "defined_out": [ "\"maturity_date\"", @@ -18437,8 +18572,9 @@ "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", + "val_as_bytes%10#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -18448,28 +18584,30 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", + "val_as_bytes%10#0", "0", "\"maturity_date\"" ] }, - "3564": { + "3570": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%11#0", - "maybe_value%11#0", + "maybe_exists%12#0", + "maybe_value%12#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", + "val_as_bytes%10#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -18479,35 +18617,37 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", - "maybe_value%11#0", - "maybe_exists%11#0" + "val_as_bytes%10#0", + "maybe_value%12#0", + "maybe_exists%12#0" ] }, - "3565": { + "3571": { "error": "check self.maturity_date exists", "op": "assert // check self.maturity_date exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", - "maybe_value%11#0" + "val_as_bytes%10#0", + "maybe_value%12#0" ] }, - "3566": { + "3572": { "op": "itob", "defined_out": [ "tmp%0#0", @@ -18515,8 +18655,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -18526,34 +18667,36 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", - "val_as_bytes%10#0" + "val_as_bytes%10#0", + "val_as_bytes%11#0" ] }, - "3567": { + "3573": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "0" ] }, - "3568": { + "3574": { "op": "bytec 20 // \"suspended\"", "defined_out": [ "\"suspended\"", @@ -18563,8 +18706,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -18574,30 +18718,32 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "0", "\"suspended\"" ] }, - "3570": { + "3576": { "op": "app_global_get_ex", "defined_out": [ - "maybe_exists%12#0", - "maybe_value%12#0", + "maybe_exists%13#0", + "maybe_value%13#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -18607,48 +18753,51 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", - "maybe_value%12#0", - "maybe_exists%12#0" + "val_as_bytes%11#0", + "maybe_value%13#0", + "maybe_exists%13#0" ] }, - "3571": { + "3577": { "error": "check self.suspended exists", "op": "assert // check self.suspended exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", - "maybe_value%12#0" + "val_as_bytes%11#0", + "maybe_value%13#0" ] }, - "3572": { + "3578": { "op": "bytec 10 // 0x00", "defined_out": [ "0x00", - "maybe_value%12#0", + "maybe_value%13#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -18658,57 +18807,60 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", - "maybe_value%12#0", + "val_as_bytes%11#0", + "maybe_value%13#0", "0x00" ] }, - "3574": { + "3580": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", - "maybe_value%12#0", + "val_as_bytes%11#0", + "maybe_value%13#0", "0x00", "0" ] }, - "3575": { + "3581": { "op": "uncover 2", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "0x00", "0", - "maybe_value%12#0" + "maybe_value%13#0" ] }, - "3577": { + "3583": { "op": "setbit", "defined_out": [ "encoded_bool%0#0", @@ -18717,8 +18869,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -18728,36 +18881,38 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0" ] }, - "3578": { + "3584": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "0" ] }, - "3579": { + "3585": { "op": "bytec 21 // \"defaulted\"", "defined_out": [ "\"defaulted\"", @@ -18768,8 +18923,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -18779,32 +18935,34 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "0", "\"defaulted\"" ] }, - "3581": { + "3587": { "op": "app_global_get_ex", "defined_out": [ "encoded_bool%0#0", - "maybe_exists%13#0", - "maybe_value%13#0", + "maybe_exists%14#0", + "maybe_value%14#0", "tmp%0#0", "tmp%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -18814,98 +18972,103 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", - "maybe_value%13#0", - "maybe_exists%13#0" + "maybe_value%14#0", + "maybe_exists%14#0" ] }, - "3582": { + "3588": { "error": "check self.defaulted exists", "op": "assert // check self.defaulted exists", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", - "maybe_value%13#0" + "maybe_value%14#0" ] }, - "3583": { + "3589": { "op": "bytec 10 // 0x00", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", - "maybe_value%13#0", + "maybe_value%14#0", "0x00" ] }, - "3585": { + "3591": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", - "maybe_value%13#0", + "maybe_value%14#0", "0x00", "0" ] }, - "3586": { + "3592": { "op": "uncover 2", "stack_out": [ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "0x00", "0", - "maybe_value%13#0" + "maybe_value%14#0" ] }, - "3588": { + "3594": { "op": "setbit", "defined_out": [ "encoded_bool%0#0", @@ -18915,8 +19078,9 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -18926,40 +19090,42 @@ "val_as_bytes%0#0", "val_as_bytes%1#0", "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0" ] }, - "3589": { - "op": "uncover 12" + "3595": { + "op": "uncover 13" }, - "3591": { - "op": "uncover 12", + "3597": { + "op": "uncover 13", "stack_out": [ "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "val_as_bytes%0#0", "val_as_bytes%1#0" ] }, - "3593": { + "3599": { "op": "concat", "defined_out": [ "encoded_bool%0#0", @@ -18968,8 +19134,9 @@ "tmp%0#0", "tmp%1#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%2#0", - "val_as_bytes%5#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -18977,37 +19144,39 @@ ], "stack_out": [ "val_as_bytes%2#0", + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%2#0" ] }, - "3594": { - "op": "uncover 11", + "3600": { + "op": "uncover 12", "stack_out": [ + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%2#0", "val_as_bytes%2#0" ] }, - "3596": { + "3602": { "op": "concat", "defined_out": [ "encoded_bool%0#0", @@ -19016,130 +19185,140 @@ "tmp%0#0", "tmp%1#0", "val_as_bytes%10#0", - "val_as_bytes%5#0", + "val_as_bytes%11#0", + "val_as_bytes%3#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0" ], "stack_out": [ + "val_as_bytes%3#0", "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%3#0" ] }, - "3597": { - "op": "uncover 10", + "3603": { + "op": "uncover 11", "stack_out": [ + "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%3#0", - "tmp%0#0" + "val_as_bytes%3#0" ] }, - "3599": { + "3605": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%4#0", + "tmp%0#0", "tmp%1#0", "val_as_bytes%10#0", - "val_as_bytes%5#0", + "val_as_bytes%11#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0" ], "stack_out": [ + "tmp%0#0", "tmp%1#0", - "val_as_bytes%5#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%4#0" ] }, - "3600": { - "op": "uncover 9", + "3606": { + "op": "uncover 10", "stack_out": [ - "val_as_bytes%5#0", + "tmp%1#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%4#0", - "tmp%1#0" + "tmp%0#0" ] }, - "3602": { + "3608": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%5#0", + "tmp%1#0", "val_as_bytes%10#0", - "val_as_bytes%5#0", + "val_as_bytes%11#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0" ], "stack_out": [ - "val_as_bytes%5#0", + "tmp%1#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%5#0" ] }, - "3603": { - "op": "uncover 8", + "3609": { + "op": "uncover 9", "stack_out": [ "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%5#0", - "val_as_bytes%5#0" + "tmp%1#0" ] }, - "3605": { + "3611": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%6#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%6#0", "val_as_bytes%7#0", "val_as_bytes%8#0", @@ -19151,31 +19330,34 @@ "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%6#0" ] }, - "3606": { - "op": "uncover 7", + "3612": { + "op": "uncover 8", "stack_out": [ "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%6#0", "val_as_bytes%6#0" ] }, - "3608": { + "3614": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%7#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%7#0", "val_as_bytes%8#0", "val_as_bytes%9#0" @@ -19185,30 +19367,33 @@ "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%7#0" ] }, - "3609": { - "op": "uncover 6", + "3615": { + "op": "uncover 7", "stack_out": [ "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%7#0", "val_as_bytes%7#0" ] }, - "3611": { + "3617": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%8#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%8#0", "val_as_bytes%9#0" ], @@ -19216,161 +19401,193 @@ "val_as_bytes%8#0", "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%8#0" ] }, - "3612": { - "op": "uncover 5", + "3618": { + "op": "uncover 6", "stack_out": [ "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%8#0", "val_as_bytes%8#0" ] }, - "3614": { + "3620": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "val_as_bytes%9#0" ], "stack_out": [ "val_as_bytes%9#0", "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%9#0" ] }, - "3615": { - "op": "uncover 4", + "3621": { + "op": "uncover 5", "stack_out": [ "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%9#0", "val_as_bytes%9#0" ] }, - "3617": { + "3623": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%10#0", - "val_as_bytes%10#0" + "val_as_bytes%10#0", + "val_as_bytes%11#0" ], "stack_out": [ "val_as_bytes%10#0", + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%10#0" ] }, - "3618": { - "op": "uncover 3", + "3624": { + "op": "uncover 4", "stack_out": [ + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%10#0", "val_as_bytes%10#0" ] }, - "3620": { + "3626": { "op": "concat", "defined_out": [ "encoded_bool%0#0", "encoded_bool%1#0", - "encoded_tuple_buffer%11#0" + "encoded_tuple_buffer%11#0", + "val_as_bytes%11#0" ], "stack_out": [ + "val_as_bytes%11#0", "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%11#0" ] }, - "3621": { - "op": "uncover 2", + "3627": { + "op": "uncover 3", "stack_out": [ + "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%11#0", - "encoded_bool%0#0" + "val_as_bytes%11#0" ] }, - "3623": { + "3629": { "op": "concat", "defined_out": [ + "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%12#0" ], "stack_out": [ + "encoded_bool%0#0", "encoded_bool%1#0", "encoded_tuple_buffer%12#0" ] }, - "3624": { - "op": "swap", + "3630": { + "op": "uncover 2", "stack_out": [ + "encoded_bool%1#0", "encoded_tuple_buffer%12#0", + "encoded_bool%0#0" + ] + }, + "3632": { + "op": "concat", + "defined_out": [ + "encoded_bool%1#0", + "encoded_tuple_buffer%13#0" + ], + "stack_out": [ + "encoded_bool%1#0", + "encoded_tuple_buffer%13#0" + ] + }, + "3633": { + "op": "swap", + "stack_out": [ + "encoded_tuple_buffer%13#0", "encoded_bool%1#0" ] }, - "3625": { + "3634": { "op": "intc_0 // 0", "stack_out": [ - "encoded_tuple_buffer%12#0", + "encoded_tuple_buffer%13#0", "encoded_bool%1#0", "0" ] }, - "3626": { + "3635": { "op": "getbit", "defined_out": [ - "encoded_tuple_buffer%12#0", + "encoded_tuple_buffer%13#0", "is_true%0#0" ], "stack_out": [ - "encoded_tuple_buffer%12#0", + "encoded_tuple_buffer%13#0", "is_true%0#0" ] }, - "3627": { - "op": "pushint 601 // 601" + "3636": { + "op": "pushint 665 // 665" }, - "3630": { + "3639": { "op": "swap", "defined_out": [ - "601", - "encoded_tuple_buffer%12#0", + "665", + "encoded_tuple_buffer%13#0", "is_true%0#0" ], "stack_out": [ - "encoded_tuple_buffer%12#0", - "601", + "encoded_tuple_buffer%13#0", + "665", "is_true%0#0" ] }, - "3631": { + "3640": { "op": "setbit", "defined_out": [ - "encoded_tuple_buffer%13#0" + "encoded_tuple_buffer%14#0" ], "stack_out": [ - "encoded_tuple_buffer%13#0" + "encoded_tuple_buffer%14#0" ] }, - "3632": { + "3641": { "retsub": true, "op": "retsub" }, - "3633": { + "3642": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_account_info", "params": { "holding_address#0": "bytes" @@ -19379,7 +19596,7 @@ "stack_in": [], "op": "proto 1 1" }, - "3636": { + "3645": { "op": "bytec_2 // 0x52333023", "defined_out": [ "0x52333023" @@ -19388,7 +19605,7 @@ "0x52333023" ] }, - "3637": { + "3646": { "op": "frame_dig -1", "defined_out": [ "0x52333023", @@ -19399,7 +19616,7 @@ "holding_address#0 (copy)" ] }, - "3639": { + "3648": { "op": "concat", "defined_out": [ "tmp%0#1" @@ -19408,7 +19625,7 @@ "tmp%0#1" ] }, - "3640": { + "3649": { "op": "dup", "defined_out": [ "tmp%0#1", @@ -19419,7 +19636,7 @@ "tmp%0#1 (copy)" ] }, - "3641": { + "3650": { "op": "box_len", "defined_out": [ "maybe_exists%0#0", @@ -19432,21 +19649,21 @@ "maybe_exists%0#0" ] }, - "3642": { + "3651": { "op": "bury 1", "stack_out": [ "tmp%0#1", "maybe_exists%0#0" ] }, - "3644": { + "3653": { "error": "Invalid account holding address", "op": "assert // Invalid account holding address", "stack_out": [ "tmp%0#1" ] }, - "3645": { + "3654": { "op": "box_get", "defined_out": [ "maybe_exists%0#0", @@ -19457,31 +19674,31 @@ "maybe_exists%0#0" ] }, - "3646": { + "3655": { "error": "check self.account entry exists", "op": "assert // check self.account entry exists", "stack_out": [ "maybe_value%0#0" ] }, - "3647": { + "3656": { "retsub": true, "op": "retsub" }, - "3648": { + "3657": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_time_events", "params": {}, "block": "get_time_events", "stack_in": [], "op": "proto 0 1" }, - "3651": { + "3660": { "op": "pushbytes 0x0000" }, - "3655": { + "3664": { "op": "intc_0 // 0" }, - "3656": { + "3665": { "op": "bytec_3 // \"status\"", "defined_out": [ "\"status\"", @@ -19494,7 +19711,7 @@ "\"status\"" ] }, - "3657": { + "3666": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -19507,7 +19724,7 @@ "maybe_exists%0#0" ] }, - "3658": { + "3667": { "error": "check self.status exists", "op": "assert // check self.status exists", "stack_out": [ @@ -19515,7 +19732,7 @@ "maybe_value%0#0" ] }, - "3659": { + "3668": { "op": "intc_2 // 100", "defined_out": [ "100", @@ -19528,7 +19745,7 @@ "100" ] }, - "3660": { + "3669": { "op": "==", "defined_out": [ "time_events#0", @@ -19539,29 +19756,29 @@ "tmp%0#1" ] }, - "3661": { + "3670": { "op": "bz get_time_events_after_if_else@2", "stack_out": [ "time_events#0" ] }, - "3664": { + "3673": { "op": "bytec 23 // 0x74696d654576656e7473" }, - "3666": { + "3675": { "op": "box_get" }, - "3667": { + "3676": { "op": "swap" }, - "3668": { + "3677": { "op": "frame_bury 0" }, - "3670": { + "3679": { "error": "check self.time_events exists", "op": "assert // check self.time_events exists" }, - "3671": { + "3680": { "block": "get_time_events_after_if_else@2", "stack_in": [ "time_events#0" @@ -19575,21 +19792,21 @@ "time_events#0" ] }, - "3673": { + "3682": { "op": "swap" }, - "3674": { + "3683": { "retsub": true, "op": "retsub" }, - "3675": { + "3684": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_secondary_market_schedule", "params": {}, "block": "get_secondary_market_schedule", "stack_in": [], "op": "proto 0 1" }, - "3678": { + "3687": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -19598,7 +19815,7 @@ "0" ] }, - "3679": { + "3688": { "op": "bytec 15 // \"secondary_market_opening_date\"", "defined_out": [ "\"secondary_market_opening_date\"", @@ -19609,7 +19826,7 @@ "\"secondary_market_opening_date\"" ] }, - "3681": { + "3690": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -19620,14 +19837,14 @@ "maybe_exists%0#0" ] }, - "3682": { + "3691": { "error": "check self.secondary_market_opening_date exists", "op": "assert // check self.secondary_market_opening_date exists", "stack_out": [ "maybe_value%0#0" ] }, - "3683": { + "3692": { "op": "itob", "defined_out": [ "val_as_bytes%0#0" @@ -19636,14 +19853,14 @@ "val_as_bytes%0#0" ] }, - "3684": { + "3693": { "op": "intc_0 // 0", "stack_out": [ "val_as_bytes%0#0", "0" ] }, - "3685": { + "3694": { "op": "bytec 16 // \"secondary_market_closure_date\"", "defined_out": [ "\"secondary_market_closure_date\"", @@ -19656,7 +19873,7 @@ "\"secondary_market_closure_date\"" ] }, - "3687": { + "3696": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%1#0", @@ -19669,7 +19886,7 @@ "maybe_exists%1#0" ] }, - "3688": { + "3697": { "error": "check self.secondary_market_closure_date exists", "op": "assert // check self.secondary_market_closure_date exists", "stack_out": [ @@ -19677,7 +19894,7 @@ "maybe_value%1#0" ] }, - "3689": { + "3698": { "op": "itob", "defined_out": [ "val_as_bytes%0#0", @@ -19688,7 +19905,7 @@ "val_as_bytes%1#0" ] }, - "3690": { + "3699": { "op": "concat", "defined_out": [ "result%1#0" @@ -19697,7 +19914,7 @@ "result%1#0" ] }, - "3691": { + "3700": { "op": "pushbytes 0x0002", "defined_out": [ "0x0002", @@ -19708,14 +19925,14 @@ "0x0002" ] }, - "3695": { + "3704": { "op": "swap", "stack_out": [ "0x0002", "result%1#0" ] }, - "3696": { + "3705": { "op": "concat", "defined_out": [ "array_data%0#0" @@ -19724,18 +19941,18 @@ "array_data%0#0" ] }, - "3697": { + "3706": { "retsub": true, "op": "retsub" }, - "3698": { + "3707": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_metadata", "params": {}, "block": "get_asset_metadata", "stack_in": [], "op": "proto 0 1" }, - "3701": { + "3710": { "op": "intc_0 // 0", "defined_out": [ "0" @@ -19744,7 +19961,7 @@ "0" ] }, - "3702": { + "3711": { "op": "bytec 22 // \"metadata\"", "defined_out": [ "\"metadata\"", @@ -19755,7 +19972,7 @@ "\"metadata\"" ] }, - "3704": { + "3713": { "op": "app_global_get_ex", "defined_out": [ "maybe_exists%0#0", @@ -19766,14 +19983,14 @@ "maybe_exists%0#0" ] }, - "3705": { + "3714": { "error": "check self.metadata exists", "op": "assert // check self.metadata exists", "stack_out": [ "maybe_value%0#0" ] }, - "3706": { + "3715": { "op": "dup", "defined_out": [ "maybe_value%0#0", @@ -19784,7 +20001,7 @@ "maybe_value%0#0 (copy)" ] }, - "3707": { + "3716": { "op": "len", "defined_out": [ "length%0#0", @@ -19795,7 +20012,7 @@ "length%0#0" ] }, - "3708": { + "3717": { "op": "itob", "defined_out": [ "as_bytes%0#0", @@ -19806,7 +20023,7 @@ "as_bytes%0#0" ] }, - "3709": { + "3718": { "op": "extract 6 2", "defined_out": [ "length_uint16%0#0", @@ -19817,14 +20034,14 @@ "length_uint16%0#0" ] }, - "3712": { + "3721": { "op": "swap", "stack_out": [ "length_uint16%0#0", "maybe_value%0#0" ] }, - "3713": { + "3722": { "op": "concat", "defined_out": [ "encoded_value%0#0" @@ -19833,22 +20050,22 @@ "encoded_value%0#0" ] }, - "3714": { + "3723": { "retsub": true, "op": "retsub" }, - "3715": { + "3724": { "subroutine": "smart_contracts.base_d_asa.contract.BaseDAsa.asset_update", "params": {}, "block": "asset_update", "stack_in": [], "op": "proto 0 0" }, - "3718": { + "3727": { "callsub": "smart_contracts.base_d_asa.contract.BaseDAsa.assert_caller_is_arranger", "op": "callsub assert_caller_is_arranger" }, - "3721": { + "3730": { "retsub": true, "op": "retsub" } diff --git a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.teal b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.teal index d395cb8..473299c 100644 --- a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.teal +++ b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.approval.teal @@ -4,7 +4,7 @@ // smart_contracts.zero_coupon_bond.contract.ZeroCouponBond.__algopy_entrypoint_with_init() -> uint64: main: intcblock 0 1 100 8 448 10000 86400 200 - bytecblock 0x151f7c75 "circulating_units" 0x52333023 "status" "maturity_date" "issuance_date" 0x0000000000000000 "denomination_asset_id" "interest_rate" "primary_distribution_opening_date" 0x00 "unit_value" "day_count_convention" "total_units" "total_coupons" "secondary_market_opening_date" "secondary_market_closure_date" 0x52323023 "settlement_asset_id" "primary_distribution_closure_date" "suspended" "defaulted" "metadata" 0x74696d654576656e7473 0x52373023 0x52363023 0x52353023 0x52343023 0x636f75706f6e5261746573 0x068101 0x52383023 + bytecblock 0x151f7c75 "circulating_units" 0x52333023 "status" "maturity_date" "settlement_asset_id" "issuance_date" 0x0000000000000000 "interest_rate" "primary_distribution_opening_date" 0x00 "unit_value" "day_count_convention" "total_units" "total_coupons" "secondary_market_opening_date" "secondary_market_closure_date" 0x52323023 "denomination_asset_id" "primary_distribution_closure_date" "suspended" "defaulted" "metadata" 0x74696d654576656e7473 0x52373023 0x52363023 0x52353023 0x52343023 0x636f75706f6e5261746573 0x068101 0x52383023 txn ApplicationID bnz main_after_if_else@2 // smart_contracts/base_d_asa/contract.py:41-42 @@ -16,12 +16,12 @@ main: // smart_contracts/base_d_asa/contract.py:59-60 // # Asset Configuration // self.denomination_asset_id = UInt64() - bytec 7 // "denomination_asset_id" + bytec 18 // "denomination_asset_id" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:61 // self.settlement_asset_id = UInt64() - bytec 18 // "settlement_asset_id" + bytec 5 // "settlement_asset_id" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:62 @@ -74,7 +74,7 @@ main: app_global_put // smart_contracts/base_d_asa/contract.py:84 // self.issuance_date = UInt64() - bytec 5 // "issuance_date" + bytec 6 // "issuance_date" intc_0 // 0 app_global_put // smart_contracts/base_d_asa/contract.py:85 @@ -145,7 +145,7 @@ main_after_if_else@2: // ): txn NumAppArgs bz main_bare_routing@25 - pushbytess 0x4fd6a3cc 0x9c76b6a3 0x44363d49 0x67db4f20 0x63f99589 0xd3a4d6ab 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x301dd919 0xed02759f 0xfad2173e 0x08efea35 0xddcec07b // method "asset_transfer(address,address,uint64)uint64", method "pay_principal(address,byte[])(uint64,uint64,byte[])", method "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", method "get_payment_amount(address)(uint64,uint64)", method "asset_create(address,byte[])void", method "asset_config(uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", method "set_secondary_time_events(uint64[])(uint64,uint64)", method "assign_role(address,uint8,byte[])uint64", method "revoke_role(address,uint8)uint64", method "open_account(address,address)uint64", method "close_account(address)(uint64,uint64)", method "primary_distribution(address,uint64)uint64", method "set_asset_suspension(bool)uint64", method "set_account_suspension(address,bool)uint64", method "set_default_status(bool)void", method "get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", method "get_account_info(address)(address,uint64,uint64,uint64,bool)", method "get_time_events()uint64[]", method "get_secondary_market_schedule()uint64[]", method "get_asset_metadata()byte[]" + pushbytess 0x4fd6a3cc 0x9c76b6a3 0x44363d49 0x67db4f20 0x63f99589 0xd3a4d6ab 0x1d6fc255 0xfef74567 0xb8fc1390 0x3d43d1f0 0xebd96b2f 0x6c85e3ee 0xf63ace8d 0xbbcca18a 0x1a7babb4 0x80bfcdd1 0xed02759f 0xfad2173e 0x08efea35 0xddcec07b // method "asset_transfer(address,address,uint64)uint64", method "pay_principal(address,byte[])(uint64,uint64,byte[])", method "get_account_units_current_value(address,uint64)(uint64,uint64,(uint64,uint64))", method "get_payment_amount(address)(uint64,uint64)", method "asset_create(address,byte[])void", method "asset_config(uint64,uint64,uint64,uint64,uint8,uint16,uint16[],uint64[],(uint64,uint64)[])void", method "set_secondary_time_events(uint64[])(uint64,uint64)", method "assign_role(address,uint8,byte[])uint64", method "revoke_role(address,uint8)uint64", method "open_account(address,address)uint64", method "close_account(address)(uint64,uint64)", method "primary_distribution(address,uint64)uint64", method "set_asset_suspension(bool)uint64", method "set_account_suspension(address,bool)uint64", method "set_default_status(bool)void", method "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", method "get_account_info(address)(address,uint64,uint64,uint64,bool)", method "get_time_events()uint64[]", method "get_secondary_market_schedule()uint64[]", method "get_asset_metadata()byte[]" txna ApplicationArgs 0 match main_asset_transfer_route@5 main_pay_principal_route@6 main_get_account_units_current_value_route@7 main_get_payment_amount_route@8 main_asset_create_route@9 main_asset_config_route@10 main_set_secondary_time_events_route@11 main_assign_role_route@12 main_revoke_role_route@13 main_open_account_route@14 main_close_account_route@15 main_primary_distribution_route@16 main_set_asset_suspension_route@17 main_set_account_suspension_route@18 main_set_default_status_route@19 main_get_asset_info_route@20 main_get_account_info_route@21 main_get_time_events_route@22 main_get_secondary_market_schedule_route@23 main_get_asset_metadata_route@24 @@ -164,7 +164,7 @@ main_after_if_else@27: return main_get_asset_metadata_route@24: - // smart_contracts/base_d_asa/contract.py:954 + // smart_contracts/base_d_asa/contract.py:959 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -180,7 +180,7 @@ main_get_asset_metadata_route@24: return main_get_secondary_market_schedule_route@23: - // smart_contracts/base_d_asa/contract.py:947 + // smart_contracts/base_d_asa/contract.py:946 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -196,7 +196,7 @@ main_get_secondary_market_schedule_route@23: return main_get_time_events_route@22: - // smart_contracts/base_d_asa/contract.py:934 + // smart_contracts/base_d_asa/contract.py:933 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -212,7 +212,7 @@ main_get_time_events_route@22: return main_get_account_info_route@21: - // smart_contracts/base_d_asa/contract.py:917 + // smart_contracts/base_d_asa/contract.py:916 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -230,7 +230,7 @@ main_get_account_info_route@21: // ), // ): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:917 + // smart_contracts/base_d_asa/contract.py:916 // @arc4.abimethod(readonly=True) callsub get_account_info bytec_0 // 0x151f7c75 @@ -241,7 +241,7 @@ main_get_account_info_route@21: return main_get_asset_info_route@20: - // smart_contracts/base_d_asa/contract.py:887 + // smart_contracts/base_d_asa/contract.py:885 // @arc4.abimethod(readonly=True) txn OnCompletion ! @@ -257,7 +257,7 @@ main_get_asset_info_route@20: return main_set_default_status_route@19: - // smart_contracts/base_d_asa/contract.py:873 + // smart_contracts/base_d_asa/contract.py:871 // @arc4.abimethod txn OnCompletion ! @@ -275,14 +275,14 @@ main_set_default_status_route@19: // ), // ): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:873 + // smart_contracts/base_d_asa/contract.py:871 // @arc4.abimethod callsub set_default_status intc_1 // 1 return main_set_account_suspension_route@18: - // smart_contracts/base_d_asa/contract.py:850 + // smart_contracts/base_d_asa/contract.py:848 // @arc4.abimethod txn OnCompletion ! @@ -301,7 +301,7 @@ main_set_account_suspension_route@18: // ): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:850 + // smart_contracts/base_d_asa/contract.py:848 // @arc4.abimethod callsub set_account_suspension bytec_0 // 0x151f7c75 @@ -312,7 +312,7 @@ main_set_account_suspension_route@18: return main_set_asset_suspension_route@17: - // smart_contracts/base_d_asa/contract.py:832 + // smart_contracts/base_d_asa/contract.py:830 // @arc4.abimethod txn OnCompletion ! @@ -330,7 +330,7 @@ main_set_asset_suspension_route@17: // ), // ): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:832 + // smart_contracts/base_d_asa/contract.py:830 // @arc4.abimethod callsub set_asset_suspension bytec_0 // 0x151f7c75 @@ -341,7 +341,7 @@ main_set_asset_suspension_route@17: return main_primary_distribution_route@16: - // smart_contracts/base_d_asa/contract.py:790 + // smart_contracts/base_d_asa/contract.py:788 // @arc4.abimethod txn OnCompletion ! @@ -360,7 +360,7 @@ main_primary_distribution_route@16: // ): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:790 + // smart_contracts/base_d_asa/contract.py:788 // @arc4.abimethod callsub primary_distribution bytec_0 // 0x151f7c75 @@ -371,7 +371,7 @@ main_primary_distribution_route@16: return main_close_account_route@15: - // smart_contracts/base_d_asa/contract.py:760 + // smart_contracts/base_d_asa/contract.py:758 // @arc4.abimethod txn OnCompletion ! @@ -389,7 +389,7 @@ main_close_account_route@15: // ), // ): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:760 + // smart_contracts/base_d_asa/contract.py:758 // @arc4.abimethod callsub close_account bytec_0 // 0x151f7c75 @@ -400,7 +400,7 @@ main_close_account_route@15: return main_open_account_route@14: - // smart_contracts/base_d_asa/contract.py:725 + // smart_contracts/base_d_asa/contract.py:723 // @arc4.abimethod txn OnCompletion ! @@ -419,7 +419,7 @@ main_open_account_route@14: // ): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:725 + // smart_contracts/base_d_asa/contract.py:723 // @arc4.abimethod callsub open_account bytec_0 // 0x151f7c75 @@ -430,7 +430,7 @@ main_open_account_route@14: return main_revoke_role_route@13: - // smart_contracts/base_d_asa/contract.py:677 + // smart_contracts/base_d_asa/contract.py:675 // @arc4.abimethod txn OnCompletion ! @@ -449,7 +449,7 @@ main_revoke_role_route@13: // ): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:677 + // smart_contracts/base_d_asa/contract.py:675 // @arc4.abimethod callsub revoke_role bytec_0 // 0x151f7c75 @@ -460,7 +460,7 @@ main_revoke_role_route@13: return main_assign_role_route@12: - // smart_contracts/base_d_asa/contract.py:614 + // smart_contracts/base_d_asa/contract.py:612 // @arc4.abimethod txn OnCompletion ! @@ -480,7 +480,7 @@ main_assign_role_route@12: txna ApplicationArgs 1 txna ApplicationArgs 2 txna ApplicationArgs 3 - // smart_contracts/base_d_asa/contract.py:614 + // smart_contracts/base_d_asa/contract.py:612 // @arc4.abimethod callsub assign_role bytec_0 // 0x151f7c75 @@ -491,7 +491,7 @@ main_assign_role_route@12: return main_set_secondary_time_events_route@11: - // smart_contracts/base_d_asa/contract.py:558 + // smart_contracts/base_d_asa/contract.py:556 // @arc4.abimethod txn OnCompletion ! @@ -509,7 +509,7 @@ main_set_secondary_time_events_route@11: // ), // ): txna ApplicationArgs 1 - // smart_contracts/base_d_asa/contract.py:558 + // smart_contracts/base_d_asa/contract.py:556 // @arc4.abimethod callsub set_secondary_time_events bytec_0 // 0x151f7c75 @@ -520,7 +520,7 @@ main_set_secondary_time_events_route@11: return main_asset_config_route@10: - // smart_contracts/base_d_asa/contract.py:476 + // smart_contracts/base_d_asa/contract.py:474 // @arc4.abimethod txn OnCompletion ! @@ -546,14 +546,14 @@ main_asset_config_route@10: txna ApplicationArgs 7 txna ApplicationArgs 8 txna ApplicationArgs 9 - // smart_contracts/base_d_asa/contract.py:476 + // smart_contracts/base_d_asa/contract.py:474 // @arc4.abimethod callsub asset_config intc_1 // 1 return main_asset_create_route@9: - // smart_contracts/base_d_asa/contract.py:454 + // smart_contracts/base_d_asa/contract.py:452 // @arc4.abimethod(create="require") txn OnCompletion ! @@ -573,7 +573,7 @@ main_asset_create_route@9: // ): txna ApplicationArgs 1 txna ApplicationArgs 2 - // smart_contracts/base_d_asa/contract.py:454 + // smart_contracts/base_d_asa/contract.py:452 // @arc4.abimethod(create="require") callsub asset_create intc_1 // 1 @@ -716,11 +716,11 @@ main_bare_routing@25: b main_after_if_else@27 main_asset_update@26: - // smart_contracts/base_d_asa/contract.py:466 + // smart_contracts/base_d_asa/contract.py:464 // @arc4.baremethod(allow_actions=["UpdateApplication"]) txn ApplicationID assert // can only call when not creating - // smart_contracts/base_d_asa/contract.py:466-467 + // smart_contracts/base_d_asa/contract.py:464-465 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def asset_update(self) -> None: callsub asset_update @@ -808,7 +808,7 @@ asset_transfer_bool_merge@6: // < self.secondary_market_closure_date // ), err.SECONDARY_MARKET_CLOSED assert // Secondary market is closed - // smart_contracts/base_d_asa/contract.py:369-371 + // smart_contracts/base_d_asa/contract.py:367-369 // # The reference implementation grants transfer right to D-ASA owners. Other implementations may relay on other // # roles, external Apps through C2C calls (e.g., an order book), or off-chain transfer agents. // assert Txn.sender == sender_holding_address.native, err.UNAUTHORIZED @@ -816,10 +816,10 @@ asset_transfer_bool_merge@6: frame_dig -3 == assert // Not authorized - // smart_contracts/base_d_asa/contract.py:372 + // smart_contracts/base_d_asa/contract.py:370 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:373 + // smart_contracts/base_d_asa/contract.py:371 // self.assert_is_not_suspended() callsub assert_is_not_suspended // smart_contracts/base_d_asa/contract.py:171 @@ -842,7 +842,7 @@ asset_transfer_bool_merge@6: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:376 + // smart_contracts/base_d_asa/contract.py:374 // assert not self.account[sender_holding_address].suspended.native, err.SUSPENDED dig 1 box_get @@ -857,7 +857,7 @@ asset_transfer_bool_merge@6: getbit ! assert // Suspended operations - // smart_contracts/base_d_asa/contract.py:377-379 + // smart_contracts/base_d_asa/contract.py:375-377 // assert not self.account[ // receiver_holding_address // ].suspended.native, err.SUSPENDED @@ -874,7 +874,7 @@ asset_transfer_bool_merge@6: getbit ! assert // Suspended operations - // smart_contracts/base_d_asa/contract.py:381 + // smart_contracts/base_d_asa/contract.py:379 // units <= self.account[sender_holding_address].units.native dig 1 box_get @@ -883,19 +883,19 @@ asset_transfer_bool_merge@6: btoi frame_dig 5 >= - // smart_contracts/base_d_asa/contract.py:380-382 + // smart_contracts/base_d_asa/contract.py:378-380 // assert ( // units <= self.account[sender_holding_address].units.native // ), err.OVER_TRANSFER assert // Insufficient sender units to transfer - // smart_contracts/base_d_asa/contract.py:390 + // smart_contracts/base_d_asa/contract.py:388 // sender_unit_value = self.account[sender_holding_address].unit_value swap box_get assert // check self.account entry exists extract 40 8 // on error: Index access is out of bounds frame_bury 0 - // smart_contracts/base_d_asa/contract.py:391 + // smart_contracts/base_d_asa/contract.py:389 // if self.account[receiver_holding_address].units.native > 0: box_get assert // check self.account entry exists @@ -962,7 +962,7 @@ asset_transfer_after_if_else@17: cover 3 callsub accrued_interest_amount frame_bury 3 - // smart_contracts/base_d_asa/contract.py:427 + // smart_contracts/base_d_asa/contract.py:425 // self.account[sender_holding_address].units.native - units dup box_get @@ -971,17 +971,17 @@ asset_transfer_after_if_else@17: btoi dig 2 - - // smart_contracts/base_d_asa/contract.py:426-428 + // smart_contracts/base_d_asa/contract.py:424-426 // self.account[sender_holding_address].units = arc4.UInt64( // self.account[sender_holding_address].units.native - units // ) itob - // smart_contracts/base_d_asa/contract.py:426 + // smart_contracts/base_d_asa/contract.py:424 // self.account[sender_holding_address].units = arc4.UInt64( dig 1 box_get assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:426-428 + // smart_contracts/base_d_asa/contract.py:424-426 // self.account[sender_holding_address].units = arc4.UInt64( // self.account[sender_holding_address].units.native - units // ) @@ -990,7 +990,7 @@ asset_transfer_after_if_else@17: dig 1 swap box_put - // smart_contracts/base_d_asa/contract.py:430 + // smart_contracts/base_d_asa/contract.py:428 // self.account[receiver_holding_address].units.native + units frame_dig 2 dup @@ -1000,47 +1000,47 @@ asset_transfer_after_if_else@17: btoi uncover 3 + - // smart_contracts/base_d_asa/contract.py:429-431 + // smart_contracts/base_d_asa/contract.py:427-429 // self.account[receiver_holding_address].units = arc4.UInt64( // self.account[receiver_holding_address].units.native + units // ) itob - // smart_contracts/base_d_asa/contract.py:429 + // smart_contracts/base_d_asa/contract.py:427 // self.account[receiver_holding_address].units = arc4.UInt64( dig 1 box_get assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:429-431 + // smart_contracts/base_d_asa/contract.py:427-429 // self.account[receiver_holding_address].units = arc4.UInt64( // self.account[receiver_holding_address].units.native + units // ) swap replace2 32 box_put - // smart_contracts/base_d_asa/contract.py:353 + // smart_contracts/base_d_asa/contract.py:351 // if self.account[holding_address].units.native == 0: box_get assert // check self.account entry exists extract 32 8 // on error: Index access is out of bounds btoi bnz asset_transfer_after_if_else@21 - // smart_contracts/base_d_asa/contract.py:354 + // smart_contracts/base_d_asa/contract.py:352 // self.account[holding_address].unit_value = arc4.UInt64() frame_dig 1 dup box_get assert // check self.account entry exists - bytec 6 // 0x0000000000000000 + bytec 7 // 0x0000000000000000 replace2 40 dig 1 swap box_put - // smart_contracts/base_d_asa/contract.py:355 + // smart_contracts/base_d_asa/contract.py:353 // self.account[holding_address].paid_coupons = arc4.UInt64() dup box_get assert // check self.account entry exists - bytec 6 // 0x0000000000000000 + bytec 7 // 0x0000000000000000 replace2 48 box_put @@ -1062,7 +1062,7 @@ asset_transfer_bool_false@14: b asset_transfer_bool_merge@15 asset_transfer_else_body@16: - // smart_contracts/base_d_asa/contract.py:396 + // smart_contracts/base_d_asa/contract.py:394 // self.account[receiver_holding_address].unit_value = sender_unit_value frame_dig 2 dup @@ -1073,19 +1073,19 @@ asset_transfer_else_body@16: dig 1 swap box_put - // smart_contracts/base_d_asa/contract.py:397-399 + // smart_contracts/base_d_asa/contract.py:395-397 // self.account[receiver_holding_address].paid_coupons = self.account[ // sender_holding_address // ].paid_coupons frame_dig 1 box_get assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:397 + // smart_contracts/base_d_asa/contract.py:395 // self.account[receiver_holding_address].paid_coupons = self.account[ dig 1 box_get assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:397-399 + // smart_contracts/base_d_asa/contract.py:395-397 // self.account[receiver_holding_address].paid_coupons = self.account[ // sender_holding_address // ].paid_coupons @@ -1212,7 +1212,7 @@ day_count_factor: // accrued_period = Global.latest_timestamp - self.issuance_date global LatestTimestamp intc_0 // 0 - bytec 5 // "issuance_date" + bytec 6 // "issuance_date" app_global_get_ex assert // check self.issuance_date exists - @@ -1224,7 +1224,7 @@ day_count_factor: app_global_get_ex assert // check self.maturity_date exists intc_0 // 0 - bytec 5 // "issuance_date" + bytec 6 // "issuance_date" app_global_get_ex assert // check self.issuance_date exists - @@ -1241,7 +1241,7 @@ day_count_factor: swap cover 2 bz day_count_factor_after_if_else@2 - // smart_contracts/base_d_asa/contract.py:349 + // smart_contracts/base_d_asa/contract.py:347 // return time_period // UInt64(cst.DAY_2_SEC) frame_dig 0 intc 6 // 86400 @@ -1274,13 +1274,13 @@ day_count_factor_after_if_else@2: // smart_contracts.base_d_asa.contract.BaseDAsa.account_units_value(holding_address: bytes, units: uint64) -> uint64: account_units_value: - // smart_contracts/base_d_asa/contract.py:335-338 + // smart_contracts/base_d_asa/contract.py:333-336 // @subroutine // def account_units_value( // self, holding_address: arc4.Address, units: UInt64 // ) -> UInt64: proto 2 1 - // smart_contracts/base_d_asa/contract.py:339 + // smart_contracts/base_d_asa/contract.py:337 // return units * self.account[holding_address].unit_value.native bytec_2 // 0x52333023 frame_dig -2 @@ -1310,14 +1310,14 @@ pay_principal: assert // check self.status exists intc_2 // 100 == - // smart_contracts/base_d_asa/contract.py:436-437 + // smart_contracts/base_d_asa/contract.py:434-435 // # The reference implementation does not restrict caller authorization // assert self.status_is_active(), err.UNAUTHORIZED assert // Not authorized - // smart_contracts/base_d_asa/contract.py:438 + // smart_contracts/base_d_asa/contract.py:436 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:439 + // smart_contracts/base_d_asa/contract.py:437 // self.assert_is_not_suspended() callsub assert_is_not_suspended // smart_contracts/base_d_asa/contract.py:171 @@ -1329,17 +1329,17 @@ pay_principal: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:441 + // smart_contracts/base_d_asa/contract.py:439 // units = self.account[holding_address].units.native dup box_get assert // check self.account entry exists extract 32 8 // on error: Index access is out of bounds btoi - // smart_contracts/base_d_asa/contract.py:442 + // smart_contracts/base_d_asa/contract.py:440 // assert units > 0, err.NO_UNITS assert // No D-ASA units - // smart_contracts/base_d_asa/contract.py:443 + // smart_contracts/base_d_asa/contract.py:441 // assert Global.latest_timestamp >= self.maturity_date, err.NOT_MATURE global LatestTimestamp intc_0 // 0 @@ -1354,20 +1354,20 @@ pay_principal: assert // check self.account entry exists extract 0 32 // on error: Index access is out of bounds // smart_contracts/base_d_asa/contract.py:312 - // Asset(self.denomination_asset_id) + // Asset(self.settlement_asset_id) intc_0 // 0 - bytec 7 // "denomination_asset_id" + bytec 5 // "settlement_asset_id" app_global_get_ex - assert // check self.denomination_asset_id exists + assert // check self.settlement_asset_id exists // smart_contracts/base_d_asa/contract.py:311-313 // self.account[holding_address].payment_address.native.is_opted_in( - // Asset(self.denomination_asset_id) + // Asset(self.settlement_asset_id) // ) asset_holding_get AssetBalance bury 1 // smart_contracts/base_d_asa/contract.py:311-314 // self.account[holding_address].payment_address.native.is_opted_in( - // Asset(self.denomination_asset_id) + // Asset(self.settlement_asset_id) // ) // and not self.account[holding_address].suspended.native bz pay_principal_bool_false@16 @@ -1396,33 +1396,23 @@ pay_principal_bool_merge@17: frame_dig -2 callsub account_total_units_value dup - // smart_contracts/base_d_asa/contract.py:321 - // Global.current_application_address - global CurrentApplicationAddress // smart_contracts/base_d_asa/contract.py:320 - // Asset(self.denomination_asset_id).balance( + // Asset(self.settlement_asset_id).balance(Global.current_application_address) + global CurrentApplicationAddress intc_0 // 0 - bytec 7 // "denomination_asset_id" + bytec 5 // "settlement_asset_id" app_global_get_ex - assert // check self.denomination_asset_id exists - // smart_contracts/base_d_asa/contract.py:320-322 - // Asset(self.denomination_asset_id).balance( - // Global.current_application_address - // ) + assert // check self.settlement_asset_id exists asset_holding_get AssetBalance assert // account opted into asset - // smart_contracts/base_d_asa/contract.py:320-323 - // Asset(self.denomination_asset_id).balance( - // Global.current_application_address - // ) + // smart_contracts/base_d_asa/contract.py:320-321 + // Asset(self.settlement_asset_id).balance(Global.current_application_address) // >= payment_amount dig 1 >= - // smart_contracts/base_d_asa/contract.py:319-324 + // smart_contracts/base_d_asa/contract.py:319-322 // assert ( - // Asset(self.denomination_asset_id).balance( - // Global.current_application_address - // ) + // Asset(self.settlement_asset_id).balance(Global.current_application_address) // >= payment_amount // ), err.NOT_ENOUGH_FUNDS assert // Not enough funds for the payment @@ -1433,7 +1423,7 @@ pay_principal_bool_merge@17: box_get assert // check self.account entry exists extract 0 32 // on error: Index access is out of bounds - // smart_contracts/base_d_asa/contract.py:328-333 + // smart_contracts/base_d_asa/contract.py:326-331 // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, // asset_receiver=receiver.native, @@ -1441,13 +1431,13 @@ pay_principal_bool_merge@17: // fee=Global.min_txn_fee, // ).submit() itxn_begin - // smart_contracts/base_d_asa/contract.py:332 + // smart_contracts/base_d_asa/contract.py:330 // fee=Global.min_txn_fee, global MinTxnFee - // smart_contracts/base_d_asa/contract.py:329 + // smart_contracts/base_d_asa/contract.py:327 // xfer_asset=self.settlement_asset_id, intc_0 // 0 - bytec 18 // "settlement_asset_id" + bytec 5 // "settlement_asset_id" app_global_get_ex assert // check self.settlement_asset_id exists uncover 3 @@ -1455,12 +1445,12 @@ pay_principal_bool_merge@17: uncover 2 itxn_field AssetReceiver itxn_field XferAsset - // smart_contracts/base_d_asa/contract.py:328 + // smart_contracts/base_d_asa/contract.py:326 // itxn.AssetTransfer( pushint 4 // axfer itxn_field TypeEnum itxn_field Fee - // smart_contracts/base_d_asa/contract.py:328-333 + // smart_contracts/base_d_asa/contract.py:326-331 // itxn.AssetTransfer( // xfer_asset=self.settlement_asset_id, // asset_receiver=receiver.native, @@ -1470,7 +1460,7 @@ pay_principal_bool_merge@17: itxn_submit pay_principal_after_if_else@3: - // smart_contracts/base_d_asa/contract.py:450 + // smart_contracts/base_d_asa/contract.py:448 // self.circulating_units -= self.account[holding_address].units.native intc_0 // 0 bytec_1 // "circulating_units" @@ -1487,15 +1477,15 @@ pay_principal_after_if_else@3: bytec_1 // "circulating_units" swap app_global_put - // smart_contracts/base_d_asa/contract.py:451 + // smart_contracts/base_d_asa/contract.py:449 // self.account[holding_address].units = arc4.UInt64() dup box_get assert // check self.account entry exists - bytec 6 // 0x0000000000000000 + bytec 7 // 0x0000000000000000 replace2 32 box_put - // smart_contracts/base_d_asa/contract.py:452 + // smart_contracts/base_d_asa/contract.py:450 // self.end_if_no_circulating_units() callsub end_if_no_circulating_units // smart_contracts/zero_coupon_bond/contract.py:156 @@ -1533,11 +1523,11 @@ pay_principal_bool_false@16: // smart_contracts.base_d_asa.contract.BaseDAsa.account_total_units_value(holding_address: bytes) -> uint64: account_total_units_value: - // smart_contracts/base_d_asa/contract.py:341-342 + // smart_contracts/base_d_asa/contract.py:339-340 // @subroutine // def account_total_units_value(self, holding_address: arc4.Address) -> UInt64: proto 1 1 - // smart_contracts/base_d_asa/contract.py:344 + // smart_contracts/base_d_asa/contract.py:342 // holding_address, self.account[holding_address].units.native bytec_2 // 0x52333023 frame_dig -1 @@ -1546,7 +1536,7 @@ account_total_units_value: assert // check self.account entry exists extract 32 8 // on error: Index access is out of bounds btoi - // smart_contracts/base_d_asa/contract.py:343-345 + // smart_contracts/base_d_asa/contract.py:341-343 // return self.account_units_value( // holding_address, self.account[holding_address].units.native // ) @@ -1558,18 +1548,18 @@ account_total_units_value: // smart_contracts.base_d_asa.contract.BaseDAsa.end_if_no_circulating_units() -> void: end_if_no_circulating_units: - // smart_contracts/base_d_asa/contract.py:357-358 + // smart_contracts/base_d_asa/contract.py:355-356 // @subroutine // def end_if_no_circulating_units(self) -> None: proto 0 0 - // smart_contracts/base_d_asa/contract.py:359 + // smart_contracts/base_d_asa/contract.py:357 // if self.circulating_units == 0: intc_0 // 0 bytec_1 // "circulating_units" app_global_get_ex assert // check self.circulating_units exists bnz end_if_no_circulating_units_after_if_else@2 - // smart_contracts/base_d_asa/contract.py:360 + // smart_contracts/base_d_asa/contract.py:358 // self.status = UInt64(cfg.STATUS_ENDED) bytec_3 // "status" intc 7 // 200 @@ -1634,7 +1624,7 @@ get_account_units_current_value_bool_merge@4: // smart_contracts/zero_coupon_bond/contract.py:186 // 0 < units <= self.account[holding_address].units.native frame_dig -1 - bytec 6 // 0x0000000000000000 + bytec 7 // 0x0000000000000000 b> bz get_account_units_current_value_bool_false@7 frame_dig 0 @@ -1705,7 +1695,7 @@ get_account_units_current_value_bool_merge@8: // # The check on maturity date ensures D-ASA has been configured as block timestamp cannot be less than 0 (init). // return self.issuance_date <= Global.latest_timestamp < self.maturity_date intc_0 // 0 - bytec 5 // "issuance_date" + bytec 6 // "issuance_date" app_global_get_ex assert // check self.issuance_date exists global LatestTimestamp @@ -1884,16 +1874,16 @@ get_payment_amount_after_if_else@2: // smart_contracts.base_d_asa.contract.BaseDAsa.asset_create(arranger: bytes, metadata: bytes) -> void: asset_create: - // smart_contracts/base_d_asa/contract.py:454-455 + // smart_contracts/base_d_asa/contract.py:452-453 // @arc4.abimethod(create="require") // def asset_create(self, arranger: arc4.Address, metadata: typ.AssetMetadata) -> None: proto 2 0 - // smart_contracts/base_d_asa/contract.py:463 + // smart_contracts/base_d_asa/contract.py:461 // self.arranger.value = arranger.native bytec 17 // 0x52323023 frame_dig -2 app_global_put - // smart_contracts/base_d_asa/contract.py:464 + // smart_contracts/base_d_asa/contract.py:462 // self.metadata = metadata.native frame_dig -1 extract 2 0 @@ -1905,7 +1895,7 @@ asset_create: // smart_contracts.base_d_asa.contract.BaseDAsa.asset_config(denomination_asset_id: bytes, settlement_asset_id: bytes, principal: bytes, minimum_denomination: bytes, day_count_convention: bytes, interest_rate: bytes, coupon_rates: bytes, time_events: bytes, time_periods: bytes) -> void: asset_config: - // smart_contracts/base_d_asa/contract.py:476-488 + // smart_contracts/base_d_asa/contract.py:474-486 // @arc4.abimethod // def asset_config( // self, @@ -1923,10 +1913,10 @@ asset_config: intc_0 // 0 pushbytes "" dup - // smart_contracts/base_d_asa/contract.py:517 + // smart_contracts/base_d_asa/contract.py:515 // self.assert_caller_is_arranger() callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:518 + // smart_contracts/base_d_asa/contract.py:516 // assert self.status == cfg.STATUS_EMPTY, err.ALREADY_CONFIGURED intc_0 // 0 bytec_3 // "status" @@ -1934,7 +1924,7 @@ asset_config: assert // check self.status exists ! assert // D-ASA already configured - // smart_contracts/base_d_asa/contract.py:520-521 + // smart_contracts/base_d_asa/contract.py:518-519 // # Set Denomination Asset // self.assert_denomination_asset(denomination_asset_id.native) frame_dig -9 @@ -1960,10 +1950,10 @@ asset_config_bool_merge@5: assert // Denomination asset is not properly set // smart_contracts/base_d_asa/contract.py:182 // self.denomination_asset_id = denomination_asset_id - bytec 7 // "denomination_asset_id" + bytec 18 // "denomination_asset_id" frame_dig 3 app_global_put - // smart_contracts/base_d_asa/contract.py:524-525 + // smart_contracts/base_d_asa/contract.py:522-523 // # Set Denomination Asset // self.assert_settlement_asset(settlement_asset_id.native) frame_dig -8 @@ -1971,7 +1961,7 @@ asset_config_bool_merge@5: // smart_contracts/base_d_asa/contract.py:188 // settlement_asset_id == self.denomination_asset_id intc_0 // 0 - bytec 7 // "denomination_asset_id" + bytec 18 // "denomination_asset_id" app_global_get_ex assert // check self.denomination_asset_id exists dig 1 @@ -1984,7 +1974,7 @@ asset_config_bool_merge@5: assert // Different settlement asset not supported, must be equal to denomination asset // smart_contracts/base_d_asa/contract.py:193 // self.settlement_asset_id = settlement_asset_id - bytec 18 // "settlement_asset_id" + bytec 5 // "settlement_asset_id" swap app_global_put // smart_contracts/base_d_asa/contract.py:194-200 @@ -2002,7 +1992,7 @@ asset_config_bool_merge@5: // smart_contracts/base_d_asa/contract.py:196 // xfer_asset=self.settlement_asset_id, intc_0 // 0 - bytec 18 // "settlement_asset_id" + bytec 5 // "settlement_asset_id" app_global_get_ex assert // check self.settlement_asset_id exists // smart_contracts/base_d_asa/contract.py:197 @@ -2029,7 +2019,7 @@ asset_config_bool_merge@5: // fee=Global.min_txn_fee, // ).submit() itxn_submit - // smart_contracts/base_d_asa/contract.py:530 + // smart_contracts/base_d_asa/contract.py:528 // principal.native % minimum_denomination.native == 0 frame_dig -7 btoi @@ -2038,24 +2028,24 @@ asset_config_bool_merge@5: dup2 % ! - // smart_contracts/base_d_asa/contract.py:528-531 + // smart_contracts/base_d_asa/contract.py:526-529 // # Set Principal and Minimum Denomination // assert ( // principal.native % minimum_denomination.native == 0 // ), err.INVALID_MINIMUM_DENOMINATION assert // Minimum denomination is not a divisor of principal - // smart_contracts/base_d_asa/contract.py:532 + // smart_contracts/base_d_asa/contract.py:530 // self.unit_value = minimum_denomination.native bytec 11 // "unit_value" dig 1 app_global_put - // smart_contracts/base_d_asa/contract.py:533 + // smart_contracts/base_d_asa/contract.py:531 // self.total_units = principal.native // minimum_denomination.native / bytec 13 // "total_units" swap app_global_put - // smart_contracts/base_d_asa/contract.py:535-536 + // smart_contracts/base_d_asa/contract.py:533-534 // # Set Day-Count Convention // self.assert_day_count_convention(day_count_convention.native) frame_dig -5 @@ -2102,7 +2092,7 @@ asset_config_bool_merge@18: bytec 12 // "day_count_convention" frame_dig 1 app_global_put - // smart_contracts/base_d_asa/contract.py:539-540 + // smart_contracts/base_d_asa/contract.py:537-538 // # Set Interest Rate // self.assert_interest_rate(interest_rate.native) frame_dig -4 @@ -2163,7 +2153,7 @@ asset_config_after_if_else@30: // time_events.length == self.total_coupons + cfg.TIME_SCHEDULE_LIMITS // ), err.INVALID_TIME_EVENTS_LENGTH assert // Time events length is invalid - // smart_contracts/base_d_asa/contract.py:549 + // smart_contracts/base_d_asa/contract.py:547 // self.assert_time_events_sorted(time_events) frame_dig -2 callsub assert_time_events_sorted @@ -2216,7 +2206,7 @@ asset_config_after_if_else@30: // self.issuance_date = time_events[cfg.ISSUANCE_DATE_IDX].native extract 16 8 // on error: Index access is out of bounds btoi - bytec 5 // "issuance_date" + bytec 6 // "issuance_date" swap app_global_put // smart_contracts/base_d_asa/contract.py:269-270 @@ -2259,7 +2249,7 @@ asset_config_after_if_else@36: extract_uint16 ! assert // Time periods are not properly defined - // smart_contracts/base_d_asa/contract.py:556 + // smart_contracts/base_d_asa/contract.py:554 // self.status = UInt64(cfg.STATUS_ACTIVE) bytec_3 // "status" intc_2 // 100 @@ -2425,14 +2415,14 @@ assert_time_events_sorted_after_for@6: // smart_contracts.base_d_asa.contract.BaseDAsa.set_secondary_time_events(secondary_market_time_events: bytes) -> bytes: set_secondary_time_events: - // smart_contracts/base_d_asa/contract.py:558-561 + // smart_contracts/base_d_asa/contract.py:556-559 // @arc4.abimethod // def set_secondary_time_events( // self, secondary_market_time_events: typ.TimeEvents // ) -> typ.SecondaryMarketSchedule: proto 1 1 intc_0 // 0 - // smart_contracts/base_d_asa/contract.py:579 + // smart_contracts/base_d_asa/contract.py:577 // self.assert_caller_is_arranger() callsub assert_caller_is_arranger // smart_contracts/base_d_asa/contract.py:105 @@ -2443,28 +2433,28 @@ set_secondary_time_events: assert // check self.status exists intc 7 // 200 == - // smart_contracts/base_d_asa/contract.py:580 + // smart_contracts/base_d_asa/contract.py:578 // assert not self.status_is_ended(), err.UNAUTHORIZED ! assert // Not authorized - // smart_contracts/base_d_asa/contract.py:581 + // smart_contracts/base_d_asa/contract.py:579 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:583 + // smart_contracts/base_d_asa/contract.py:581 // assert secondary_market_time_events.length >= 1, err.INVALID_TIME_EVENTS_LENGTH frame_dig -1 intc_0 // 0 extract_uint16 dup assert // Time events length is invalid - // smart_contracts/base_d_asa/contract.py:584 + // smart_contracts/base_d_asa/contract.py:582 // if secondary_market_time_events.length > 1: intc_1 // 1 > frame_dig -1 swap bz set_secondary_time_events_after_if_else@2 - // smart_contracts/base_d_asa/contract.py:585 + // smart_contracts/base_d_asa/contract.py:583 // self.assert_time_events_sorted(secondary_market_time_events) frame_dig -1 callsub assert_time_events_sorted @@ -2475,13 +2465,13 @@ set_secondary_time_events: set_secondary_time_events_after_if_else@2: frame_dig 1 frame_bury -1 - // smart_contracts/base_d_asa/contract.py:587 + // smart_contracts/base_d_asa/contract.py:585 // self.issuance_date intc_0 // 0 - bytec 5 // "issuance_date" + bytec 6 // "issuance_date" app_global_get_ex assert // check self.issuance_date exists - // smart_contracts/base_d_asa/contract.py:588-590 + // smart_contracts/base_d_asa/contract.py:586-588 // <= secondary_market_time_events[ // cfg.SECONDARY_MARKET_OPENING_DATE_IDX // ].native @@ -2491,7 +2481,7 @@ set_secondary_time_events_after_if_else@2: frame_bury 0 extract 0 8 // on error: Index access is out of bounds btoi - // smart_contracts/base_d_asa/contract.py:587-590 + // smart_contracts/base_d_asa/contract.py:585-588 // self.issuance_date // <= secondary_market_time_events[ // cfg.SECONDARY_MARKET_OPENING_DATE_IDX @@ -2499,7 +2489,7 @@ set_secondary_time_events_after_if_else@2: swap dig 1 <= - // smart_contracts/base_d_asa/contract.py:586-591 + // smart_contracts/base_d_asa/contract.py:584-589 // assert ( // self.issuance_date // <= secondary_market_time_events[ @@ -2507,34 +2497,34 @@ set_secondary_time_events_after_if_else@2: // ].native // ), err.INVALID_SECONDARY_OPENING_DATE assert // Invalid secondary market opening date - // smart_contracts/base_d_asa/contract.py:592 + // smart_contracts/base_d_asa/contract.py:590 // self.secondary_market_opening_date = secondary_market_time_events[ bytec 15 // "secondary_market_opening_date" - // smart_contracts/base_d_asa/contract.py:592-594 + // smart_contracts/base_d_asa/contract.py:590-592 // self.secondary_market_opening_date = secondary_market_time_events[ // cfg.SECONDARY_MARKET_OPENING_DATE_IDX // ].native swap app_global_put - // smart_contracts/base_d_asa/contract.py:595 + // smart_contracts/base_d_asa/contract.py:593 // if self.maturity_date: intc_0 // 0 bytec 4 // "maturity_date" app_global_get_ex assert // check self.maturity_date exists bz set_secondary_time_events_after_if_else@4 - // smart_contracts/base_d_asa/contract.py:597 + // smart_contracts/base_d_asa/contract.py:595 // self.maturity_date intc_0 // 0 bytec 4 // "maturity_date" app_global_get_ex assert // check self.maturity_date exists - // smart_contracts/base_d_asa/contract.py:599 + // smart_contracts/base_d_asa/contract.py:597 // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX frame_dig -1 intc_0 // 0 extract_uint16 - // smart_contracts/base_d_asa/contract.py:598-600 + // smart_contracts/base_d_asa/contract.py:596-598 // >= secondary_market_time_events[ // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX // ].native @@ -2547,7 +2537,7 @@ set_secondary_time_events_after_if_else@2: intc_3 // 8 extract3 // on error: Index access is out of bounds btoi - // smart_contracts/base_d_asa/contract.py:597-600 + // smart_contracts/base_d_asa/contract.py:595-598 // self.maturity_date // >= secondary_market_time_events[ // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX @@ -2555,7 +2545,7 @@ set_secondary_time_events_after_if_else@2: swap dig 1 >= - // smart_contracts/base_d_asa/contract.py:596-601 + // smart_contracts/base_d_asa/contract.py:594-599 // assert ( // self.maturity_date // >= secondary_market_time_events[ @@ -2563,10 +2553,10 @@ set_secondary_time_events_after_if_else@2: // ].native // ), err.INVALID_SECONDARY_CLOSURE_DATE assert // Invalid secondary market closure date - // smart_contracts/base_d_asa/contract.py:602 + // smart_contracts/base_d_asa/contract.py:600 // self.secondary_market_closure_date = secondary_market_time_events[ bytec 16 // "secondary_market_closure_date" - // smart_contracts/base_d_asa/contract.py:602-604 + // smart_contracts/base_d_asa/contract.py:600-602 // self.secondary_market_closure_date = secondary_market_time_events[ // cfg.SECONDARY_MARKET_CLOSURE_DATE_IDX // ].native @@ -2574,29 +2564,29 @@ set_secondary_time_events_after_if_else@2: app_global_put set_secondary_time_events_after_if_else@4: - // smart_contracts/base_d_asa/contract.py:607 + // smart_contracts/base_d_asa/contract.py:605 // self.secondary_market_opening_date intc_0 // 0 bytec 15 // "secondary_market_opening_date" app_global_get_ex assert // check self.secondary_market_opening_date exists - // smart_contracts/base_d_asa/contract.py:606-608 + // smart_contracts/base_d_asa/contract.py:604-606 // secondary_market_opening_date=arc4.UInt64( // self.secondary_market_opening_date // ), itob - // smart_contracts/base_d_asa/contract.py:610 + // smart_contracts/base_d_asa/contract.py:608 // self.secondary_market_closure_date intc_0 // 0 bytec 16 // "secondary_market_closure_date" app_global_get_ex assert // check self.secondary_market_closure_date exists - // smart_contracts/base_d_asa/contract.py:609-611 + // smart_contracts/base_d_asa/contract.py:607-609 // secondary_market_closure_date=arc4.UInt64( // self.secondary_market_closure_date // ), itob - // smart_contracts/base_d_asa/contract.py:605-612 + // smart_contracts/base_d_asa/contract.py:603-610 // return typ.SecondaryMarketSchedule( // secondary_market_opening_date=arc4.UInt64( // self.secondary_market_opening_date @@ -2612,27 +2602,27 @@ set_secondary_time_events_after_if_else@4: // smart_contracts.base_d_asa.contract.BaseDAsa.assign_role(role_address: bytes, role: bytes, config: bytes) -> bytes: assign_role: - // smart_contracts/base_d_asa/contract.py:614-617 + // smart_contracts/base_d_asa/contract.py:612-615 // @arc4.abimethod // def assign_role( // self, role_address: arc4.Address, role: arc4.UInt8, config: arc4.DynamicBytes // ) -> arc4.UInt64: proto 3 1 - // smart_contracts/base_d_asa/contract.py:635 + // smart_contracts/base_d_asa/contract.py:633 // self.assert_caller_is_arranger() callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:636 + // smart_contracts/base_d_asa/contract.py:634 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:637 + // smart_contracts/base_d_asa/contract.py:635 // assert role.native in ( frame_dig -2 btoi dup - // smart_contracts/base_d_asa/contract.py:638 + // smart_contracts/base_d_asa/contract.py:636 // UInt64(cst.ROLE_ARRANGER), pushint 20 // 20 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -2644,10 +2634,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:639 + // smart_contracts/base_d_asa/contract.py:637 // UInt64(cst.ROLE_ACCOUNT_MANAGER), pushint 40 // 40 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -2659,10 +2649,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:640 + // smart_contracts/base_d_asa/contract.py:638 // UInt64(cst.ROLE_PRIMARY_DEALER), pushint 50 // 50 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -2674,10 +2664,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:641 + // smart_contracts/base_d_asa/contract.py:639 // UInt64(cst.ROLE_TRUSTEE), pushint 60 // 60 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -2689,10 +2679,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:642 + // smart_contracts/base_d_asa/contract.py:640 // UInt64(cst.ROLE_AUTHORITY), pushint 70 // 70 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -2704,10 +2694,10 @@ assign_role: == bnz assign_role_bool_true@6 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:643 + // smart_contracts/base_d_asa/contract.py:641 // UInt64(cst.ROLE_INTEREST_ORACLE), pushint 80 // 80 - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -2723,7 +2713,7 @@ assign_role_bool_true@6: intc_1 // 1 assign_role_bool_merge@8: - // smart_contracts/base_d_asa/contract.py:637-644 + // smart_contracts/base_d_asa/contract.py:635-642 // assert role.native in ( // UInt64(cst.ROLE_ARRANGER), // UInt64(cst.ROLE_ACCOUNT_MANAGER), @@ -2733,10 +2723,10 @@ assign_role_bool_merge@8: // UInt64(cst.ROLE_INTEREST_ORACLE), // ), err.INVALID_ROLE assert // Invalid role identifier - // smart_contracts/base_d_asa/contract.py:646 + // smart_contracts/base_d_asa/contract.py:644 // case UInt64(cst.ROLE_ARRANGER): pushints 20 40 50 60 70 80 // 20, 40, 50, 60, 70, 80 - // smart_contracts/base_d_asa/contract.py:645-674 + // smart_contracts/base_d_asa/contract.py:643-672 // match role.native: // case UInt64(cst.ROLE_ARRANGER): // self.arranger.value = role_address.native @@ -2769,12 +2759,12 @@ assign_role_bool_merge@8: // op.err() frame_dig 0 match assign_role_switch_case_0@9 assign_role_switch_case_1@10 assign_role_switch_case_2@11 assign_role_switch_case_3@12 assign_role_switch_case_4@13 assign_role_switch_case_5@14 - // smart_contracts/base_d_asa/contract.py:674 + // smart_contracts/base_d_asa/contract.py:672 // op.err() err assign_role_switch_case_5@14: - // smart_contracts/base_d_asa/contract.py:668 + // smart_contracts/base_d_asa/contract.py:666 // role_address not in self.interest_oracle bytec 30 // 0x52383023 frame_dig -3 @@ -2783,23 +2773,23 @@ assign_role_switch_case_5@14: box_len bury 1 ! - // smart_contracts/base_d_asa/contract.py:667-669 + // smart_contracts/base_d_asa/contract.py:665-667 // assert ( // role_address not in self.interest_oracle // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:671 + // smart_contracts/base_d_asa/contract.py:669 // config.native frame_dig -1 extract 2 0 - // smart_contracts/base_d_asa/contract.py:670-672 + // smart_contracts/base_d_asa/contract.py:668-670 // self.interest_oracle[role_address] = typ.RoleConfig.from_bytes( // config.native // ) box_put assign_role_switch_case_next@16: - // smart_contracts/base_d_asa/contract.py:675 + // smart_contracts/base_d_asa/contract.py:673 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -2807,7 +2797,7 @@ assign_role_switch_case_next@16: retsub assign_role_switch_case_4@13: - // smart_contracts/base_d_asa/contract.py:664 + // smart_contracts/base_d_asa/contract.py:662 // assert role_address not in self.authority, err.INVALID_ROLE_ADDRESS bytec 24 // 0x52373023 frame_dig -3 @@ -2817,7 +2807,7 @@ assign_role_switch_case_4@13: bury 1 ! assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:665 + // smart_contracts/base_d_asa/contract.py:663 // self.authority[role_address] = typ.RoleConfig.from_bytes(config.native) frame_dig -1 extract 2 0 @@ -2825,7 +2815,7 @@ assign_role_switch_case_4@13: b assign_role_switch_case_next@16 assign_role_switch_case_3@12: - // smart_contracts/base_d_asa/contract.py:661 + // smart_contracts/base_d_asa/contract.py:659 // assert role_address not in self.trustee, err.INVALID_ROLE_ADDRESS bytec 25 // 0x52363023 frame_dig -3 @@ -2835,7 +2825,7 @@ assign_role_switch_case_3@12: bury 1 ! assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:662 + // smart_contracts/base_d_asa/contract.py:660 // self.trustee[role_address] = typ.RoleConfig.from_bytes(config.native) frame_dig -1 extract 2 0 @@ -2843,7 +2833,7 @@ assign_role_switch_case_3@12: b assign_role_switch_case_next@16 assign_role_switch_case_2@11: - // smart_contracts/base_d_asa/contract.py:656 + // smart_contracts/base_d_asa/contract.py:654 // assert role_address not in self.primary_dealer, err.INVALID_ROLE_ADDRESS bytec 26 // 0x52353023 frame_dig -3 @@ -2853,11 +2843,11 @@ assign_role_switch_case_2@11: bury 1 ! assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:658 + // smart_contracts/base_d_asa/contract.py:656 // config.native frame_dig -1 extract 2 0 - // smart_contracts/base_d_asa/contract.py:657-659 + // smart_contracts/base_d_asa/contract.py:655-657 // self.primary_dealer[role_address] = typ.RoleConfig.from_bytes( // config.native // ) @@ -2865,7 +2855,7 @@ assign_role_switch_case_2@11: b assign_role_switch_case_next@16 assign_role_switch_case_1@10: - // smart_contracts/base_d_asa/contract.py:650 + // smart_contracts/base_d_asa/contract.py:648 // role_address not in self.account_manager bytec 27 // 0x52343023 frame_dig -3 @@ -2874,16 +2864,16 @@ assign_role_switch_case_1@10: box_len bury 1 ! - // smart_contracts/base_d_asa/contract.py:649-651 + // smart_contracts/base_d_asa/contract.py:647-649 // assert ( // role_address not in self.account_manager // ), err.INVALID_ROLE_ADDRESS assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:653 + // smart_contracts/base_d_asa/contract.py:651 // config.native frame_dig -1 extract 2 0 - // smart_contracts/base_d_asa/contract.py:652-654 + // smart_contracts/base_d_asa/contract.py:650-652 // self.account_manager[role_address] = typ.RoleConfig.from_bytes( // config.native // ) @@ -2891,7 +2881,7 @@ assign_role_switch_case_1@10: b assign_role_switch_case_next@16 assign_role_switch_case_0@9: - // smart_contracts/base_d_asa/contract.py:647 + // smart_contracts/base_d_asa/contract.py:645 // self.arranger.value = role_address.native bytec 17 // 0x52323023 frame_dig -3 @@ -2905,25 +2895,25 @@ assign_role_bool_false@7: // smart_contracts.base_d_asa.contract.BaseDAsa.revoke_role(role_address: bytes, role: bytes) -> bytes: revoke_role: - // smart_contracts/base_d_asa/contract.py:677-678 + // smart_contracts/base_d_asa/contract.py:675-676 // @arc4.abimethod // def revoke_role(self, role_address: arc4.Address, role: arc4.UInt8) -> arc4.UInt64: proto 2 1 - // smart_contracts/base_d_asa/contract.py:695 + // smart_contracts/base_d_asa/contract.py:693 // self.assert_caller_is_arranger() callsub assert_caller_is_arranger - // smart_contracts/base_d_asa/contract.py:696 + // smart_contracts/base_d_asa/contract.py:694 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:697 + // smart_contracts/base_d_asa/contract.py:695 // assert role.native in ( frame_dig -1 btoi dup - // smart_contracts/base_d_asa/contract.py:698 + // smart_contracts/base_d_asa/contract.py:696 // UInt64(cst.ROLE_ACCOUNT_MANAGER), pushint 40 // 40 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -2934,10 +2924,10 @@ revoke_role: == bnz revoke_role_bool_true@5 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:699 + // smart_contracts/base_d_asa/contract.py:697 // UInt64(cst.ROLE_PRIMARY_DEALER), pushint 50 // 50 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -2948,10 +2938,10 @@ revoke_role: == bnz revoke_role_bool_true@5 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:700 + // smart_contracts/base_d_asa/contract.py:698 // UInt64(cst.ROLE_TRUSTEE), pushint 60 // 60 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -2962,10 +2952,10 @@ revoke_role: == bnz revoke_role_bool_true@5 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:701 + // smart_contracts/base_d_asa/contract.py:699 // UInt64(cst.ROLE_AUTHORITY), pushint 70 // 70 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -2976,10 +2966,10 @@ revoke_role: == bnz revoke_role_bool_true@5 frame_dig 0 - // smart_contracts/base_d_asa/contract.py:702 + // smart_contracts/base_d_asa/contract.py:700 // UInt64(cst.ROLE_INTEREST_ORACLE), pushint 80 // 80 - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -2994,7 +2984,7 @@ revoke_role_bool_true@5: intc_1 // 1 revoke_role_bool_merge@7: - // smart_contracts/base_d_asa/contract.py:697-703 + // smart_contracts/base_d_asa/contract.py:695-701 // assert role.native in ( // UInt64(cst.ROLE_ACCOUNT_MANAGER), // UInt64(cst.ROLE_PRIMARY_DEALER), @@ -3003,11 +2993,11 @@ revoke_role_bool_merge@7: // UInt64(cst.ROLE_INTEREST_ORACLE), // ), err.INVALID_ROLE assert // Invalid role identifier - // smart_contracts/base_d_asa/contract.py:705-706 + // smart_contracts/base_d_asa/contract.py:703-704 // # Arranger role can not be revoked (just rotated) // case UInt64(cst.ROLE_ACCOUNT_MANAGER): pushints 40 50 60 70 80 // 40, 50, 60, 70, 80 - // smart_contracts/base_d_asa/contract.py:704-722 + // smart_contracts/base_d_asa/contract.py:702-720 // match role.native: // # Arranger role can not be revoked (just rotated) // case UInt64(cst.ROLE_ACCOUNT_MANAGER): @@ -3029,12 +3019,12 @@ revoke_role_bool_merge@7: // op.err() frame_dig 0 match revoke_role_switch_case_0@8 revoke_role_switch_case_1@9 revoke_role_switch_case_2@10 revoke_role_switch_case_3@11 revoke_role_switch_case_4@12 - // smart_contracts/base_d_asa/contract.py:722 + // smart_contracts/base_d_asa/contract.py:720 // op.err() err revoke_role_switch_case_4@12: - // smart_contracts/base_d_asa/contract.py:719 + // smart_contracts/base_d_asa/contract.py:717 // assert role_address in self.interest_oracle, err.INVALID_ROLE_ADDRESS bytec 30 // 0x52383023 frame_dig -2 @@ -3043,13 +3033,13 @@ revoke_role_switch_case_4@12: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:720 + // smart_contracts/base_d_asa/contract.py:718 // op.Box.delete(cst.PREFIX_ID_INTEREST_ORACLE + role_address.bytes) box_del pop revoke_role_switch_case_next@14: - // smart_contracts/base_d_asa/contract.py:723 + // smart_contracts/base_d_asa/contract.py:721 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -3057,7 +3047,7 @@ revoke_role_switch_case_next@14: retsub revoke_role_switch_case_3@11: - // smart_contracts/base_d_asa/contract.py:716 + // smart_contracts/base_d_asa/contract.py:714 // assert role_address in self.authority, err.INVALID_ROLE_ADDRESS bytec 24 // 0x52373023 frame_dig -2 @@ -3066,14 +3056,14 @@ revoke_role_switch_case_3@11: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:717 + // smart_contracts/base_d_asa/contract.py:715 // op.Box.delete(cst.PREFIX_ID_AUTHORITY + role_address.bytes) box_del pop b revoke_role_switch_case_next@14 revoke_role_switch_case_2@10: - // smart_contracts/base_d_asa/contract.py:713 + // smart_contracts/base_d_asa/contract.py:711 // assert role_address in self.trustee, err.INVALID_ROLE_ADDRESS bytec 25 // 0x52363023 frame_dig -2 @@ -3082,14 +3072,14 @@ revoke_role_switch_case_2@10: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:714 + // smart_contracts/base_d_asa/contract.py:712 // op.Box.delete(cst.PREFIX_ID_TRUSTEE + role_address.bytes) box_del pop b revoke_role_switch_case_next@14 revoke_role_switch_case_1@9: - // smart_contracts/base_d_asa/contract.py:710 + // smart_contracts/base_d_asa/contract.py:708 // assert role_address in self.primary_dealer, err.INVALID_ROLE_ADDRESS bytec 26 // 0x52353023 frame_dig -2 @@ -3098,14 +3088,14 @@ revoke_role_switch_case_1@9: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:711 + // smart_contracts/base_d_asa/contract.py:709 // op.Box.delete(cst.PREFIX_ID_PRIMARY_DEALER + role_address.bytes) box_del pop b revoke_role_switch_case_next@14 revoke_role_switch_case_0@8: - // smart_contracts/base_d_asa/contract.py:707 + // smart_contracts/base_d_asa/contract.py:705 // assert role_address in self.account_manager, err.INVALID_ROLE_ADDRESS bytec 27 // 0x52343023 frame_dig -2 @@ -3114,7 +3104,7 @@ revoke_role_switch_case_0@8: box_len bury 1 assert // Invalid account role address - // smart_contracts/base_d_asa/contract.py:708 + // smart_contracts/base_d_asa/contract.py:706 // op.Box.delete(cst.PREFIX_ID_ACCOUNT_MANAGER + role_address.bytes) box_del pop @@ -3127,13 +3117,13 @@ revoke_role_bool_false@6: // smart_contracts.base_d_asa.contract.BaseDAsa.open_account(holding_address: bytes, payment_address: bytes) -> bytes: open_account: - // smart_contracts/base_d_asa/contract.py:725-728 + // smart_contracts/base_d_asa/contract.py:723-726 // @arc4.abimethod // def open_account( // self, holding_address: arc4.Address, payment_address: arc4.Address // ) -> arc4.UInt64: proto 2 1 - // smart_contracts/base_d_asa/contract.py:745 + // smart_contracts/base_d_asa/contract.py:743 // self.assert_caller_is_account_manager() callsub assert_caller_is_account_manager // smart_contracts/base_d_asa/contract.py:105 @@ -3144,17 +3134,17 @@ open_account: assert // check self.status exists intc 7 // 200 == - // smart_contracts/base_d_asa/contract.py:746 + // smart_contracts/base_d_asa/contract.py:744 // assert not self.status_is_ended(), err.UNAUTHORIZED ! assert // Not authorized - // smart_contracts/base_d_asa/contract.py:747 + // smart_contracts/base_d_asa/contract.py:745 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:748 + // smart_contracts/base_d_asa/contract.py:746 // self.assert_is_not_suspended() callsub assert_is_not_suspended - // smart_contracts/base_d_asa/contract.py:749 + // smart_contracts/base_d_asa/contract.py:747 // assert holding_address not in self.account, err.INVALID_HOLDING_ADDRESS bytec_2 // 0x52333023 frame_dig -2 @@ -3164,7 +3154,7 @@ open_account: bury 1 ! assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:751-757 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -3173,10 +3163,10 @@ open_account: // suspended=arc4.Bool(), // ) frame_dig -1 - // smart_contracts/base_d_asa/contract.py:753 + // smart_contracts/base_d_asa/contract.py:751 // units=arc4.UInt64(), - bytec 6 // 0x0000000000000000 - // smart_contracts/base_d_asa/contract.py:751-757 + bytec 7 // 0x0000000000000000 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -3185,10 +3175,10 @@ open_account: // suspended=arc4.Bool(), // ) concat - // smart_contracts/base_d_asa/contract.py:754 + // smart_contracts/base_d_asa/contract.py:752 // unit_value=arc4.UInt64(), - bytec 6 // 0x0000000000000000 - // smart_contracts/base_d_asa/contract.py:751-757 + bytec 7 // 0x0000000000000000 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -3197,10 +3187,10 @@ open_account: // suspended=arc4.Bool(), // ) concat - // smart_contracts/base_d_asa/contract.py:755 + // smart_contracts/base_d_asa/contract.py:753 // paid_coupons=arc4.UInt64(), - bytec 6 // 0x0000000000000000 - // smart_contracts/base_d_asa/contract.py:751-757 + bytec 7 // 0x0000000000000000 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -3209,10 +3199,10 @@ open_account: // suspended=arc4.Bool(), // ) concat - // smart_contracts/base_d_asa/contract.py:756 + // smart_contracts/base_d_asa/contract.py:754 // suspended=arc4.Bool(), bytec 10 // 0x00 - // smart_contracts/base_d_asa/contract.py:751-757 + // smart_contracts/base_d_asa/contract.py:749-755 // self.account[holding_address] = typ.AccountInfo( // payment_address=payment_address, // units=arc4.UInt64(), @@ -3222,7 +3212,7 @@ open_account: // ) concat box_put - // smart_contracts/base_d_asa/contract.py:758 + // smart_contracts/base_d_asa/contract.py:756 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -3311,16 +3301,16 @@ assert_caller_is_account_manager_bool_false@4: // smart_contracts.base_d_asa.contract.BaseDAsa.close_account(holding_address: bytes) -> bytes: close_account: - // smart_contracts/base_d_asa/contract.py:760-763 + // smart_contracts/base_d_asa/contract.py:758-761 // @arc4.abimethod // def close_account( // self, holding_address: arc4.Address // ) -> arc4.Tuple[arc4.UInt64, arc4.UInt64]: proto 1 1 - // smart_contracts/base_d_asa/contract.py:778 + // smart_contracts/base_d_asa/contract.py:776 // self.assert_caller_is_account_manager() callsub assert_caller_is_account_manager - // smart_contracts/base_d_asa/contract.py:779 + // smart_contracts/base_d_asa/contract.py:777 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted // smart_contracts/base_d_asa/contract.py:171 @@ -3332,19 +3322,19 @@ close_account: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:782 + // smart_contracts/base_d_asa/contract.py:780 // closed_units = self.account[holding_address].units.native dup box_get assert // check self.account entry exists extract 32 8 // on error: Index access is out of bounds btoi - // smart_contracts/base_d_asa/contract.py:783 + // smart_contracts/base_d_asa/contract.py:781 // op.Box.delete(cst.PREFIX_ID_ACCOUNT + holding_address.bytes) swap box_del pop - // smart_contracts/base_d_asa/contract.py:784 + // smart_contracts/base_d_asa/contract.py:782 // self.circulating_units -= closed_units intc_0 // 0 bytec_1 // "circulating_units" @@ -3355,15 +3345,15 @@ close_account: bytec_1 // "circulating_units" swap app_global_put - // smart_contracts/base_d_asa/contract.py:785 + // smart_contracts/base_d_asa/contract.py:783 // self.end_if_no_circulating_units() callsub end_if_no_circulating_units - // smart_contracts/base_d_asa/contract.py:787 + // smart_contracts/base_d_asa/contract.py:785 // (arc4.UInt64(closed_units), arc4.UInt64(Global.latest_timestamp)) itob global LatestTimestamp itob - // smart_contracts/base_d_asa/contract.py:786-788 + // smart_contracts/base_d_asa/contract.py:784-786 // return arc4.Tuple( // (arc4.UInt64(closed_units), arc4.UInt64(Global.latest_timestamp)) // ) @@ -3373,7 +3363,7 @@ close_account: // smart_contracts.base_d_asa.contract.BaseDAsa.primary_distribution(holding_address: bytes, units: bytes) -> bytes: primary_distribution: - // smart_contracts/base_d_asa/contract.py:790-793 + // smart_contracts/base_d_asa/contract.py:788-791 // @arc4.abimethod // def primary_distribution( // self, holding_address: arc4.Address, units: arc4.UInt64 @@ -3519,19 +3509,19 @@ primary_distribution_bool_merge@13: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:818 + // smart_contracts/base_d_asa/contract.py:816 // self.assert_is_not_defaulted() callsub assert_is_not_defaulted - // smart_contracts/base_d_asa/contract.py:819 + // smart_contracts/base_d_asa/contract.py:817 // self.assert_is_not_suspended() callsub assert_is_not_suspended - // smart_contracts/base_d_asa/contract.py:820 + // smart_contracts/base_d_asa/contract.py:818 // assert units.native > 0, err.ZERO_UNITS frame_dig -1 btoi dup assert // Can not distribute zero units - // smart_contracts/base_d_asa/contract.py:822 + // smart_contracts/base_d_asa/contract.py:820 // self.circulating_units + units.native <= self.total_units intc_0 // 0 bytec_1 // "circulating_units" @@ -3544,12 +3534,12 @@ primary_distribution_bool_merge@13: app_global_get_ex assert // check self.total_units exists <= - // smart_contracts/base_d_asa/contract.py:821-823 + // smart_contracts/base_d_asa/contract.py:819-821 // assert ( // self.circulating_units + units.native <= self.total_units // ), err.OVER_DISTRIBUTION assert // Insufficient remaining D-ASA units - // smart_contracts/base_d_asa/contract.py:825 + // smart_contracts/base_d_asa/contract.py:823 // self.circulating_units += units.native intc_0 // 0 bytec_1 // "circulating_units" @@ -3560,7 +3550,7 @@ primary_distribution_bool_merge@13: bytec_1 // "circulating_units" swap app_global_put - // smart_contracts/base_d_asa/contract.py:827 + // smart_contracts/base_d_asa/contract.py:825 // self.account[holding_address].units.native + units.native dig 1 box_get @@ -3568,17 +3558,17 @@ primary_distribution_bool_merge@13: extract 32 8 // on error: Index access is out of bounds btoi + - // smart_contracts/base_d_asa/contract.py:826-828 + // smart_contracts/base_d_asa/contract.py:824-826 // self.account[holding_address].units = arc4.UInt64( // self.account[holding_address].units.native + units.native // ) itob - // smart_contracts/base_d_asa/contract.py:826 + // smart_contracts/base_d_asa/contract.py:824 // self.account[holding_address].units = arc4.UInt64( dig 1 box_get assert // check self.account entry exists - // smart_contracts/base_d_asa/contract.py:826-828 + // smart_contracts/base_d_asa/contract.py:824-826 // self.account[holding_address].units = arc4.UInt64( // self.account[holding_address].units.native + units.native // ) @@ -3587,7 +3577,7 @@ primary_distribution_bool_merge@13: dig 1 swap box_put - // smart_contracts/base_d_asa/contract.py:829 + // smart_contracts/base_d_asa/contract.py:827 // self.account[holding_address].unit_value = arc4.UInt64(self.unit_value) intc_0 // 0 bytec 11 // "unit_value" @@ -3600,7 +3590,7 @@ primary_distribution_bool_merge@13: swap replace2 40 box_put - // smart_contracts/base_d_asa/contract.py:830 + // smart_contracts/base_d_asa/contract.py:828 // return arc4.UInt64(self.total_units - self.circulating_units) intc_0 // 0 bytec 13 // "total_units" @@ -3626,14 +3616,14 @@ primary_distribution_bool_false@5: // smart_contracts.base_d_asa.contract.BaseDAsa.set_asset_suspension(suspended: bytes) -> bytes: set_asset_suspension: - // smart_contracts/base_d_asa/contract.py:832-833 + // smart_contracts/base_d_asa/contract.py:830-831 // @arc4.abimethod // def set_asset_suspension(self, suspended: arc4.Bool) -> arc4.UInt64: proto 1 1 - // smart_contracts/base_d_asa/contract.py:846 + // smart_contracts/base_d_asa/contract.py:844 // self.assert_caller_is_authority() callsub assert_caller_is_authority - // smart_contracts/base_d_asa/contract.py:847 + // smart_contracts/base_d_asa/contract.py:845 // self.suspended = UInt64(suspended.native) frame_dig -1 intc_0 // 0 @@ -3641,7 +3631,7 @@ set_asset_suspension: bytec 20 // "suspended" swap app_global_put - // smart_contracts/base_d_asa/contract.py:848 + // smart_contracts/base_d_asa/contract.py:846 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -3730,13 +3720,13 @@ assert_caller_is_authority_bool_false@4: // smart_contracts.base_d_asa.contract.BaseDAsa.set_account_suspension(holding_address: bytes, suspended: bytes) -> bytes: set_account_suspension: - // smart_contracts/base_d_asa/contract.py:850-853 + // smart_contracts/base_d_asa/contract.py:848-851 // @arc4.abimethod // def set_account_suspension( // self, holding_address: arc4.Address, suspended: arc4.Bool // ) -> arc4.UInt64: proto 2 1 - // smart_contracts/base_d_asa/contract.py:868 + // smart_contracts/base_d_asa/contract.py:866 // self.assert_caller_is_authority() callsub assert_caller_is_authority // smart_contracts/base_d_asa/contract.py:171 @@ -3748,7 +3738,7 @@ set_account_suspension: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:870 + // smart_contracts/base_d_asa/contract.py:868 // self.account[holding_address].suspended = suspended dup box_get @@ -3760,7 +3750,7 @@ set_account_suspension: swap setbit box_put - // smart_contracts/base_d_asa/contract.py:871 + // smart_contracts/base_d_asa/contract.py:869 // return arc4.UInt64(Global.latest_timestamp) global LatestTimestamp itob @@ -3769,7 +3759,7 @@ set_account_suspension: // smart_contracts.base_d_asa.contract.BaseDAsa.set_default_status(defaulted: bytes) -> void: set_default_status: - // smart_contracts/base_d_asa/contract.py:873-874 + // smart_contracts/base_d_asa/contract.py:871-872 // @arc4.abimethod // def set_default_status(self, defaulted: arc4.Bool) -> None: proto 1 0 @@ -3840,7 +3830,7 @@ set_default_status_bool_merge@6: // <= self.trustee[caller].role_validity_end // ), err.UNAUTHORIZED assert // Not authorized - // smart_contracts/base_d_asa/contract.py:885 + // smart_contracts/base_d_asa/contract.py:883 // self.defaulted = UInt64(defaulted.native) frame_dig -1 intc_0 // 0 @@ -3857,18 +3847,25 @@ set_default_status_bool_false@5: // smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_info() -> bytes: get_asset_info: - // smart_contracts/base_d_asa/contract.py:887-888 + // smart_contracts/base_d_asa/contract.py:885-886 // @arc4.abimethod(readonly=True) // def get_asset_info(self) -> typ.AssetInfo: proto 0 1 - // smart_contracts/base_d_asa/contract.py:898 + // smart_contracts/base_d_asa/contract.py:896 // denomination_asset_id=arc4.UInt64(self.denomination_asset_id), intc_0 // 0 - bytec 7 // "denomination_asset_id" + bytec 18 // "denomination_asset_id" app_global_get_ex assert // check self.denomination_asset_id exists itob - // smart_contracts/base_d_asa/contract.py:899 + // smart_contracts/base_d_asa/contract.py:897 + // settlement_asset_id=arc4.UInt64(self.settlement_asset_id), + intc_0 // 0 + bytec 5 // "settlement_asset_id" + app_global_get_ex + assert // check self.settlement_asset_id exists + itob + // smart_contracts/base_d_asa/contract.py:898 // outstanding_principal=arc4.UInt64(self.circulating_units * self.unit_value), intc_0 // 0 bytec_1 // "circulating_units" @@ -3880,14 +3877,14 @@ get_asset_info: assert // check self.unit_value exists * itob - // smart_contracts/base_d_asa/contract.py:900 + // smart_contracts/base_d_asa/contract.py:899 // unit_value=arc4.UInt64(self.unit_value), intc_0 // 0 bytec 11 // "unit_value" app_global_get_ex assert // check self.unit_value exists itob - // smart_contracts/base_d_asa/contract.py:901 + // smart_contracts/base_d_asa/contract.py:900 // day_count_convention=arc4.UInt8(self.day_count_convention), intc_0 // 0 bytec 12 // "day_count_convention" @@ -3895,7 +3892,7 @@ get_asset_info: assert // check self.day_count_convention exists itob extract 7 1 - // smart_contracts/base_d_asa/contract.py:902 + // smart_contracts/base_d_asa/contract.py:901 // interest_rate=arc4.UInt16(self.interest_rate), intc_0 // 0 bytec 8 // "interest_rate" @@ -3903,57 +3900,57 @@ get_asset_info: assert // check self.interest_rate exists itob extract 6 2 - // smart_contracts/base_d_asa/contract.py:903 + // smart_contracts/base_d_asa/contract.py:902 // total_supply=arc4.UInt64(self.total_units), intc_0 // 0 bytec 13 // "total_units" app_global_get_ex assert // check self.total_units exists itob - // smart_contracts/base_d_asa/contract.py:904 + // smart_contracts/base_d_asa/contract.py:903 // circulating_supply=arc4.UInt64(self.circulating_units), intc_0 // 0 bytec_1 // "circulating_units" app_global_get_ex assert // check self.circulating_units exists itob - // smart_contracts/base_d_asa/contract.py:906 + // smart_contracts/base_d_asa/contract.py:905 // self.primary_distribution_opening_date intc_0 // 0 bytec 9 // "primary_distribution_opening_date" app_global_get_ex assert // check self.primary_distribution_opening_date exists - // smart_contracts/base_d_asa/contract.py:905-907 + // smart_contracts/base_d_asa/contract.py:904-906 // primary_distribution_opening_date=arc4.UInt64( // self.primary_distribution_opening_date // ), itob - // smart_contracts/base_d_asa/contract.py:909 + // smart_contracts/base_d_asa/contract.py:908 // self.primary_distribution_closure_date intc_0 // 0 bytec 19 // "primary_distribution_closure_date" app_global_get_ex assert // check self.primary_distribution_closure_date exists - // smart_contracts/base_d_asa/contract.py:908-910 + // smart_contracts/base_d_asa/contract.py:907-909 // primary_distribution_closure_date=arc4.UInt64( // self.primary_distribution_closure_date // ), itob - // smart_contracts/base_d_asa/contract.py:911 + // smart_contracts/base_d_asa/contract.py:910 // issuance_date=arc4.UInt64(self.issuance_date), intc_0 // 0 - bytec 5 // "issuance_date" + bytec 6 // "issuance_date" app_global_get_ex assert // check self.issuance_date exists itob - // smart_contracts/base_d_asa/contract.py:912 + // smart_contracts/base_d_asa/contract.py:911 // maturity_date=arc4.UInt64(self.maturity_date), intc_0 // 0 bytec 4 // "maturity_date" app_global_get_ex assert // check self.maturity_date exists itob - // smart_contracts/base_d_asa/contract.py:913 + // smart_contracts/base_d_asa/contract.py:912 // suspended=arc4.Bool(bool(self.suspended)), intc_0 // 0 bytec 20 // "suspended" @@ -3963,7 +3960,7 @@ get_asset_info: intc_0 // 0 uncover 2 setbit - // smart_contracts/base_d_asa/contract.py:914 + // smart_contracts/base_d_asa/contract.py:913 // defaulted=arc4.Bool(bool(self.defaulted)), intc_0 // 0 bytec 21 // "defaulted" @@ -3973,9 +3970,10 @@ get_asset_info: intc_0 // 0 uncover 2 setbit - // smart_contracts/base_d_asa/contract.py:897-915 + // smart_contracts/base_d_asa/contract.py:895-914 // return typ.AssetInfo( // denomination_asset_id=arc4.UInt64(self.denomination_asset_id), + // settlement_asset_id=arc4.UInt64(self.settlement_asset_id), // outstanding_principal=arc4.UInt64(self.circulating_units * self.unit_value), // unit_value=arc4.UInt64(self.unit_value), // day_count_convention=arc4.UInt8(self.day_count_convention), @@ -3993,7 +3991,9 @@ get_asset_info: // suspended=arc4.Bool(bool(self.suspended)), // defaulted=arc4.Bool(bool(self.defaulted)), // ) - uncover 12 + uncover 13 + uncover 13 + concat uncover 12 concat uncover 11 @@ -4019,7 +4019,7 @@ get_asset_info: swap intc_0 // 0 getbit - pushint 601 // 601 + pushint 665 // 665 swap setbit retsub @@ -4027,7 +4027,7 @@ get_asset_info: // smart_contracts.base_d_asa.contract.BaseDAsa.get_account_info(holding_address: bytes) -> bytes: get_account_info: - // smart_contracts/base_d_asa/contract.py:917-918 + // smart_contracts/base_d_asa/contract.py:916-917 // @arc4.abimethod(readonly=True) // def get_account_info(self, holding_address: arc4.Address) -> typ.AccountInfo: proto 1 1 @@ -4040,7 +4040,7 @@ get_account_info: box_len bury 1 assert // Invalid account holding address - // smart_contracts/base_d_asa/contract.py:932 + // smart_contracts/base_d_asa/contract.py:931 // return self.account[holding_address] box_get assert // check self.account entry exists @@ -4049,11 +4049,11 @@ get_account_info: // smart_contracts.base_d_asa.contract.BaseDAsa.get_time_events() -> bytes: get_time_events: - // smart_contracts/base_d_asa/contract.py:934-935 + // smart_contracts/base_d_asa/contract.py:933-934 // @arc4.abimethod(readonly=True) // def get_time_events(self) -> typ.TimeEvents: proto 0 1 - // smart_contracts/base_d_asa/contract.py:942 + // smart_contracts/base_d_asa/contract.py:941 // time_events = typ.TimeEvents() pushbytes 0x0000 // smart_contracts/base_d_asa/contract.py:101 @@ -4064,10 +4064,10 @@ get_time_events: assert // check self.status exists intc_2 // 100 == - // smart_contracts/base_d_asa/contract.py:943 + // smart_contracts/base_d_asa/contract.py:942 // if self.status_is_active(): bz get_time_events_after_if_else@2 - // smart_contracts/base_d_asa/contract.py:944 + // smart_contracts/base_d_asa/contract.py:943 // time_events = self.time_events.value.copy() bytec 23 // 0x74696d654576656e7473 box_get @@ -4076,7 +4076,7 @@ get_time_events: assert // check self.time_events exists get_time_events_after_if_else@2: - // smart_contracts/base_d_asa/contract.py:945 + // smart_contracts/base_d_asa/contract.py:944 // return time_events frame_dig 0 swap @@ -4085,25 +4085,25 @@ get_time_events_after_if_else@2: // smart_contracts.base_d_asa.contract.BaseDAsa.get_secondary_market_schedule() -> bytes: get_secondary_market_schedule: - // smart_contracts/base_d_asa/contract.py:947-948 + // smart_contracts/base_d_asa/contract.py:946-947 // @arc4.abimethod(readonly=True) // def get_secondary_market_schedule(self) -> typ.TimeEvents: proto 0 1 - // smart_contracts/base_d_asa/contract.py:950 + // smart_contracts/base_d_asa/contract.py:955 // arc4.UInt64(self.secondary_market_opening_date), intc_0 // 0 bytec 15 // "secondary_market_opening_date" app_global_get_ex assert // check self.secondary_market_opening_date exists itob - // smart_contracts/base_d_asa/contract.py:951 + // smart_contracts/base_d_asa/contract.py:956 // arc4.UInt64(self.secondary_market_closure_date), intc_0 // 0 bytec 16 // "secondary_market_closure_date" app_global_get_ex assert // check self.secondary_market_closure_date exists itob - // smart_contracts/base_d_asa/contract.py:949-952 + // smart_contracts/base_d_asa/contract.py:954-957 // return typ.TimeEvents( // arc4.UInt64(self.secondary_market_opening_date), // arc4.UInt64(self.secondary_market_closure_date), @@ -4117,11 +4117,11 @@ get_secondary_market_schedule: // smart_contracts.base_d_asa.contract.BaseDAsa.get_asset_metadata() -> bytes: get_asset_metadata: - // smart_contracts/base_d_asa/contract.py:954-955 + // smart_contracts/base_d_asa/contract.py:959-960 // @arc4.abimethod(readonly=True) // def get_asset_metadata(self) -> typ.AssetMetadata: proto 0 1 - // smart_contracts/base_d_asa/contract.py:956 + // smart_contracts/base_d_asa/contract.py:967 // return typ.AssetMetadata(self.metadata) intc_0 // 0 bytec 22 // "metadata" @@ -4138,11 +4138,11 @@ get_asset_metadata: // smart_contracts.base_d_asa.contract.BaseDAsa.asset_update() -> void: asset_update: - // smart_contracts/base_d_asa/contract.py:466-467 + // smart_contracts/base_d_asa/contract.py:464-465 // @arc4.baremethod(allow_actions=["UpdateApplication"]) // def asset_update(self) -> None: proto 0 0 - // smart_contracts/base_d_asa/contract.py:471-474 + // smart_contracts/base_d_asa/contract.py:469-472 // # The reference implementation grants the update permissions to the Arranger. // # Other implementations may disable D-ASA application updatability or change its authorizations. // # ⚠️ WARNING: Application updates must be executed VERY carefully, as they might introduce breaking changes. diff --git a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc32.json b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc32.json index 1b30930..ea159fc 100644 --- a/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc32.json +++ b/smart_contracts/artifacts/zero_coupon_bond/ZeroCouponBond.arc32.json @@ -145,7 +145,7 @@ "no_op": "CALL" } }, - "get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)": { + "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)": { "read_only": true, "call_config": { "no_op": "CALL" @@ -158,6 +158,10 @@ "denomination_asset_id", "uint64" ], + [ + "settlement_asset_id", + "uint64" + ], [ "outstanding_principal", "uint64" @@ -263,7 +267,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMTAwIDggNDQ4IDEwMDAwIDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjaXJjdWxhdGluZ191bml0cyIgMHg1MjMzMzAyMyAic3RhdHVzIiAibWF0dXJpdHlfZGF0ZSIgImlzc3VhbmNlX2RhdGUiIDB4MDAwMDAwMDAwMDAwMDAwMCAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAiaW50ZXJlc3RfcmF0ZSIgInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIgMHgwMCAidW5pdF92YWx1ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAidG90YWxfdW5pdHMiICJ0b3RhbF9jb3Vwb25zIiAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIgMHg1MjMyMzAyMyAic2V0dGxlbWVudF9hc3NldF9pZCIgInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIgInN1c3BlbmRlZCIgImRlZmF1bHRlZCIgIm1ldGFkYXRhIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczIDB4MDY4MTAxIDB4NTIzODMwMjMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyAjIFJvbGUgQmFzZWQgQWNjZXNzIENvbnRyb2wKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTcgLy8gMHg1MjMyMzAyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTktNjAKICAgIC8vICMgQXNzZXQgQ29uZmlndXJhdGlvbgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgNyAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDE4IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MgogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJ1bml0X3ZhbHVlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MwogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyAjIE1ldGFkYXRhCiAgICAvLyBzZWxmLm1ldGFkYXRhID0gQnl0ZXMoKQogICAgYnl0ZWMgMjIgLy8gIm1ldGFkYXRhIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgtNjkKICAgIC8vICMgU3VwcGx5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgOCAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzcKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODktOTAKICAgIC8vICMgU3RhdHVzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VNUFRZKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MQogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gInN1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDIxIC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1LTM2CiAgICAvLyAjIFN0YXRlIHNjaGVtYSB2YWxpZGF0aW9uCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MzcKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDE3IC8vIDE3CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MzkKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMjUKICAgIHB1c2hieXRlc3MgMHg0ZmQ2YTNjYyAweDljNzZiNmEzIDB4NDQzNjNkNDkgMHg2N2RiNGYyMCAweDYzZjk5NTg5IDB4ZDNhNGQ2YWIgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHgzMDFkZDkxOSAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGRkY2VjMDdiIC8vIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2V0X2NyZWF0ZShhZGRyZXNzLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTZbXSx1aW50NjRbXSwodWludDY0LHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHVpbnQ2NFtdKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiYXNzaWduX3JvbGUoYWRkcmVzcyx1aW50OCxieXRlW10pdWludDY0IiwgbWV0aG9kICJyZXZva2Vfcm9sZShhZGRyZXNzLHVpbnQ4KXVpbnQ2NCIsIG1ldGhvZCAib3Blbl9hY2NvdW50KGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImNsb3NlX2FjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAic2V0X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9hY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2RlZmF1bHRfc3RhdHVzKGJvb2wpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sKSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9ldmVudHMoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpdWludDY0W10iLCBtZXRob2QgImdldF9hc3NldF9tZXRhZGF0YSgpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1IG1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA2IG1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA3IG1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDggbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAOSBtYWluX2Fzc2V0X2NvbmZpZ19yb3V0ZUAxMCBtYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAMTEgbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUAxMiBtYWluX3Jldm9rZV9yb2xlX3JvdXRlQDEzIG1haW5fb3Blbl9hY2NvdW50X3JvdXRlQDE0IG1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxNSBtYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDE2IG1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMTcgbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDE4IG1haW5fc2V0X2RlZmF1bHRfc3RhdHVzX3JvdXRlQDE5IG1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMjAgbWFpbl9nZXRfYWNjb3VudF9pbmZvX3JvdXRlQDIxIG1haW5fZ2V0X3RpbWVfZXZlbnRzX3JvdXRlQDIyIG1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMjMgbWFpbl9nZXRfYXNzZXRfbWV0YWRhdGFfcm91dGVAMjQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21ldGFkYXRhCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF9pbmZvX3JvdXRlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfZGVmYXVsdF9zdGF0dXMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHByaW1hcnlfZGlzdHJpYnV0aW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY2xvc2VfYWNjb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHJldm9rZV9yb2xlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2lnbl9yb2xlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jb25maWdfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfY29uZmlnCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X2NyZWF0ZV9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgYXNzZXRfY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9wYXltZW50X2Ftb3VudF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9wYXltZW50X2Ftb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wYXlfcHJpbmNpcGFsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGF5X3ByaW5jaXBhbAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIG1haW5fYXNzZXRfdXBkYXRlQDI2CiAgICBiIG1haW5fYWZ0ZXJfaWZfZWxzZUAyNwoKbWFpbl9hc3NldF91cGRhdGVAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjYKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2Ni00NjcKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgYXNzZXRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBjYWxsc3ViIGFzc2V0X3VwZGF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy56ZXJvX2NvdXBvbl9ib25kLmNvbnRyYWN0Llplcm9Db3Vwb25Cb25kLmFzc2V0X3RyYW5zZmVyKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NldF90cmFuc2ZlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojc1LTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF90cmFuc2ZlcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICB1bml0czogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTA1CiAgICAvLyB1bml0cy5uYXRpdmUsCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTMtMjk2CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk1CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk2CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTYKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NS0yOTYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyA0CiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk2CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkyLTI5NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjktMzcxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLm5hdGl2ZSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzIKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzczCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlLCBlcnIuU1VTUEVOREVECiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3Ny0zNzkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5zdXNwZW5kZWQubmF0aXZlLCBlcnIuU1VTUEVOREVECiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODEKICAgIC8vIHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIDUKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODAtMzgyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICksIGVyci5PVkVSX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzkwCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTEKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSA+IDA6CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnogYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDQKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA1CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNAogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDMtMzA2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLk5PTl9GVU5HSUJMRV9VTklUUwogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgdW5pdHMgYXJlIG5vdCBmdW5naWJsZQoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwOC0xMDkKICAgIC8vICMgVHJhbnNmZXJyZWQgdW5pdHMgdmFsdWUgKG11c3QgYmUgY29tcHV0ZWQgYmVmb3JlIHRoZSB0cmFuc2ZlcikKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjExMC0xMTIKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNwogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMgogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI2LTQyOAogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjYKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjYtNDI4CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDMwCiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI5LTQzMQogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI5CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjktNDMxCiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzUzCiAgICAvLyBpZiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPT0gMDoKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDYgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiA0MAogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gYXJjNC5VSW50NjQoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0Cgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE3CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQodW5pdHMubmF0aXZlICogc2VuZGVyX3VuaXRfdmFsdWUubmF0aXZlICsgYWNjcnVlZF9pbnRlcmVzdCkKICAgIGZyYW1lX2RpZyAwCiAgICBidG9pCiAgICBmcmFtZV9kaWcgNQogICAgKgogICAgZnJhbWVfZGlnIDMKICAgICsKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAxNQoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk2CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gc2VuZGVyX3VuaXRfdmFsdWUKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgcmVwbGFjZTIgNDAKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTctMzk5CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5wYWlkX2NvdXBvbnMKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5Ny0zOTkKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnBhaWRfY291cG9ucwogICAgc3dhcAogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNwoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2RlZmF1bHRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNy0xMDgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTExLTExMgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAic3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnplcm9fY291cG9uX2JvbmQuY29udHJhY3QuWmVyb0NvdXBvbkJvbmQuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NydWVkX2ludGVyZXN0X2Ftb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU5LTYyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NjMKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoKQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NAogICAgLy8gYWNjcnVlZF9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NQogICAgLy8gcHJpbmNpcGFsX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IubmF0aXZlCiAgICBzd2FwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjY4CiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjY3LTY4CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2Ny02OQogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgLy8gKiBhY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo3MQogICAgLy8gY3N0LkJQUyAqIHByaW5jaXBhbF9wZXJpb2QKICAgIGludGMgNSAvLyAxMDAwMAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2Ny03MgogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgLy8gKiBhY2NydWVkX3BlcmlvZAogICAgLy8gLy8gKAogICAgLy8gICAgIGNzdC5CUFMgKiBwcmluY2lwYWxfcGVyaW9kCiAgICAvLyApICAjIGRpdi1ieS16ZXJvOiBwcmluY2lwYWxfcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQgY2hlY2tzCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2Ni03MwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgLy8gICAgICogYWNjcnVlZF9wZXJpb2QKICAgIC8vICAgICAvLyAoCiAgICAvLyAgICAgICAgIGNzdC5CUFMgKiBwcmluY2lwYWxfcGVyaW9kCiAgICAvLyAgICAgKSAgIyBkaXYtYnktemVybzogcHJpbmNpcGFsX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkIGNoZWNrcwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnplcm9fY291cG9uX2JvbmQuY29udHJhY3QuWmVyb0NvdXBvbkJvbmQuZGF5X2NvdW50X2ZhY3RvcigpIC0+IGJ5dGVzOgpkYXlfY291bnRfZmFjdG9yOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NDEtNDIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZGF5X2NvdW50X2ZhY3RvcihzZWxmKSAtPiB0eXAuRGF5Q291bnRGYWN0b3I6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzLTQ0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFjY3J1ZWRfcGVyaW9kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgLSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAtCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBwcmluY2lwYWxfcGVyaW9kID0gc2VsZi5tYXR1cml0eV9kYXRlIC0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC0KICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NDYKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPT0gVUludDY0KGNzdC5EQ0NfQV9BKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpbnRjXzIgLy8gMTAwCiAgICA9PQogICAgc3dhcAogICAgY292ZXIgMgogICAgYnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0OQogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfZGlnIDEKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9idXJ5IDMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1MAogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KGFjY3J1ZWRfcGVyaW9kKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChwcmluY2lwYWxfcGVyaW9kKSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQ5LTUyCiAgICAvLyByZXR1cm4gdHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChhY2NydWVkX3BlcmlvZCksCiAgICAvLyAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQocHJpbmNpcGFsX3BlcmlvZCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY291bnRfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzUtMzM4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzkKICAgIC8vIHJldHVybiB1bml0cyAqIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUubmF0aXZlCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5wYXlfcHJpbmNpcGFsKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfaW5mbzogYnl0ZXMpIC0+IGJ5dGVzOgpwYXlfcHJpbmNpcGFsOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE5LTEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X3ByaW5jaXBhbCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzNi00MzcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZXN0cmljdCBjYWxsZXIgYXV0aG9yaXphdGlvbgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzOAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0MQogICAgLy8gdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0MgogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5PX1VOSVRTCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0MwogICAgLy8gYXNzZXJ0IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYubWF0dXJpdHlfZGF0ZSwgZXJyLk5PVF9NQVRVUkUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBtYXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTIKICAgIC8vIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTEtMzEzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgLy8gICAgIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMS0zMTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUKICAgIGJ6IHBheV9wcmluY2lwYWxfYm9vbF9mYWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE0CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50YyA0IC8vIDQ0OAogICAgZ2V0Yml0CiAgICBieXRlYyAxMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJueiBwYXlfcHJpbmNpcGFsX2Jvb2xfZmFsc2VAMTYKICAgIGludGNfMSAvLyAxCgpwYXlfcHJpbmNpcGFsX2Jvb2xfbWVyZ2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDQKICAgIC8vIGlmIHNlbGYuaXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBieiBwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyMAogICAgLy8gQXNzZXQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLmJhbGFuY2UoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyMC0zMjIKICAgIC8vIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5iYWxhbmNlKAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzIwLTMyMwogICAgLy8gQXNzZXQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLmJhbGFuY2UoCiAgICAvLyAgICAgR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE5LTMyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBBc3NldChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCkuYmFsYW5jZSgKICAgIC8vICAgICAgICAgR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gICAgICkKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgc2FtZSBhc3NldCBmb3IgZGVub21pbmF0aW9uIGFuZCBzZXR0bGVtZW50LCBubyBjb252ZXJzaW9uIG5lZWRlZAogICAgLy8gc2VsZi5wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCBwYXltZW50X2Ftb3VudCkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI4LTMzMwogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLm5hdGl2ZSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzIKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjkKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI4CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjgtMzMzCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwYXlfcHJpbmNpcGFsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1MAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAtCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDMyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTIKICAgIC8vIHNlbGYuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkKICAgIGNhbGxzdWIgZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNTYKICAgIC8vIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNTcKICAgIC8vIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNTUtMTU5CiAgICAvLyByZXR1cm4gdHlwLlBheW1lbnRSZXN1bHQoCiAgICAvLyAgICAgYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIC8vICAgICB0aW1lc3RhbXA9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgLy8gICAgIGNvbnRleHQ9cGF5bWVudF9pbmZvLmNvcHkoKSwgICMgVE9ETzogQWRkIGluZm8gb24gZmFpbGVkIHBheW1lbnQKICAgIC8vICkKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAxMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgpwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTUxLTE1MgogICAgLy8gIyBBY2NvdW50cyBzdXNwZW5kZWQgb3Igbm90IG9wdGVkIGluIGF0IHRoZSB0aW1lIG9mIHBheW1lbnRzIG11c3Qgbm90IHN0YWxsIHRoZSBELUFTQQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDMKCnBheV9wcmluY2lwYWxfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9wcmluY2lwYWxfYm9vbF9tZXJnZUAxNwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdWludDY0OgphY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQxLTM0MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0NAogICAgLy8gaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDMtMzQ1CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkgLT4gdm9pZDoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU3LTM1OAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU5CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IDA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBibnogZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzYwCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50YyA3IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNjEtMTY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlOgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTgxLTE4MgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODEtMTgyCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTgwLTE4MwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwgZXJyLk5PX1BSSU1BUllfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gbm90IHlldCBleGVjdXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg2CiAgICAvLyAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjIDYgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDcKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBiPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODUtMTg3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIDAgPCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1VOSVRTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhbW91bnQgb2YgdW5pdHMgZm9yIHRoZSBhY2NvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOTAKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODktMTkxCiAgICAvLyBhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUgPSBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTkzCiAgICAvLyBhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUgKiBzZWxmLmludGVyZXN0X3JhdGUgLy8gY3N0LkJQUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIGRpZyAxCiAgICAqCiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlIC0gYWNjb3VudF91bml0c19kaXNjb3VudAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTk2LTE5OQogICAgLy8gIyBWYWx1ZSBkdXJpbmcgcHJpbWFyeSBkaXN0cmlidXRpb24KICAgIC8vIGFjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSA9ICgKICAgIC8vICAgICBhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUgLSBhY2NvdW50X3VuaXRzX2Rpc2NvdW50CiAgICAvLyApCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwMS0yMDIKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uIGFuZCBhdCBtYXR1cml0eQogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDMKICAgIC8vIG51bWVyYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDQKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU2LTU3CiAgICAvLyAjIFRoZSBjaGVjayBvbiBtYXR1cml0eSBkYXRlIGVuc3VyZXMgRC1BU0EgaGFzIGJlZW4gY29uZmlndXJlZCBhcyBibG9jayB0aW1lc3RhbXAgY2Fubm90IGJlIGxlc3MgdGhhbiAwIChpbml0KS4KICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgPD0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAxNgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyA0CiAgICA+CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMTYKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDYtMjA3CiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0CiAgICAvLyBpZiBzZWxmLmlzX2FjY3J1aW5nX2ludGVyZXN0KCk6CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcigpCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwOS0yMTEKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyA3CiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIxMgogICAgLy8gbnVtZXJhdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTMKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSA1CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTUtMjE2CiAgICAvLyAjIFZhbHVlIGF0IG1hdHVyaXR5CiAgICAvLyBpZiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGU6CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjIwCiAgICAvLyB1bml0c192YWx1ZT1hcmM0LlVJbnQ2NChhY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUpLAogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIGZyYW1lX2RpZyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjMKICAgIC8vIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgZnJhbWVfZGlnIDYKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDUKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyMi0yMjUKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICksCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIxOS0yMjYKICAgIC8vIHJldHVybiB0eXAuQ3VycmVudFVuaXRzVmFsdWUoCiAgICAvLyAgICAgdW5pdHNfdmFsdWU9YXJjNC5VSW50NjQoYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PWFyYzQuVUludDY0KGFjY3J1ZWRfaW50ZXJlc3QpLAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUAxNwoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAOAoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy56ZXJvX2NvdXBvbl9ib25kLmNvbnRyYWN0Llplcm9Db3Vwb25Cb25kLmdldF9wYXltZW50X2Ftb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3BheW1lbnRfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjI4LTIyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3BheW1lbnRfYW1vdW50KHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiB0eXAuUGF5bWVudEFtb3VudHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQ0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDgKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHByaW5jaXBhbF9hbW91bnQgKiBzZWxmLmludGVyZXN0X3JhdGUgLy8gY3N0LkJQUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgICoKICAgIGludGMgNSAvLyAxMDAwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCgpnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjUwCiAgICAvLyBpbnRlcmVzdD1hcmM0LlVJbnQ2NChpbnRlcmVzdF9hbW91bnQpLAogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gcHJpbmNpcGFsPWFyYzQuVUludDY0KHByaW5jaXBhbF9hbW91bnQpLAogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0OS0yNTIKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9YXJjNC5VSW50NjQoaW50ZXJlc3RfYW1vdW50KSwKICAgIC8vICAgICBwcmluY2lwYWw9YXJjNC5VSW50NjQocHJpbmNpcGFsX2Ftb3VudCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfY3JlYXRlKGFycmFuZ2VyOiBieXRlcywgbWV0YWRhdGE6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jcmVhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTQtNDU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBhc3NldF9jcmVhdGUoc2VsZiwgYXJyYW5nZXI6IGFyYzQuQWRkcmVzcywgbWV0YWRhdGE6IHR5cC5Bc3NldE1ldGFkYXRhKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjMKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlci5uYXRpdmUKICAgIGJ5dGVjIDE3IC8vIDB4NTIzMjMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NAogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgMjIgLy8gIm1ldGFkYXRhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NvbmZpZyhkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGJ5dGVzLCBzZXR0bGVtZW50X2Fzc2V0X2lkOiBieXRlcywgcHJpbmNpcGFsOiBieXRlcywgbWluaW11bV9kZW5vbWluYXRpb246IGJ5dGVzLCBkYXlfY291bnRfY29udmVudGlvbjogYnl0ZXMsIGludGVyZXN0X3JhdGU6IGJ5dGVzLCBjb3Vwb25fcmF0ZXM6IGJ5dGVzLCB0aW1lX2V2ZW50czogYnl0ZXMsIHRpbWVfcGVyaW9kczogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NvbmZpZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3Ni00ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X2NvbmZpZygKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb246IGFyYzQuVUludDgsCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZTogYXJjNC5VSW50MTYsCiAgICAvLyAgICAgY291cG9uX3JhdGVzOiB0eXAuQ291cG9uUmF0ZXMsCiAgICAvLyAgICAgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzLAogICAgLy8gICAgIHRpbWVfcGVyaW9kczogdHlwLlRpbWVQZXJpb2RzLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gOSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUxNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTE4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTVBUWSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjAtNTIxCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC05CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gZGVub21pbmF0aW9uX2Fzc2V0X2lkICE9IFVJbnQ2NCgwKSBhbmQgQXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5jcmVhdG9yCiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUA0CiAgICBmcmFtZV9kaWcgMwogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc1LTE3OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBkZW5vbWluYXRpb24gd2l0aCBBU0EKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZGVub21pbmF0aW9uX2Fzc2V0X2lkICE9IFVJbnQ2NCgwKSBhbmQgQXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5jcmVhdG9yCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBEZW5vbWluYXRpb24gYXNzZXQgaXMgbm90IHByb3Blcmx5IHNldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTgyCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IGRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgYnl0ZWMgNyAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjQtNTI1CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTgKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICBkaWcgMQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4Ni0xODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE4IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0yMDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NgogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NwogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTgKICAgIC8vIGFzc2V0X2Ftb3VudD0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0xOTUKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk0LTIwMAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMAogICAgLy8gcHJpbmNpcGFsLm5hdGl2ZSAlIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZSA9PSAwCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtNgogICAgYnRvaQogICAgZHVwMgogICAgJQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI4LTUzMQogICAgLy8gIyBTZXQgUHJpbmNpcGFsIGFuZCBNaW5pbXVtIERlbm9taW5hdGlvbgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIC8vICksIGVyci5JTlZBTElEX01JTklNVU1fREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gTWluaW11bSBkZW5vbWluYXRpb24gaXMgbm90IGEgZGl2aXNvciBvZiBwcmluY2lwYWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMgogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlCiAgICBieXRlYyAxMSAvLyAidW5pdF92YWx1ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gcHJpbmNpcGFsLm5hdGl2ZSAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIC8KICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzUtNTM2CiAgICAvLyAjIFNldCBEYXktQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5hc3NlcnRfZGF5X2NvdW50X2NvbnZlbnRpb24oZGF5X2NvdW50X2NvbnZlbnRpb24ubmF0aXZlKQogICAgZnJhbWVfZGlnIC01CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA2CiAgICAvLyBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgaW50Y18yIC8vIDEwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA0LTIwOAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJueiBhc3NldF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBmcmFtZV9kaWcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA3CiAgICAvLyBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIHB1c2hpbnQgMjU1IC8vIDI1NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA0LTIwOAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3Cgphc3NldF9jb25maWdfYm9vbF90cnVlQDE2OgogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA0LTIwOAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIxMgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IGRheV9jb3VudF9jb252ZW50aW9uCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBmcmFtZV9kaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzOS01NDAKICAgIC8vICMgU2V0IEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYuYXNzZXJ0X2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZS5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gYXNzZXJ0IGludGVyZXN0X3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludGVyZXN0IHJhdGUgaXMgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOCAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjQKICAgIC8vIGFzc2VydCBub3QgY291cG9uX3JhdGVzLmxlbmd0aCwgZXJyLklOVkFMSURfQ09VUE9OX1JBVEVTCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICAhCiAgICBhc3NlcnQgLy8gQ291cG9uIHJhdGVzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI4CiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBjb3Vwb25fcmF0ZXMubGVuZ3RoCiAgICBieXRlYyAxNCAvLyAidG90YWxfY291cG9ucyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjkKICAgIC8vIGlmIHNlbGYudG90YWxfY291cG9uczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAyOCAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjggLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9wdXQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM1CiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNC0yMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUwogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0OQogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gc2VsZi50aW1lX2V2ZW50cy52YWx1ZSA9IHRpbWVfZXZlbnRzLmNvcHkoKQogICAgYnl0ZWMgMjMgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAyMyAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MS0yNjMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MS0yNjMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0LTI2NgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjQKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0LTI2NgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjcKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5JU1NVQU5DRV9EQVRFX0lEWF0ubmF0aXZlCiAgICBleHRyYWN0IDE2IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OS0yNzAKICAgIC8vICMgU29tZSBELUFTQSBtYXkgbm90IGhhdmUgYSBtYXR1cml0eSBkYXRlIChlLmcuLCBwZXJwZXR1YWxzKQogICAgLy8gaWYgdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUzoKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzEKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gYXNzZXJ0IG5vdCB0aW1lX3BlcmlvZHMubGVuZ3RoLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU2CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGludGNfMiAvLyAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTUtMTE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM4LTIzOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlbGYsIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cykgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MQogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MgogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQxLTI0MgogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQwLTI0MwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyAgICAgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRQogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDAKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ0CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4OgogICAgcHVzaGludCA3NSAvLyA3NQogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxNAogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDI5IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMjkgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ5CiAgICAvLyB0aW1lX2kgPSB0aW1lX2V2ZW50c1tfdF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gdGltZV9mID0gdGltZV9ldmVudHNbX3QgKyAxXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTEKICAgIC8vIGFzc2VydCB0aW1lX2YgPiB0aW1lX2ksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiAhPSBVSW50NjQoY3N0LkRDQ19DT05UKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBwdXNoaW50IDI1NSAvLyAyNTUKICAgICE9CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUzLTI1NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUzLTI1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIC8vICAgICBjc3QuREFZXzJfU0VDCiAgICAvLyApID09IDAsIGVyci5JTlZBTElEX1RJTUVfUEVSSU9ECiAgICBpbnRjIDYgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTgtNTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU3OQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDcgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4MwogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODQKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODUKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODcKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4OC01OTAKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4Ny01OTAKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODYtNTkxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTItNTk0CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NQogICAgLy8gaWYgc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OQogICAgLy8gY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OC02MDAKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5Ny02MDAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYtNjAxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDItNjA0CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA3CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA2LTYwOAogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOS02MTEKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDUtNjEyCiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNC02MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzcKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM4CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzOQogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0MQogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0MgogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ2CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDUtNjc0CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OAogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzAgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjctNjY5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3MQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjcwLTY3MgogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNCAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjUKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNSAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjIKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU2CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1OAogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3LTY1OQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTAKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5LTY1MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTMKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1Mi02NTQKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ3CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgMTcgLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NpZ25fcm9sZV9ib29sX21lcmdlQDgKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5yZXZva2Vfcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcykgLT4gYnl0ZXM6CnJldm9rZV9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc3LTY3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmV2b2tlX3JvbGUoc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTcKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk4CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk3LTcwMwogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2CgpyZXZva2Vfcm9sZV9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgpyZXZva2Vfcm9sZV9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDUtNzA2CiAgICAvLyAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAgLy8gNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDQtNzIyCiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAOCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDkgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMCAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjAKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNCAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTcKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjUgLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE0CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTAKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTEKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjcgLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIHJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLm9wZW5fYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKb3Blbl9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1LTcyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3Blbl9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ1CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA3IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUzCiAgICAvLyB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgNiAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MS03NTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTQKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDYgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU1CiAgICAvLyBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDYgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU2CiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICBieXRlYyAxMCAvLyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU4CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE5LTEyMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIzLTEyNgogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNC0xMjUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQtMTI2CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNS0xMjYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQtMTI2CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuY2xvc2VfYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKY2xvc2VfYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2MC03NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5UdXBsZVthcmM0LlVJbnQ2NCwgYXJjNC5VSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzc5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODIKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzgzCiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVCArIGhvbGRpbmdfYWRkcmVzcy5ieXRlcykKICAgIHN3YXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg0CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IGNsb3NlZF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgIC0KICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4NQogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4NwogICAgLy8gKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIGl0b2IKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4Ni03ODgKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKAogICAgLy8gICAgIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICAvLyApCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnByaW1hcnlfZGlzdHJpYnV0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkwLTc5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcHJpbWFyeV9kaXN0cmlidXRpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg0LTI4NwogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NS0yODYKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg3CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg2LTI4NwogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg3CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODMtMjg4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzMKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBieXRlYyAyNiAvLyAweDUyMzUzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzMtMTM2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM1CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNS0xMzYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNC0xMzYKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzItMTM3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgxOAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIwCiAgICAvLyBhc3NlcnQgdW5pdHMubmF0aXZlID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyMgogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjEtODIzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI1CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICs9IHVuaXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNi04MjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNi04MjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IGFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBzd2FwCiAgICByZXBsYWNlMiA0MAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMwCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyAtIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgLQogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYXNzZXRfc3VzcGVuc2lvbihzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzItODMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYXNzZXRfc3VzcGVuc2lvbihzZWxmLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0NgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDcKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KHN1c3BlbmRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDIwIC8vICJzdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ5LTE1MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGJ5dGVjIDI0IC8vIDB4NTIzNzMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzLTE1NgogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NC0xNTUKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU2CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NS0xNTYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU2CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUyLTE1NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vICAgICBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2FjY291bnRfc3VzcGVuc2lvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2FjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1MC04NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hY2NvdW50X3N1c3BlbnNpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHN1c3BlbmRlZDogYXJjNC5Cb29sCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGludGMgNCAvLyA0NDgKICAgIHN3YXAKICAgIHNldGJpdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfZGVmYXVsdF9zdGF0dXMoZGVmYXVsdGVkOiBieXRlcykgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODczLTg3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2RlZmF1bHRfc3RhdHVzKHNlbGYsIGRlZmF1bHRlZDogYXJjNC5Cb29sKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBieXRlYyAyNSAvLyAweDUyMzYzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDMtMTQ2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1LTE0NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Mi0xNDcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gICAgIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODUKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KGRlZmF1bHRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDIxIC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9pbmZvKCkgLT4gYnl0ZXM6CmdldF9hc3NldF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg3LTg4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2luZm8oc2VsZikgLT4gdHlwLkFzc2V0SW5mbzoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk4CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTkKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAwCiAgICAvLyB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMQogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAyCiAgICAvLyBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMwogICAgLy8gdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNAogICAgLy8gY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDUtOTA3CiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDgtOTEwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTEKICAgIC8vIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTIKICAgIC8vIG1hdHVyaXR5X2RhdGU9YXJjNC5VSW50NjQoc2VsZi5tYXR1cml0eV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTMKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTQKICAgIC8vIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIxIC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTctOTE1CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgLy8gKQogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBwdXNoaW50IDYwMSAvLyA2MDEKICAgIHN3YXAKICAgIHNldGJpdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNy05MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNC05MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQyCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIHB1c2hieXRlcyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDMKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ0CiAgICAvLyB0aW1lX2V2ZW50cyA9IHNlbGYudGltZV9ldmVudHMudmFsdWUuY29weSgpCiAgICBieXRlYyAyMyAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfZXZlbnRzIGV4aXN0cwoKZ2V0X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0NQogICAgLy8gcmV0dXJuIHRpbWVfZXZlbnRzCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKSAtPiBieXRlczoKZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDctOTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZShzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTUwCiAgICAvLyBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTEKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0OS05NTIKICAgIC8vIHJldHVybiB0eXAuVGltZUV2ZW50cygKICAgIC8vICAgICBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfbWV0YWRhdGEoKSAtPiBieXRlczoKZ2V0X2Fzc2V0X21ldGFkYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU0LTk1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21ldGFkYXRhKHNlbGYpIC0+IHR5cC5Bc3NldE1ldGFkYXRhOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTYKICAgIC8vIHJldHVybiB0eXAuQXNzZXRNZXRhZGF0YShzZWxmLm1ldGFkYXRhKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vICJtZXRhZGF0YSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZXRhZGF0YSBleGlzdHMKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF91cGRhdGUoKSAtPiB2b2lkOgphc3NldF91cGRhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjYtNDY3CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzEtNDc0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyBPdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IGRpc2FibGUgRC1BU0EgYXBwbGljYXRpb24gdXBkYXRhYmlsaXR5IG9yIGNoYW5nZSBpdHMgYXV0aG9yaXphdGlvbnMuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMTAwIDggNDQ4IDEwMDAwIDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjaXJjdWxhdGluZ191bml0cyIgMHg1MjMzMzAyMyAic3RhdHVzIiAibWF0dXJpdHlfZGF0ZSIgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpc3N1YW5jZV9kYXRlIiAweDAwMDAwMDAwMDAwMDAwMDAgImludGVyZXN0X3JhdGUiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiIDB4MDAgInVuaXRfdmFsdWUiICJkYXlfY291bnRfY29udmVudGlvbiIgInRvdGFsX3VuaXRzIiAidG90YWxfY291cG9ucyIgInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiIDB4NTIzMjMwMjMgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIgInN1c3BlbmRlZCIgImRlZmF1bHRlZCIgIm1ldGFkYXRhIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczIDB4MDY4MTAxIDB4NTIzODMwMjMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyAjIFJvbGUgQmFzZWQgQWNjZXNzIENvbnRyb2wKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTcgLy8gMHg1MjMyMzAyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTktNjAKICAgIC8vICMgQXNzZXQgQ29uZmlndXJhdGlvbgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMTggLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MgogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJ1bml0X3ZhbHVlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MwogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyAjIE1ldGFkYXRhCiAgICAvLyBzZWxmLm1ldGFkYXRhID0gQnl0ZXMoKQogICAgYnl0ZWMgMjIgLy8gIm1ldGFkYXRhIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgtNjkKICAgIC8vICMgU3VwcGx5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgOCAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzcKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODktOTAKICAgIC8vICMgU3RhdHVzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VNUFRZKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MQogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gInN1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDIxIC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1LTM2CiAgICAvLyAjIFN0YXRlIHNjaGVtYSB2YWxpZGF0aW9uCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MzcKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDE3IC8vIDE3CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MzkKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMjUKICAgIHB1c2hieXRlc3MgMHg0ZmQ2YTNjYyAweDljNzZiNmEzIDB4NDQzNjNkNDkgMHg2N2RiNGYyMCAweDYzZjk5NTg5IDB4ZDNhNGQ2YWIgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHg4MGJmY2RkMSAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGRkY2VjMDdiIC8vIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2V0X2NyZWF0ZShhZGRyZXNzLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTZbXSx1aW50NjRbXSwodWludDY0LHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHVpbnQ2NFtdKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiYXNzaWduX3JvbGUoYWRkcmVzcyx1aW50OCxieXRlW10pdWludDY0IiwgbWV0aG9kICJyZXZva2Vfcm9sZShhZGRyZXNzLHVpbnQ4KXVpbnQ2NCIsIG1ldGhvZCAib3Blbl9hY2NvdW50KGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImNsb3NlX2FjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAic2V0X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9hY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2RlZmF1bHRfc3RhdHVzKGJvb2wpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsYm9vbCkiLCBtZXRob2QgImdldF9hY2NvdW50X2luZm8oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sKSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKWJ5dGVbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fYXNzZXRfdHJhbnNmZXJfcm91dGVANSBtYWluX3BheV9wcmluY2lwYWxfcm91dGVANiBtYWluX2dldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfcm91dGVANyBtYWluX2dldF9wYXltZW50X2Ftb3VudF9yb3V0ZUA4IG1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDkgbWFpbl9hc3NldF9jb25maWdfcm91dGVAMTAgbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDExIG1haW5fYXNzaWduX3JvbGVfcm91dGVAMTIgbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUAxMyBtYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxNCBtYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTUgbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxNiBtYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDE3IG1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAxOCBtYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxOSBtYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDIwIG1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAyMSBtYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAyMiBtYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDIzIG1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDI0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWV0YWRhdGFfcm91dGVAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9tZXRhZGF0YQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3RpbWVfZXZlbnRzX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYWNjb3VudF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfaW5mbwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2RlZmF1bHRfc3RhdHVzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2FjY291bnRfc3VzcGVuc2lvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYXNzZXRfc3VzcGVuc2lvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNsb3NlX2FjY291bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fb3Blbl9hY2NvdW50X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG9wZW5fYWNjb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiByZXZva2Vfcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NpZ25fcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2V0X2NvbmZpZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGFzc2V0X2NyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfcGF5bWVudF9hbW91bnRfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfcGF5bWVudF9hbW91bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjExOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHBheV9wcmluY2lwYWwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfdHJhbnNmZXJfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfdHJhbnNmZXIKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHB1c2hpbnQgNCAvLyA0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBtYWluX2Fzc2V0X3VwZGF0ZUAyNgogICAgYiBtYWluX2FmdGVyX2lmX2Vsc2VAMjcKCm1haW5fYXNzZXRfdXBkYXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjQtNDY1CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgY2FsbHN1YiBhc3NldF91cGRhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5hc3NldF90cmFuc2ZlcihzZW5kZXJfaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXRfdHJhbnNmZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo3NS04MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzZXRfdHJhbnNmZXIoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgICAgcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM6IGFyYzQuVUludDY0LAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gdW5pdHMubmF0aXZlLAogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkzLTI5NgogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NAogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0LTI5NQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0LTI5NgogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk2CiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTUtMjk2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBmcmFtZV9kaWcgNAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0LTI5NgogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5Mi0yOTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuU0VDT05EQVJZX01BUktFVF9DTE9TRUQKICAgIGFzc2VydCAvLyBTZWNvbmRhcnkgbWFya2V0IGlzIGNsb3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY3LTM2OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0cmFuc2ZlciByaWdodCB0byBELUFTQSBvd25lcnMuIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgcmVsYXkgb24gb3RoZXIKICAgIC8vICMgcm9sZXMsIGV4dGVybmFsIEFwcHMgdGhyb3VnaCBDMkMgY2FsbHMgKGUuZy4sIGFuIG9yZGVyIGJvb2spLCBvciBvZmYtY2hhaW4gdHJhbnNmZXIgYWdlbnRzLgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VuZGVyX2hvbGRpbmdfYWRkcmVzcy5uYXRpdmUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzcwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3NAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZSwgZXJyLlNVU1BFTkRFRAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzUtMzc3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0uc3VzcGVuZGVkLm5hdGl2ZSwgZXJyLlNVU1BFTkRFRAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50YyA0IC8vIDQ0OAogICAgZ2V0Yml0CiAgICBieXRlYyAxMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc5CiAgICAvLyB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyA1CiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc4LTM4MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4OAogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzg5CiAgICAvLyBpZiBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPiAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0LTMwNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0LTMwNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzAzLTMwNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gICAgIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5OT05fRlVOR0lCTEVfVU5JVFMKICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIHVuaXRzIGFyZSBub3QgZnVuZ2libGUKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMDgtMTA5CiAgICAvLyAjIFRyYW5zZmVycmVkIHVuaXRzIHZhbHVlIChtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSB0aGUgdHJhbnNmZXIpCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMTAtMTEyCiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gc2VsZi5hY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY292ZXIgMwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjUKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgLSB1bml0cwogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDIKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNC00MjYKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgLSB1bml0cwogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI0CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI0LTQyNgogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyOAogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICB1bmNvdmVyIDMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNy00MjkKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNwogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI3LTQyOQogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gaWYgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlID09IDA6CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYm56IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IGFyYzQuVUludDY0KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgNDAKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KCkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiA0OAogICAgYm94X3B1dAoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHVuaXRzLm5hdGl2ZSAqIHNlbmRlcl91bml0X3ZhbHVlLm5hdGl2ZSArIGFjY3J1ZWRfaW50ZXJlc3QpCiAgICBmcmFtZV9kaWcgMAogICAgYnRvaQogICAgZnJhbWVfZGlnIDUKICAgICoKICAgIGZyYW1lX2RpZyAzCiAgICArCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMTUKCmFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk1LTM5NwogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0ucGFpZF9jb3Vwb25zCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NQogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTUtMzk3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5wYWlkX2NvdXBvbnMKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0CiAgICBiIGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTcKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDctMTA4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIxIC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X3N1c3BlbmRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMS0xMTIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTEzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy56ZXJvX2NvdXBvbl9ib25kLmNvbnRyYWN0Llplcm9Db3Vwb25Cb25kLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1OS02MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKCkKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NjQKICAgIC8vIGFjY3J1ZWRfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NjUKICAgIC8vIHByaW5jaXBhbF9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NwogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2OAogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2Ny02OAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NjctNjkKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vICogYWNjcnVlZF9wZXJpb2QKICAgIHVuY292ZXIgMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzEKICAgIC8vIGNzdC5CUFMgKiBwcmluY2lwYWxfcGVyaW9kCiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIHVuY292ZXIgMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NjctNzIKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vICogYWNjcnVlZF9wZXJpb2QKICAgIC8vIC8vICgKICAgIC8vICAgICBjc3QuQlBTICogcHJpbmNpcGFsX3BlcmlvZAogICAgLy8gKSAgIyBkaXYtYnktemVybzogcHJpbmNpcGFsX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkIGNoZWNrcwogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NjYtNzMKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAgICAgKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vICAgICAqIGFjY3J1ZWRfcGVyaW9kCiAgICAvLyAgICAgLy8gKAogICAgLy8gICAgICAgICBjc3QuQlBTICogcHJpbmNpcGFsX3BlcmlvZAogICAgLy8gICAgICkgICMgZGl2LWJ5LXplcm86IHByaW5jaXBhbF9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCBjaGVja3MKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy56ZXJvX2NvdXBvbl9ib25kLmNvbnRyYWN0Llplcm9Db3Vwb25Cb25kLmRheV9jb3VudF9mYWN0b3IoKSAtPiBieXRlczoKZGF5X2NvdW50X2ZhY3RvcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGRheV9jb3VudF9mYWN0b3Ioc2VsZikgLT4gdHlwLkRheUNvdW50RmFjdG9yOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0My00NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhY2NydWVkX3BlcmlvZCA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIC0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0NQogICAgLy8gcHJpbmNpcGFsX3BlcmlvZCA9IHNlbGYubWF0dXJpdHlfZGF0ZSAtIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAtCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID09IFVJbnQ2NChjc3QuRENDX0FfQSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGJ6IGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDcKICAgIC8vIHJldHVybiB0aW1lX3BlcmlvZCAvLyBVSW50NjQoY3N0LkRBWV8yX1NFQykKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjIDYgLy8gODY0MDAKICAgIC8KICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjIDYgLy8gODY0MDAKICAgIC8KICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfYnVyeSAzCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NTAKICAgIC8vIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChhY2NydWVkX3BlcmlvZCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1MQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQocHJpbmNpcGFsX3BlcmlvZCksCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0OS01MgogICAgLy8gcmV0dXJuIHR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQoYWNjcnVlZF9wZXJpb2QpLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KHByaW5jaXBhbF9wZXJpb2QpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMzLTMzNgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzM3CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlLm5hdGl2ZQogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnplcm9fY291cG9uX2JvbmQuY29udHJhY3QuWmVyb0NvdXBvbkJvbmQucGF5X3ByaW5jaXBhbChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2luZm86IGJ5dGVzKSAtPiBieXRlczoKcGF5X3ByaW5jaXBhbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjExOS0xMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHBheV9wcmluY2lwYWwoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfaW5mbzogYXJjNC5EeW5hbWljQnl0ZXMKICAgIC8vICkgLT4gdHlwLlBheW1lbnRSZXN1bHQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzQtNDM1CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwbiAyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzkKICAgIC8vIHVuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDAKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5OT19VTklUUwogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDEKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGUsIGVyci5OT1RfTUFUVVJFCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgbWF0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzEyCiAgICAvLyBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzExLTMxMwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzExLTMxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUKICAgIGJ6IHBheV9wcmluY2lwYWxfYm9vbF9mYWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE0CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50YyA0IC8vIDQ0OAogICAgZ2V0Yml0CiAgICBieXRlYyAxMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJueiBwYXlfcHJpbmNpcGFsX2Jvb2xfZmFsc2VAMTYKICAgIGludGNfMSAvLyAxCgpwYXlfcHJpbmNpcGFsX2Jvb2xfbWVyZ2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDQKICAgIC8vIGlmIHNlbGYuaXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBieiBwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyMAogICAgLy8gQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKS5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzIwLTMyMQogICAgLy8gQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKS5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyA+PSBwYXltZW50X2Ftb3VudAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTktMzIyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDgtMTQ5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIHRoZSBzYW1lIGFzc2V0IGZvciBkZW5vbWluYXRpb24gYW5kIHNldHRsZW1lbnQsIG5vIGNvbnZlcnNpb24gbmVlZGVkCiAgICAvLyBzZWxmLnBheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHBheW1lbnRfYW1vdW50KQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjYtMzMxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzMAogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyNwogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyNgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI2LTMzMQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLm5hdGl2ZSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDgKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLQogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQ5CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KCkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiAzMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUwCiAgICAvLyBzZWxmLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpCiAgICBjYWxsc3ViIGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTU2CiAgICAvLyBhbW91bnQ9YXJjNC5VSW50NjQocGF5bWVudF9hbW91bnQpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTU3CiAgICAvLyB0aW1lc3RhbXA9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTU1LTE1OQogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICAvLyAgICAgdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mby5jb3B5KCksICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKcGF5X3ByaW5jaXBhbF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE1MS0xNTIKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUAzCgpwYXlfcHJpbmNpcGFsX2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwYXlfcHJpbmNpcGFsX2Jvb2xfbWVyZ2VAMTcKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKYWNjb3VudF90b3RhbF91bml0c192YWx1ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzOS0zNDAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWNjb3VudF90b3RhbF91bml0c192YWx1ZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDIKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQxLTM0MwogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpIC0+IHZvaWQ6CmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1NS0zNTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1NwogICAgLy8gaWYgc2VsZi5jaXJjdWxhdGluZ191bml0cyA9PSAwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgYm56IGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1OAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGludGMgNyAvLyAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CgplbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnplcm9fY291cG9uX2JvbmQuY29udHJhY3QuWmVyb0NvdXBvbkJvbmQuZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTYxLTE2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IHR5cC5DdXJyZW50VW5pdHNWYWx1ZToKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4MS0xODIKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODIKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTgxLTE4MgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4MC0xODMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksIGVyci5OT19QUklNQVJZX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4NgogICAgLy8gMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj4KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3CiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMQogICAgYj49CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANwogICAgaW50Y18xIC8vIDEKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg1LTE4NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9VTklUUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYW1vdW50IG9mIHVuaXRzIGZvciB0aGUgYWNjb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTkwCiAgICAvLyBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg5LTE5MQogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlID0gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlICogc2VsZi5pbnRlcmVzdF9yYXRlIC8vIGNzdC5CUFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgKgogICAgaW50YyA1IC8vIDEwMDAwCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOTgKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSAtIGFjY291bnRfdW5pdHNfZGlzY291bnQKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5Ni0xOTkKICAgIC8vICMgVmFsdWUgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uCiAgICAvLyBhY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUgPSAoCiAgICAvLyAgICAgYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlIC0gYWNjb3VudF91bml0c19kaXNjb3VudAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDEtMjAyCiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0IGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAzCiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjA0CiAgICAvLyBkZW5vbWluYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1Ni01NwogICAgLy8gIyBUaGUgY2hlY2sgb24gbWF0dXJpdHkgZGF0ZSBlbnN1cmVzIEQtQVNBIGhhcyBiZWVuIGNvbmZpZ3VyZWQgYXMgYmxvY2sgdGltZXN0YW1wIGNhbm5vdCBiZSBsZXNzIHRoYW4gMCAoaW5pdCkuCiAgICAvLyByZXR1cm4gc2VsZi5pc3N1YW5jZV9kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIDw9CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMTYKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgNAogICAgPgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDE2CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjA2LTIwNwogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdCgpOgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDgKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoKQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDktMjExCiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gc2VsZi5hY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgNwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTIKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjEzCiAgICAvLyBkZW5vbWluYXRvciA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IubmF0aXZlCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjE1LTIxNgogICAgLy8gIyBWYWx1ZSBhdCBtYXR1cml0eQogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5tYXR1cml0eV9kYXRlOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID49CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTIKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDEKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gdW5pdHNfdmFsdWU9YXJjNC5VSW50NjQoYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKSwKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjEKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjIzCiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIGZyYW1lX2RpZyA2CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjQKICAgIC8vIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIGZyYW1lX2RpZyA1CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjItMjI1CiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTktMjI2CiAgICAvLyByZXR1cm4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlKAogICAgLy8gICAgIHVuaXRzX3ZhbHVlPWFyYzQuVUludDY0KGFjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSksCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAMTcKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDgKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5nZXRfcGF5bWVudF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9wYXltZW50X2Ftb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyOC0yMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wYXltZW50X2Ftb3VudChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLlBheW1lbnRBbW91bnRzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBVSW50NjQoKQogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDYKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQ3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQ4CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwcmluY2lwYWxfYW1vdW50ICogc2VsZi5pbnRlcmVzdF9yYXRlIC8vIGNzdC5CUFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAqCiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIC8KICAgIGZyYW1lX2J1cnkgMAoKZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gaW50ZXJlc3Q9YXJjNC5VSW50NjQoaW50ZXJlc3RfYW1vdW50KSwKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNTEKICAgIC8vIHByaW5jaXBhbD1hcmM0LlVJbnQ2NChwcmluY2lwYWxfYW1vdW50KSwKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDktMjUyCiAgICAvLyByZXR1cm4gdHlwLlBheW1lbnRBbW91bnRzKAogICAgLy8gICAgIGludGVyZXN0PWFyYzQuVUludDY0KGludGVyZXN0X2Ftb3VudCksCiAgICAvLyAgICAgcHJpbmNpcGFsPWFyYzQuVUludDY0KHByaW5jaXBhbF9hbW91bnQpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NyZWF0ZShhcnJhbmdlcjogYnl0ZXMsIG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUyLTQ1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgYXNzZXRfY3JlYXRlKHNlbGYsIGFycmFuZ2VyOiBhcmM0LkFkZHJlc3MsIG1ldGFkYXRhOiB0eXAuQXNzZXRNZXRhZGF0YSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIubmF0aXZlCiAgICBieXRlYyAxNyAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjIKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDIyIC8vICJtZXRhZGF0YSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jb25maWcoZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBieXRlcywgc2V0dGxlbWVudF9hc3NldF9pZDogYnl0ZXMsIHByaW5jaXBhbDogYnl0ZXMsIG1pbmltdW1fZGVub21pbmF0aW9uOiBieXRlcywgZGF5X2NvdW50X2NvbnZlbnRpb246IGJ5dGVzLCBpbnRlcmVzdF9yYXRlOiBieXRlcywgY291cG9uX3JhdGVzOiBieXRlcywgdGltZV9ldmVudHM6IGJ5dGVzLCB0aW1lX3BlcmlvZHM6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzQtNDg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF9jb25maWcoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHByaW5jaXBhbDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgbWluaW11bV9kZW5vbWluYXRpb246IGFyYzQuVUludDY0LAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uOiBhcmM0LlVJbnQ4LAogICAgLy8gICAgIGludGVyZXN0X3JhdGU6IGFyYzQuVUludDE2LAogICAgLy8gICAgIGNvdXBvbl9yYXRlczogdHlwLkNvdXBvblJhdGVzLAogICAgLy8gICAgIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cywKICAgIC8vICAgICB0aW1lX3BlcmlvZHM6IHR5cC5UaW1lUGVyaW9kcywKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDkgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MTUKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUxNgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU1QVFksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTE4LTUxOQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9kZW5vbWluYXRpb25fYXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtOQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzcKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgZnJhbWVfZGlnIDMKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NS0xNzgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgLy8gKSwgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDE4IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBmcmFtZV9kaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyMi01MjMKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5hc3NlcnRfc2V0dGxlbWVudF9hc3NldChzZXR0bGVtZW50X2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtOAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTg4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICBkaWcgMQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4Ni0xODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDUgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk0LTIwMAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk5CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTcKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk4CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTQtMTk1CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0yMDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjgKICAgIC8vIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgZnJhbWVfZGlnIC03CiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTYKICAgIGJ0b2kKICAgIGR1cDIKICAgICUKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyNi01MjkKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJpbmNpcGFsLm5hdGl2ZSAlIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZSA9PSAwCiAgICAvLyApLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIE1pbmltdW0gZGVub21pbmF0aW9uIGlzIG5vdCBhIGRpdmlzb3Igb2YgcHJpbmNpcGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzAKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgYnl0ZWMgMTEgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbC5uYXRpdmUgLy8gbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlCiAgICAvCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMzLTUzNAogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNgogICAgLy8gVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIGludGNfMiAvLyAxMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBibnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICBwdXNoaW50IDI1NSAvLyAyNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNwoKYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTIKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBkYXlfY291bnRfY29udmVudGlvbgogICAgYnl0ZWMgMTIgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzctNTM4CiAgICAvLyAjIFNldCBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLmFzc2VydF9pbnRlcmVzdF9yYXRlKGludGVyZXN0X3JhdGUubmF0aXZlKQogICAgZnJhbWVfZGlnIC00CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTYKICAgIC8vIGFzc2VydCBpbnRlcmVzdF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9JTlRFUkVTVF9SQVRFCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjAKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDggLy8gImludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI0CiAgICAvLyBhc3NlcnQgbm90IGNvdXBvbl9yYXRlcy5sZW5ndGgsIGVyci5JTlZBTElEX0NPVVBPTl9SQVRFUwogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIENvdXBvbiByYXRlcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gY291cG9uX3JhdGVzLmxlbmd0aAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI5CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzAKICAgIC8vIHNlbGYuY291cG9uX3JhdGVzLnZhbHVlID0gY291cG9uX3JhdGVzLmNvcHkoKQogICAgYnl0ZWMgMjggLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDI4IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgZnJhbWVfZGlnIC0zCiAgICBib3hfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgICsKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzQtMjM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDcKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjAKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDIzIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjMgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEtMjYzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyA5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEtMjYzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY3CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuSVNTVUFOQ0VfREFURV9JRFhdLm5hdGl2ZQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjktMjcwCiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgICsKICAgID09CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjcxCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzUKICAgIC8vIGFzc2VydCBub3QgdGltZV9wZXJpb2RzLmxlbmd0aCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1NAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBpbnRjXzIgLy8gMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgphc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4Cgphc3NldF9jb25maWdfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE1LTExNgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5hcnJhbmdlci52YWx1ZSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzOC0yMzkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWxmLCB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDEKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDIKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MS0yNDIKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MC0yNDMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gICAgID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUUKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDQKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANgoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF93aGlsZV90b3BAODoKICAgIHB1c2hpbnQgNzUgLy8gNzUKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTQKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAyOSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDI5IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF93aGlsZV90b3BAOAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdGltZV9pID0gdGltZV9ldmVudHNbX3RdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTAKICAgIC8vIHRpbWVfZiA9IHRpbWVfZXZlbnRzW190ICsgMV0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUxCiAgICAvLyBhc3NlcnQgdGltZV9mID4gdGltZV9pLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTIKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gIT0gVUludDY0KGNzdC5EQ0NfQ09OVCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAhPQogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1My0yNTQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1My0yNTYKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICAvLyAgICAgY3N0LkRBWV8yX1NFQwogICAgLy8gKSA9PSAwLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGluIEFjdHVhbC9BY3R1YWwgZGF5IGNvdW50IGNvbnZlbnRpb24gbXVzdCBiZSBtdWx0aXBsZXMgb2YgYSBkYXkgKGluIHNlY29uZHMpCiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2OgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMoc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU2LTU1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cygKICAgIC8vICAgICBzZWxmLCBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cwogICAgLy8gKSAtPiB0eXAuU2Vjb25kYXJ5TWFya2V0U2NoZWR1bGU6CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NzcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA3IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU3OAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU3OQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODEKICAgIC8vIGFzc2VydCBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+PSAxLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgyCiAgICAvLyBpZiBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+IDE6CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgzCiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTEKICAgIGZyYW1lX2J1cnkgMQoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDI6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTg1CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODYtNTg4CiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODUtNTg4CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTg0LTU4OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9PUEVOSU5HX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgb3BlbmluZyBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTAKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkwLTU5MgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTMKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk1CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTcKICAgIC8vIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYtNTk4CiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTUtNTk4CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk0LTU5OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vICAgICA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9DTE9TVVJFX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgY2xvc3VyZSBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDAKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAwLTYwMgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNC02MDYKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDgKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDctNjA5CiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAzLTYxMAogICAgLy8gcmV0dXJuIHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZSgKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2lnbl9yb2xlKHJvbGVfYWRkcmVzczogYnl0ZXMsIHJvbGU6IGJ5dGVzLCBjb25maWc6IGJ5dGVzKSAtPiBieXRlczoKYXNzaWduX3JvbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTItNjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NpZ25fcm9sZSgKICAgIC8vICAgICBzZWxmLCByb2xlX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcm9sZTogYXJjNC5VSW50OCwgY29uZmlnOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjMzCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzQKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzcKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MCAvLyA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzOAogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzkKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MCAvLyA3MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0MQogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogYXNzaWduX3JvbGVfYm9vbF9mYWxzZUA3Cgphc3NpZ25fcm9sZV9ib29sX3RydWVANjoKICAgIGludGNfMSAvLyAxCgphc3NpZ25fcm9sZV9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAgLy8gMjAsIDQwLCA1MCwgNjAsIDcwLCA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQzLTY3MgogICAgLy8gbWF0Y2ggcm9sZS5uYXRpdmU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCAoCiAgICAvLyAgICAgICAgICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgICAgICBjb25maWcubmF0aXZlCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCAoCiAgICAvLyAgICAgICAgICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKCkKICAgIGZyYW1lX2RpZyAwCiAgICBtYXRjaCBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8wQDkgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMUAxMCBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMyBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV81QDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjYKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIGJ5dGVjIDMwIC8vIDB4NTIzODMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY1LTY2NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjkKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OC02NzAKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2MgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjQgLy8gMHg1MjM3MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYzCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8zQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjUgLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYwCiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1NAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1NS02NTcKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4CiAgICAvLyByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICBieXRlYyAyNyAvLyAweDUyMzQzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0Ny02NDkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUxCiAgICAvLyBjb25maWcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTAtNjUyCiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcy5uYXRpdmUKICAgIGJ5dGVjIDE3IC8vIDB4NTIzMjMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzaWduX3JvbGVfYm9vbF9tZXJnZUA4CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EucmV2b2tlX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMpIC0+IGJ5dGVzOgpyZXZva2Vfcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NS02NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHJldm9rZV9yb2xlKHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4KSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjkzCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTQKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NgogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUtNzAxCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NwogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NS03MDEKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk4CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUtNzAxCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5OQogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUtNzAxCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMAogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUtNzAxCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IHJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANgoKcmV2b2tlX3JvbGVfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAzLTcwNAogICAgLy8gIyBBcnJhbmdlciByb2xlIGNhbiBub3QgYmUgcmV2b2tlZCAoanVzdCByb3RhdGVkKQogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwIC8vIDQwLCA1MCwgNjAsIDcwLCA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAyLTcyMAogICAgLy8gbWF0Y2ggcm9sZS5uYXRpdmU6CiAgICAvLyAgICAgIyBBcnJhbmdlciByb2xlIGNhbiBub3QgYmUgcmV2b2tlZCAoanVzdCByb3RhdGVkKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQVVUSE9SSVRZICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfSU5URVJFU1RfT1JBQ0xFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKCkKICAgIGZyYW1lX2RpZyAwCiAgICBtYXRjaCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMUA5IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzJAMTAgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjAKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzAgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE4CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfSU5URVJFU1RfT1JBQ0xFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICBzd2FwCiAgICByZXRzdWIKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjQgLy8gMHg1MjM3MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE1CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQVVUSE9SSVRZICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzJAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzNjMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxMgogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjYgLy8gMHg1MjM1MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA5CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNgogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYiByZXZva2Vfcm9sZV9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5vcGVuX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6Cm9wZW5fYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMy03MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wZW5fYWNjb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0MwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNyAvLyAyMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDQKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDUKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ2CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MQogICAgLy8gdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDktNzU1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUyCiAgICAvLyB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MwogICAgLy8gcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NAogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOS0xMjAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICBieXRlYyAyNyAvLyAweDUyMzQzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMy0xMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9tYW5hZ2VyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQtMTI1CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9tYW5hZ2VyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjUtMTI2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMi0xMjcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmNsb3NlX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmNsb3NlX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTgtNzYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbG9zZV9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVHVwbGVbYXJjNC5VSW50NjQsIGFyYzQuVUludDY0XToKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzc2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzgwCiAgICAvLyBjbG9zZWRfdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlQgKyBob2xkaW5nX2FkZHJlc3MuYnl0ZXMpCiAgICBzd2FwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MgogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBjbG9zZWRfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICAtCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODMKICAgIC8vIHNlbGYuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkKICAgIGNhbGxzdWIgZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODUKICAgIC8vIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICBpdG9iCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODQtNzg2CiAgICAvLyByZXR1cm4gYXJjNC5UdXBsZSgKICAgIC8vICAgICAoYXJjNC5VSW50NjQoY2xvc2VkX3VuaXRzKSwgYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApKQogICAgLy8gKQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5wcmltYXJ5X2Rpc3RyaWJ1dGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4OC03OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHByaW1hcnlfZGlzdHJpYnV0aW9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NC0yODcKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1LTI4NwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODcKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4Ni0yODcKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBmcmFtZV9kaWcgMgogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1LTI4NwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgzLTI4OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgYnl0ZWMgMjYgLy8gMHg1MjM1MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzLTEzNgogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2RlYWxlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0LTEzNQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0LTEzNgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUtMTM2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMyLTEzNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gICAgIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MTYKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODE3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgxOAogICAgLy8gYXNzZXJ0IHVuaXRzLm5hdGl2ZSA+IDAsIGVyci5aRVJPX1VOSVRTCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODE5LTgyMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMubmF0aXZlIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyMwogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArPSB1bml0cy5uYXRpdmUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjQtODI2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjQtODI2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBhcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmVwbGFjZTIgNDAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIC0KICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyOgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMwoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2Fzc2V0X3N1c3BlbnNpb24oc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMwLTgzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2Fzc2V0X3N1c3BlbnNpb24oc2VsZiwgc3VzcGVuZGVkOiBhcmM0LkJvb2wpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDQKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ1CiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NChzdXNwZW5kZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAyMCAvLyAic3VzcGVuZGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OS0xNTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICBieXRlYyAyNCAvLyAweDUyMzczMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1My0xNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0LTE1NgogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTUtMTU2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0LTE1NgogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Mi0xNTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyAgICAgYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9hY2NvdW50X3N1c3BlbnNpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hY2NvdW50X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDgtODUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODY2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBpbnRjIDQgLy8gNDQ4CiAgICBzd2FwCiAgICBzZXRiaXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2RlZmF1bHRfc3RhdHVzKGRlZmF1bHRlZDogYnl0ZXMpIC0+IHZvaWQ6CnNldF9kZWZhdWx0X3N0YXR1czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MS04NzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9kZWZhdWx0X3N0YXR1cyhzZWxmLCBkZWZhdWx0ZWQ6IGFyYzQuQm9vbCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgYnl0ZWMgMjUgLy8gMHg1MjM2MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzLTE0NgogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NgogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ2CiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NS0xNDYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NgogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDItMTQ3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vICAgICBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgzCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IFVJbnQ2NChkZWZhdWx0ZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAyMSAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfaW5mbygpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NS04ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9pbmZvKHNlbGYpIC0+IHR5cC5Bc3NldEluZm86CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NgogICAgLy8gZGVub21pbmF0aW9uX2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NwogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5OAogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTkKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAwCiAgICAvLyBkYXlfY291bnRfY29udmVudGlvbj1hcmM0LlVJbnQ4KHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24pLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDEKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAyCiAgICAvLyB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAzCiAgICAvLyBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNC05MDYKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNy05MDkKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMAogICAgLy8gaXNzdWFuY2VfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLmlzc3VhbmNlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMQogICAgLy8gbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMgogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICBieXRlYyAxMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMwogICAgLy8gZGVmYXVsdGVkPWFyYzQuQm9vbChib29sKHNlbGYuZGVmYXVsdGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICBieXRlYyAxMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NS05MTQKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgLy8gKQogICAgdW5jb3ZlciAxMwogICAgdW5jb3ZlciAxMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgNjY1IC8vIDY2NQogICAgc3dhcAogICAgc2V0Yml0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYWNjb3VudF9pbmZvKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYWNjb3VudF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE2LTkxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FjY291bnRfaW5mbyhzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLkFjY291bnRJbmZvOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMxCiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfdGltZV9ldmVudHMoKSAtPiBieXRlczoKZ2V0X3RpbWVfZXZlbnRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMzLTkzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3RpbWVfZXZlbnRzKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDEKICAgIC8vIHRpbWVfZXZlbnRzID0gdHlwLlRpbWVFdmVudHMoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0MgogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDMKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDIzIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ0CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0Ni05NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTUKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NgogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU0LTk1NwogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTktOTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2NwogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X3VwZGF0ZSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NC00NjUKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgYXNzZXRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2OS00NzIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { @@ -410,7 +414,7 @@ "readonly": false, "returns": { "type": "(uint64,uint64,byte[])", - "desc": "Paid amount, Payment timestamp, Payment context" + "desc": "Paid amount in denomination asset, Payment timestamp, Payment context" }, "desc": "Pay the outstanding principal and interest to an account" }, @@ -704,8 +708,8 @@ "args": [], "readonly": true, "returns": { - "type": "(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", - "desc": "Denomination Asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary Distribution Opening Date, Primary Distribution Closure Date, Issuance Date, Maturity Date, Suspended, Defaulted" + "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", + "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Defaulted" }, "desc": "Get D-ASA info" }, @@ -721,7 +725,7 @@ "readonly": true, "returns": { "type": "(address,uint64,uint64,uint64,bool)", - "desc": "Payment Address, D-ASA units, Unit value, Paid coupons, Suspended" + "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" }, "desc": "Get account info" }, @@ -740,16 +744,20 @@ "args": [], "readonly": true, "returns": { - "type": "uint64[]" - } + "type": "uint64[]", + "desc": "Secondary market schedule" + }, + "desc": "Get secondary market schedule" }, { "name": "get_asset_metadata", "args": [], "readonly": true, "returns": { - "type": "byte[]" - } + "type": "byte[]", + "desc": "Asset metadata" + }, + "desc": "Get D-ASA metadata" } ], "networks": {} diff --git a/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py b/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py index 4aa9834..5eb6f84 100644 --- a/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py +++ b/smart_contracts/artifacts/zero_coupon_bond/zero_coupon_bond_client.py @@ -168,7 +168,7 @@ "no_op": "CALL" } }, - "get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)": { + "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)": { "read_only": true, "structs": { "output": { @@ -178,6 +178,10 @@ "denomination_asset_id", "uint64" ], + [ + "settlement_asset_id", + "uint64" + ], [ "outstanding_principal", "uint64" @@ -286,7 +290,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMTAwIDggNDQ4IDEwMDAwIDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjaXJjdWxhdGluZ191bml0cyIgMHg1MjMzMzAyMyAic3RhdHVzIiAibWF0dXJpdHlfZGF0ZSIgImlzc3VhbmNlX2RhdGUiIDB4MDAwMDAwMDAwMDAwMDAwMCAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIiAiaW50ZXJlc3RfcmF0ZSIgInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIgMHgwMCAidW5pdF92YWx1ZSIgImRheV9jb3VudF9jb252ZW50aW9uIiAidG90YWxfdW5pdHMiICJ0b3RhbF9jb3Vwb25zIiAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIgMHg1MjMyMzAyMyAic2V0dGxlbWVudF9hc3NldF9pZCIgInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIgInN1c3BlbmRlZCIgImRlZmF1bHRlZCIgIm1ldGFkYXRhIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczIDB4MDY4MTAxIDB4NTIzODMwMjMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyAjIFJvbGUgQmFzZWQgQWNjZXNzIENvbnRyb2wKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTcgLy8gMHg1MjMyMzAyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTktNjAKICAgIC8vICMgQXNzZXQgQ29uZmlndXJhdGlvbgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgNyAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MQogICAgLy8gc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkID0gVUludDY0KCkKICAgIGJ5dGVjIDE4IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MgogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJ1bml0X3ZhbHVlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MwogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyAjIE1ldGFkYXRhCiAgICAvLyBzZWxmLm1ldGFkYXRhID0gQnl0ZXMoKQogICAgYnl0ZWMgMjIgLy8gIm1ldGFkYXRhIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgtNjkKICAgIC8vICMgU3VwcGx5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgOCAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzcKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNSAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODktOTAKICAgIC8vICMgU3RhdHVzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VNUFRZKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MQogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gInN1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDIxIC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1LTM2CiAgICAvLyAjIFN0YXRlIHNjaGVtYSB2YWxpZGF0aW9uCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MzcKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDE3IC8vIDE3CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MzkKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMjUKICAgIHB1c2hieXRlc3MgMHg0ZmQ2YTNjYyAweDljNzZiNmEzIDB4NDQzNjNkNDkgMHg2N2RiNGYyMCAweDYzZjk5NTg5IDB4ZDNhNGQ2YWIgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHgzMDFkZDkxOSAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGRkY2VjMDdiIC8vIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2V0X2NyZWF0ZShhZGRyZXNzLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTZbXSx1aW50NjRbXSwodWludDY0LHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHVpbnQ2NFtdKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiYXNzaWduX3JvbGUoYWRkcmVzcyx1aW50OCxieXRlW10pdWludDY0IiwgbWV0aG9kICJyZXZva2Vfcm9sZShhZGRyZXNzLHVpbnQ4KXVpbnQ2NCIsIG1ldGhvZCAib3Blbl9hY2NvdW50KGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImNsb3NlX2FjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAic2V0X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9hY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2RlZmF1bHRfc3RhdHVzKGJvb2wpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50MTYsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYm9vbCxib29sKSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaW5mbyhhZGRyZXNzKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wpIiwgbWV0aG9kICJnZXRfdGltZV9ldmVudHMoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpdWludDY0W10iLCBtZXRob2QgImdldF9hc3NldF9tZXRhZGF0YSgpYnl0ZVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1IG1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA2IG1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA3IG1haW5fZ2V0X3BheW1lbnRfYW1vdW50X3JvdXRlQDggbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAOSBtYWluX2Fzc2V0X2NvbmZpZ19yb3V0ZUAxMCBtYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAMTEgbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUAxMiBtYWluX3Jldm9rZV9yb2xlX3JvdXRlQDEzIG1haW5fb3Blbl9hY2NvdW50X3JvdXRlQDE0IG1haW5fY2xvc2VfYWNjb3VudF9yb3V0ZUAxNSBtYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDE2IG1haW5fc2V0X2Fzc2V0X3N1c3BlbnNpb25fcm91dGVAMTcgbWFpbl9zZXRfYWNjb3VudF9zdXNwZW5zaW9uX3JvdXRlQDE4IG1haW5fc2V0X2RlZmF1bHRfc3RhdHVzX3JvdXRlQDE5IG1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMjAgbWFpbl9nZXRfYWNjb3VudF9pbmZvX3JvdXRlQDIxIG1haW5fZ2V0X3RpbWVfZXZlbnRzX3JvdXRlQDIyIG1haW5fZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGVfcm91dGVAMjMgbWFpbl9nZXRfYXNzZXRfbWV0YWRhdGFfcm91dGVAMjQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9tZXRhZGF0YV9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2Fzc2V0X21ldGFkYXRhCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfdGltZV9ldmVudHNfcm91dGVAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF9pbmZvX3JvdXRlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X2luZm8KICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2Fzc2V0X2luZm9fcm91dGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfZGVmYXVsdF9zdGF0dXMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9hc3NldF9zdXNwZW5zaW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3ByaW1hcnlfZGlzdHJpYnV0aW9uX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc5MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHByaW1hcnlfZGlzdHJpYnV0aW9uCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY2xvc2VfYWNjb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcGVuX2FjY291bnRfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3Blbl9hY2NvdW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Jldm9rZV9yb2xlX3JvdXRlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHJldm9rZV9yb2xlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2lnbl9yb2xlX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2lnbl9yb2xlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jb25maWdfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfY29uZmlnCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2Fzc2V0X2NyZWF0ZV9yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGNhbGxzdWIgYXNzZXRfY3JlYXRlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9wYXltZW50X2Ftb3VudF9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9wYXltZW50X2Ftb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGNhbGxzdWIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wYXlfcHJpbmNpcGFsX3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGF5X3ByaW5jaXBhbAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF90cmFuc2Zlcl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgcHVzaGludCA0IC8vIDQKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIG1haW5fYXNzZXRfdXBkYXRlQDI2CiAgICBiIG1haW5fYWZ0ZXJfaWZfZWxzZUAyNwoKbWFpbl9hc3NldF91cGRhdGVAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjYKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2Ni00NjcKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgYXNzZXRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBjYWxsc3ViIGFzc2V0X3VwZGF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy56ZXJvX2NvdXBvbl9ib25kLmNvbnRyYWN0Llplcm9Db3Vwb25Cb25kLmFzc2V0X3RyYW5zZmVyKHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NldF90cmFuc2ZlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojc1LTgxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF90cmFuc2ZlcigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywKICAgIC8vICAgICB1bml0czogYXJjNC5VSW50NjQsCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTA1CiAgICAvLyB1bml0cy5uYXRpdmUsCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTMtMjk2CiAgICAvLyBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk1CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk2CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTYKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NS0yOTYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyA0CiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTQtMjk2CiAgICAvLyBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkyLTI5NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksIGVyci5TRUNPTkRBUllfTUFSS0VUX0NMT1NFRAogICAgYXNzZXJ0IC8vIFNlY29uZGFyeSBtYXJrZXQgaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNjktMzcxCiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRyYW5zZmVyIHJpZ2h0IHRvIEQtQVNBIG93bmVycy4gT3RoZXIgaW1wbGVtZW50YXRpb25zIG1heSByZWxheSBvbiBvdGhlcgogICAgLy8gIyByb2xlcywgZXh0ZXJuYWwgQXBwcyB0aHJvdWdoIEMyQyBjYWxscyAoZS5nLiwgYW4gb3JkZXIgYm9vayksIG9yIG9mZi1jaGFpbiB0cmFuc2ZlciBhZ2VudHMuCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLm5hdGl2ZSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzIKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzczCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS5zdXNwZW5kZWQubmF0aXZlLCBlcnIuU1VTUEVOREVECiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGludGMgNCAvLyA0NDgKICAgIGdldGJpdAogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3Ny0zNzkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHJlY2VpdmVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5zdXNwZW5kZWQubmF0aXZlLCBlcnIuU1VTUEVOREVECiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODEKICAgIC8vIHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIDUKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozODAtMzgyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHVuaXRzIDw9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICksIGVyci5PVkVSX1RSQU5TRkVSCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHNlbmRlciB1bml0cyB0byB0cmFuc2ZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzkwCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTEKICAgIC8vIGlmIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSA+IDA6CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnogYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDQKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA1CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50W3NlbmRlcl0ucGFpZF9jb3Vwb25zID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0ucGFpZF9jb3Vwb25zCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYj09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDQtMzA1CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgYnogYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNAogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMDMtMzA2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJdLnVuaXRfdmFsdWUgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS51bml0X3ZhbHVlCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgLy8gKSwgZXJyLk5PTl9GVU5HSUJMRV9VTklUUwogICAgYXNzZXJ0IC8vIFNlbmRlciBhbmQgcmVjZWl2ZXIgdW5pdHMgYXJlIG5vdCBmdW5naWJsZQoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwOC0xMDkKICAgIC8vICMgVHJhbnNmZXJyZWQgdW5pdHMgdmFsdWUgKG11c3QgYmUgY29tcHV0ZWQgYmVmb3JlIHRoZSB0cmFuc2ZlcikKICAgIC8vIHNlbmRlcl91bml0X3ZhbHVlID0gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjExMC0xMTIKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNwogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMgogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI2LTQyOAogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjYKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjYtNDI4CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlIC0gdW5pdHMKICAgIC8vICkKICAgIHN3YXAKICAgIHJlcGxhY2UyIDMyCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDMwCiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI5LTQzMQogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI5CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjktNDMxCiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzUzCiAgICAvLyBpZiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPT0gMDoKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gYXJjNC5VSW50NjQoKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDYgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiA0MAogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gYXJjNC5VSW50NjQoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0Cgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE3CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQodW5pdHMubmF0aXZlICogc2VuZGVyX3VuaXRfdmFsdWUubmF0aXZlICsgYWNjcnVlZF9pbnRlcmVzdCkKICAgIGZyYW1lX2RpZyAwCiAgICBidG9pCiAgICBmcmFtZV9kaWcgNQogICAgKgogICAgZnJhbWVfZGlnIDMKICAgICsKICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgphc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUAxNQoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk2CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlID0gc2VuZGVyX3VuaXRfdmFsdWUKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgcmVwbGFjZTIgNDAKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTctMzk5CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5wYWlkX2NvdXBvbnMKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5Ny0zOTkKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzCiAgICAvLyBdLnBhaWRfY291cG9ucwogICAgc3dhcAogICAgZXh0cmFjdCA0OCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcmVwbGFjZTIgNDgKICAgIGJveF9wdXQKICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxNwoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfdHJhbnNmZXJfYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X2RlZmF1bHRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNy0xMDgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuZGVmYXVsdGVkLCBlcnIuREVGQVVMVEVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpIC0+IHZvaWQ6CmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTExLTExMgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdXNwZW5kZWQsIGVyci5TVVNQRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAic3VzcGVuZGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1c3BlbmRlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnplcm9fY291cG9uX2JvbmQuY29udHJhY3QuWmVyb0NvdXBvbkJvbmQuYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NydWVkX2ludGVyZXN0X2Ftb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU5LTYyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NjMKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoKQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NAogICAgLy8gYWNjcnVlZF9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLm51bWVyYXRvci5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NQogICAgLy8gcHJpbmNpcGFsX3BlcmlvZCA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IubmF0aXZlCiAgICBzd2FwCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjY4CiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjY3LTY4CiAgICAvLyBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICogc2VsZi5pbnRlcmVzdF9yYXRlCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2Ny02OQogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgLy8gKiBhY2NydWVkX3BlcmlvZAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo3MQogICAgLy8gY3N0LkJQUyAqIHByaW5jaXBhbF9wZXJpb2QKICAgIGludGMgNSAvLyAxMDAwMAogICAgdW5jb3ZlciAyCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2Ny03MgogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgLy8gKiBhY2NydWVkX3BlcmlvZAogICAgLy8gLy8gKAogICAgLy8gICAgIGNzdC5CUFMgKiBwcmluY2lwYWxfcGVyaW9kCiAgICAvLyApICAjIGRpdi1ieS16ZXJvOiBwcmluY2lwYWxfcGVyaW9kICE9IDAgZHVlIHRvIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQgY2hlY2tzCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2Ni03MwogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzLCB1bml0cykKICAgIC8vICAgICAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgLy8gICAgICogYWNjcnVlZF9wZXJpb2QKICAgIC8vICAgICAvLyAoCiAgICAvLyAgICAgICAgIGNzdC5CUFMgKiBwcmluY2lwYWxfcGVyaW9kCiAgICAvLyAgICAgKSAgIyBkaXYtYnktemVybzogcHJpbmNpcGFsX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkIGNoZWNrcwogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnplcm9fY291cG9uX2JvbmQuY29udHJhY3QuWmVyb0NvdXBvbkJvbmQuZGF5X2NvdW50X2ZhY3RvcigpIC0+IGJ5dGVzOgpkYXlfY291bnRfZmFjdG9yOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NDEtNDIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZGF5X2NvdW50X2ZhY3RvcihzZWxmKSAtPiB0eXAuRGF5Q291bnRGYWN0b3I6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQzLTQ0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgb25seSB0aGUgQWN0dWFsL0FjdHVhbCBhbmQgQ29udGludW91cyBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFjY3J1ZWRfcGVyaW9kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgLSBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAtCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBwcmluY2lwYWxfcGVyaW9kID0gc2VsZi5tYXR1cml0eV9kYXRlIC0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC0KICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NDYKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPT0gVUludDY0KGNzdC5EQ0NfQV9BKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpbnRjXzIgLy8gMTAwCiAgICA9PQogICAgc3dhcAogICAgY292ZXIgMgogICAgYnogZGF5X2NvdW50X2ZhY3Rvcl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0OQogICAgLy8gcmV0dXJuIHRpbWVfcGVyaW9kIC8vIFVJbnQ2NChjc3QuREFZXzJfU0VDKQogICAgZnJhbWVfZGlnIDAKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfZGlnIDEKICAgIGludGMgNiAvLyA4NjQwMAogICAgLwogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9idXJ5IDMKCmRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1MAogICAgLy8gbnVtZXJhdG9yPWFyYzQuVUludDY0KGFjY3J1ZWRfcGVyaW9kKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChwcmluY2lwYWxfcGVyaW9kKSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQ5LTUyCiAgICAvLyByZXR1cm4gdHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChhY2NydWVkX3BlcmlvZCksCiAgICAvLyAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQocHJpbmNpcGFsX3BlcmlvZCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogdWludDY0KSAtPiB1aW50NjQ6CmFjY291bnRfdW5pdHNfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzUtMzM4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBVSW50NjQKICAgIC8vICkgLT4gVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzkKICAgIC8vIHJldHVybiB1bml0cyAqIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUubmF0aXZlCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5wYXlfcHJpbmNpcGFsKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHBheW1lbnRfaW5mbzogYnl0ZXMpIC0+IGJ5dGVzOgpwYXlfcHJpbmNpcGFsOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE5LTEyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5X3ByaW5jaXBhbCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9pbmZvOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiB0eXAuUGF5bWVudFJlc3VsdDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzNi00MzcKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZXN0cmljdCBjYWxsZXIgYXV0aG9yaXphdGlvbgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQzOAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0MQogICAgLy8gdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0MgogICAgLy8gYXNzZXJ0IHVuaXRzID4gMCwgZXJyLk5PX1VOSVRTCiAgICBhc3NlcnQgLy8gTm8gRC1BU0EgdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ0MwogICAgLy8gYXNzZXJ0IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYubWF0dXJpdHlfZGF0ZSwgZXJyLk5PVF9NQVRVUkUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICA+PQogICAgYXNzZXJ0IC8vIE5vdCBtYXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTIKICAgIC8vIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTEtMzEzCiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MubmF0aXZlLmlzX29wdGVkX2luKAogICAgLy8gICAgIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKQogICAgLy8gKQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMxMS0zMTQKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICAvLyAgICAgQXNzZXQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUKICAgIGJ6IHBheV9wcmluY2lwYWxfYm9vbF9mYWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE0CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50YyA0IC8vIDQ0OAogICAgZ2V0Yml0CiAgICBieXRlYyAxMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJueiBwYXlfcHJpbmNpcGFsX2Jvb2xfZmFsc2VAMTYKICAgIGludGNfMSAvLyAxCgpwYXlfcHJpbmNpcGFsX2Jvb2xfbWVyZ2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDQKICAgIC8vIGlmIHNlbGYuaXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBieiBwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyMAogICAgLy8gQXNzZXQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLmJhbGFuY2UoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyMC0zMjIKICAgIC8vIEFzc2V0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5iYWxhbmNlKAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICkKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzIwLTMyMwogICAgLy8gQXNzZXQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLmJhbGFuY2UoCiAgICAvLyAgICAgR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKQogICAgLy8gPj0gcGF5bWVudF9hbW91bnQKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE5LTMyNAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBBc3NldChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCkuYmFsYW5jZSgKICAgIC8vICAgICAgICAgR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gICAgICkKICAgIC8vICAgICA+PSBwYXltZW50X2Ftb3VudAogICAgLy8gKSwgZXJyLk5PVF9FTk9VR0hfRlVORFMKICAgIGFzc2VydCAvLyBOb3QgZW5vdWdoIGZ1bmRzIGZvciB0aGUgcGF5bWVudAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTQ4LTE0OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyB0aGUgc2FtZSBhc3NldCBmb3IgZGVub21pbmF0aW9uIGFuZCBzZXR0bGVtZW50LCBubyBjb252ZXJzaW9uIG5lZWRlZAogICAgLy8gc2VsZi5wYXkoc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLCBwYXltZW50X2Ftb3VudCkKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI4LTMzMwogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLm5hdGl2ZSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMzIKICAgIC8vIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjkKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI4CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjgtMzMzCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CgpwYXlfcHJpbmNpcGFsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1MAogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAtCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgYnl0ZWMgNiAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIHJlcGxhY2UyIDMyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTIKICAgIC8vIHNlbGYuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkKICAgIGNhbGxzdWIgZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNTYKICAgIC8vIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNTcKICAgIC8vIHRpbWVzdGFtcD1hcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCksCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNTUtMTU5CiAgICAvLyByZXR1cm4gdHlwLlBheW1lbnRSZXN1bHQoCiAgICAvLyAgICAgYW1vdW50PWFyYzQuVUludDY0KHBheW1lbnRfYW1vdW50KSwKICAgIC8vICAgICB0aW1lc3RhbXA9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgLy8gICAgIGNvbnRleHQ9cGF5bWVudF9pbmZvLmNvcHkoKSwgICMgVE9ETzogQWRkIGluZm8gb24gZmFpbGVkIHBheW1lbnQKICAgIC8vICkKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAxMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgpwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTUxLTE1MgogICAgLy8gIyBBY2NvdW50cyBzdXNwZW5kZWQgb3Igbm90IG9wdGVkIGluIGF0IHRoZSB0aW1lIG9mIHBheW1lbnRzIG11c3Qgbm90IHN0YWxsIHRoZSBELUFTQQogICAgLy8gcGF5bWVudF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGIgcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDMKCnBheV9wcmluY2lwYWxfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9wcmluY2lwYWxfYm9vbF9tZXJnZUAxNwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gdWludDY0OgphY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQxLTM0MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM0NAogICAgLy8gaG9sZGluZ19hZGRyZXNzLCBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDMtMzQ1CiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkgLT4gdm9pZDoKZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU3LTM1OAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzU5CiAgICAvLyBpZiBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzID09IDA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBibnogZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzYwCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VOREVEKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50YyA3IC8vIDIwMAogICAgYXBwX2dsb2JhbF9wdXQKCmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0c19hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5nZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNjEtMTY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlOgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTgxLTE4MgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODEtMTgyCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gYW5kIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID49IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMwogICAgaW50Y18xIC8vIDEKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTgwLTE4MwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwgZXJyLk5PX1BSSU1BUllfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gbm90IHlldCBleGVjdXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg2CiAgICAvLyAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjIDYgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBiPgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDcKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBiPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODUtMTg3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIDAgPCB1bml0cyA8PSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1VOSVRTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhbW91bnQgb2YgdW5pdHMgZm9yIHRoZSBhY2NvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOTAKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODktMTkxCiAgICAvLyBhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUgPSBzZWxmLmFjY291bnRfdW5pdHNfdmFsdWUoCiAgICAvLyAgICAgaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTkzCiAgICAvLyBhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUgKiBzZWxmLmludGVyZXN0X3JhdGUgLy8gY3N0LkJQUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgIGRpZyAxCiAgICAqCiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlIC0gYWNjb3VudF91bml0c19kaXNjb3VudAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTk2LTE5OQogICAgLy8gIyBWYWx1ZSBkdXJpbmcgcHJpbWFyeSBkaXN0cmlidXRpb24KICAgIC8vIGFjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSA9ICgKICAgIC8vICAgICBhY2NvdW50X3VuaXRzX25vbWluYWxfdmFsdWUgLSBhY2NvdW50X3VuaXRzX2Rpc2NvdW50CiAgICAvLyApCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwMS0yMDIKICAgIC8vICMgQWNjcnVpbmcgaW50ZXJlc3QgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uIGFuZCBhdCBtYXR1cml0eQogICAgLy8gYWNjcnVlZF9pbnRlcmVzdCA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDMKICAgIC8vIG51bWVyYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDQKICAgIC8vIGRlbm9taW5hdG9yID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjU2LTU3CiAgICAvLyAjIFRoZSBjaGVjayBvbiBtYXR1cml0eSBkYXRlIGVuc3VyZXMgRC1BU0EgaGFzIGJlZW4gY29uZmlndXJlZCBhcyBibG9jayB0aW1lc3RhbXAgY2Fubm90IGJlIGxlc3MgdGhhbiAwIChpbml0KS4KICAgIC8vIHJldHVybiBzZWxmLmlzc3VhbmNlX2RhdGUgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgPD0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAxNgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyA0CiAgICA+CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMTYKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDYtMjA3CiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0CiAgICAvLyBpZiBzZWxmLmlzX2FjY3J1aW5nX2ludGVyZXN0KCk6CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gZGF5X2NvdW50X2ZhY3RvciA9IHNlbGYuZGF5X2NvdW50X2ZhY3RvcigpCiAgICBjYWxsc3ViIGRheV9jb3VudF9mYWN0b3IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIwOS0yMTEKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBzZWxmLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyA3CiAgICBjYWxsc3ViIGFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50CiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIxMgogICAgLy8gbnVtZXJhdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTMKICAgIC8vIGRlbm9taW5hdG9yID0gZGF5X2NvdW50X2ZhY3Rvci5kZW5vbWluYXRvci5uYXRpdmUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZnJhbWVfYnVyeSA1CgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTUtMjE2CiAgICAvLyAjIFZhbHVlIGF0IG1hdHVyaXR5CiAgICAvLyBpZiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGU6CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjIwCiAgICAvLyB1bml0c192YWx1ZT1hcmM0LlVJbnQ2NChhY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUpLAogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyMQogICAgLy8gYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIGZyYW1lX2RpZyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjMKICAgIC8vIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgZnJhbWVfZGlnIDYKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyNAogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgZnJhbWVfZGlnIDUKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyMi0yMjUKICAgIC8vIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChudW1lcmF0b3IpLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICksCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIxOS0yMjYKICAgIC8vIHJldHVybiB0eXAuQ3VycmVudFVuaXRzVmFsdWUoCiAgICAvLyAgICAgdW5pdHNfdmFsdWU9YXJjNC5VSW50NjQoYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKSwKICAgIC8vICAgICBhY2NydWVkX2ludGVyZXN0PWFyYzQuVUludDY0KGFjY3J1ZWRfaW50ZXJlc3QpLAogICAgLy8gICAgIGRheV9jb3VudF9mYWN0b3I9dHlwLkRheUNvdW50RmFjdG9yKAogICAgLy8gICAgICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICAgICAgZGVub21pbmF0b3I9YXJjNC5VSW50NjQoZGVub21pbmF0b3IpLAogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAxNjoKICAgIGludGNfMCAvLyAwCiAgICBiIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUAxNwoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAOAoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy56ZXJvX2NvdXBvbl9ib25kLmNvbnRyYWN0Llplcm9Db3Vwb25Cb25kLmdldF9wYXltZW50X2Ftb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3BheW1lbnRfYW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjI4LTIyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3BheW1lbnRfYW1vdW50KHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzKSAtPiB0eXAuUGF5bWVudEFtb3VudHM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQ0CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gcHJpbmNpcGFsX2Ftb3VudCA9IFVJbnQ2NCgpCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0NgogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDcKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBzZWxmLmFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFjY291bnRfdG90YWxfdW5pdHNfdmFsdWUKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDgKICAgIC8vIGludGVyZXN0X2Ftb3VudCA9IHByaW5jaXBhbF9hbW91bnQgKiBzZWxmLmludGVyZXN0X3JhdGUgLy8gY3N0LkJQUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gImludGVyZXN0X3JhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW50ZXJlc3RfcmF0ZSBleGlzdHMKICAgICoKICAgIGludGMgNSAvLyAxMDAwMAogICAgLwogICAgZnJhbWVfYnVyeSAwCgpnZXRfcGF5bWVudF9hbW91bnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjUwCiAgICAvLyBpbnRlcmVzdD1hcmM0LlVJbnQ2NChpbnRlcmVzdF9hbW91bnQpLAogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1MQogICAgLy8gcHJpbmNpcGFsPWFyYzQuVUludDY0KHByaW5jaXBhbF9hbW91bnQpLAogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0OS0yNTIKICAgIC8vIHJldHVybiB0eXAuUGF5bWVudEFtb3VudHMoCiAgICAvLyAgICAgaW50ZXJlc3Q9YXJjNC5VSW50NjQoaW50ZXJlc3RfYW1vdW50KSwKICAgIC8vICAgICBwcmluY2lwYWw9YXJjNC5VSW50NjQocHJpbmNpcGFsX2Ftb3VudCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXRfY3JlYXRlKGFycmFuZ2VyOiBieXRlcywgbWV0YWRhdGE6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jcmVhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NTQtNDU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBhc3NldF9jcmVhdGUoc2VsZiwgYXJyYW5nZXI6IGFyYzQuQWRkcmVzcywgbWV0YWRhdGE6IHR5cC5Bc3NldE1ldGFkYXRhKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjMKICAgIC8vIHNlbGYuYXJyYW5nZXIudmFsdWUgPSBhcnJhbmdlci5uYXRpdmUKICAgIGJ5dGVjIDE3IC8vIDB4NTIzMjMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NAogICAgLy8gc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWMgMjIgLy8gIm1ldGFkYXRhIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NvbmZpZyhkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGJ5dGVzLCBzZXR0bGVtZW50X2Fzc2V0X2lkOiBieXRlcywgcHJpbmNpcGFsOiBieXRlcywgbWluaW11bV9kZW5vbWluYXRpb246IGJ5dGVzLCBkYXlfY291bnRfY29udmVudGlvbjogYnl0ZXMsIGludGVyZXN0X3JhdGU6IGJ5dGVzLCBjb3Vwb25fcmF0ZXM6IGJ5dGVzLCB0aW1lX2V2ZW50czogYnl0ZXMsIHRpbWVfcGVyaW9kczogYnl0ZXMpIC0+IHZvaWQ6CmFzc2V0X2NvbmZpZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3Ni00ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X2NvbmZpZygKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcHJpbmNpcGFsOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBtaW5pbXVtX2Rlbm9taW5hdGlvbjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb246IGFyYzQuVUludDgsCiAgICAvLyAgICAgaW50ZXJlc3RfcmF0ZTogYXJjNC5VSW50MTYsCiAgICAvLyAgICAgY291cG9uX3JhdGVzOiB0eXAuQ291cG9uUmF0ZXMsCiAgICAvLyAgICAgdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzLAogICAgLy8gICAgIHRpbWVfcGVyaW9kczogdHlwLlRpbWVQZXJpb2RzLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gOSAwCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUxNwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTE4CiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTVBUWSwgZXJyLkFMUkVBRFlfQ09ORklHVVJFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRC1BU0EgYWxyZWFkeSBjb25maWd1cmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjAtNTIxCiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X2Rlbm9taW5hdGlvbl9hc3NldChkZW5vbWluYXRpb25fYXNzZXRfaWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC05CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NwogICAgLy8gZGVub21pbmF0aW9uX2Fzc2V0X2lkICE9IFVJbnQ2NCgwKSBhbmQgQXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5jcmVhdG9yCiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUA0CiAgICBmcmFtZV9kaWcgMwogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTc1LTE3OAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBkZW5vbWluYXRpb24gd2l0aCBBU0EKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgZGVub21pbmF0aW9uX2Fzc2V0X2lkICE9IFVJbnQ2NCgwKSBhbmQgQXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkKS5jcmVhdG9yCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ERU5PTUlOQVRJT04KICAgIGFzc2VydCAvLyBEZW5vbWluYXRpb24gYXNzZXQgaXMgbm90IHByb3Blcmx5IHNldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTgyCiAgICAvLyBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCA9IGRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgYnl0ZWMgNyAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgZnJhbWVfZGlnIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjQtNTI1CiAgICAvLyAjIFNldCBEZW5vbWluYXRpb24gQXNzZXQKICAgIC8vIHNlbGYuYXNzZXJ0X3NldHRsZW1lbnRfYXNzZXQoc2V0dGxlbWVudF9hc3NldF9pZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTgKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICBkaWcgMQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4Ni0xODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDE4IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0yMDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5OQogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NgogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NwogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTgKICAgIC8vIGFzc2V0X2Ftb3VudD0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0xOTUKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk0LTIwMAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMAogICAgLy8gcHJpbmNpcGFsLm5hdGl2ZSAlIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZSA9PSAwCiAgICBmcmFtZV9kaWcgLTcKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtNgogICAgYnRvaQogICAgZHVwMgogICAgJQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTI4LTUzMQogICAgLy8gIyBTZXQgUHJpbmNpcGFsIGFuZCBNaW5pbXVtIERlbm9taW5hdGlvbgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBwcmluY2lwYWwubmF0aXZlICUgbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlID09IDAKICAgIC8vICksIGVyci5JTlZBTElEX01JTklNVU1fREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gTWluaW11bSBkZW5vbWluYXRpb24gaXMgbm90IGEgZGl2aXNvciBvZiBwcmluY2lwYWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMgogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlCiAgICBieXRlYyAxMSAvLyAidW5pdF92YWx1ZSIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMzCiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gcHJpbmNpcGFsLm5hdGl2ZSAvLyBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUKICAgIC8KICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzUtNTM2CiAgICAvLyAjIFNldCBEYXktQ291bnQgQ29udmVudGlvbgogICAgLy8gc2VsZi5hc3NlcnRfZGF5X2NvdW50X2NvbnZlbnRpb24oZGF5X2NvdW50X2NvbnZlbnRpb24ubmF0aXZlKQogICAgZnJhbWVfZGlnIC01CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA2CiAgICAvLyBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgaW50Y18yIC8vIDEwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA0LTIwOAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJueiBhc3NldF9jb25maWdfYm9vbF90cnVlQDE2CiAgICBmcmFtZV9kaWcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA3CiAgICAvLyBVSW50NjQoY3N0LkRDQ19DT05UKSwKICAgIHB1c2hpbnQgMjU1IC8vIDI1NQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA0LTIwOAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3Cgphc3NldF9jb25maWdfYm9vbF90cnVlQDE2OgogICAgaW50Y18xIC8vIDEKCmFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjA0LTIwOAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgZGF5X2NvdW50X2NvbnZlbnRpb24gaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0FfQSksCiAgICAvLyAgICAgVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9EQVlfQ09VTlRfQ09OVkVOVElPTgogICAgYXNzZXJ0IC8vIEludmFsaWQgZGF5LWNvdW50IGNvbnZlbnRpb24gSUQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIxMgogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IGRheV9jb3VudF9jb252ZW50aW9uCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBmcmFtZV9kaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzOS01NDAKICAgIC8vICMgU2V0IEludGVyZXN0IFJhdGUKICAgIC8vIHNlbGYuYXNzZXJ0X2ludGVyZXN0X3JhdGUoaW50ZXJlc3RfcmF0ZS5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIxNgogICAgLy8gYXNzZXJ0IGludGVyZXN0X3JhdGUgPiBVSW50NjQoMCksIGVyci5JTlZBTElEX0lOVEVSRVNUX1JBVEUKICAgIGR1cAogICAgYXNzZXJ0IC8vIEludGVyZXN0IHJhdGUgaXMgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gc2VsZi5pbnRlcmVzdF9yYXRlID0gaW50ZXJlc3RfcmF0ZQogICAgYnl0ZWMgOCAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjQKICAgIC8vIGFzc2VydCBub3QgY291cG9uX3JhdGVzLmxlbmd0aCwgZXJyLklOVkFMSURfQ09VUE9OX1JBVEVTCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICAhCiAgICBhc3NlcnQgLy8gQ291cG9uIHJhdGVzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI4CiAgICAvLyBzZWxmLnRvdGFsX2NvdXBvbnMgPSBjb3Vwb25fcmF0ZXMubGVuZ3RoCiAgICBieXRlYyAxNCAvLyAidG90YWxfY291cG9ucyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjkKICAgIC8vIGlmIHNlbGYudG90YWxfY291cG9uczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzMAogICAgLy8gc2VsZi5jb3Vwb25fcmF0ZXMudmFsdWUgPSBjb3Vwb25fcmF0ZXMuY29weSgpCiAgICBieXRlYyAyOCAvLyAweDYzNmY3NTcwNmY2ZTUyNjE3NDY1NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjggLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBmcmFtZV9kaWcgLTMKICAgIGJveF9wdXQKCmFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM1CiAgICAvLyB0aW1lX2V2ZW50cy5sZW5ndGggPT0gc2VsZi50b3RhbF9jb3Vwb25zICsgY2ZnLlRJTUVfU0NIRURVTEVfTElNSVRTCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNC0yMzYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUwogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRV9FVkVOVFNfTEVOR1RICiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbGVuZ3RoIGlzIGludmFsaWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU0OQogICAgLy8gc2VsZi5hc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHRpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGZyYW1lX2J1cnkgLTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MAogICAgLy8gc2VsZi50aW1lX2V2ZW50cy52YWx1ZSA9IHRpbWVfZXZlbnRzLmNvcHkoKQogICAgYnl0ZWMgMjMgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAyMyAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MS0yNjMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MQogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2MS0yNjMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0LTI2NgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGR1cAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjQKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyAxOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0LTI2NgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgPSB0aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjcKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5JU1NVQU5DRV9EQVRFX0lEWF0ubmF0aXZlCiAgICBleHRyYWN0IDE2IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2OS0yNzAKICAgIC8vICMgU29tZSBELUFTQSBtYXkgbm90IGhhdmUgYSBtYXR1cml0eSBkYXRlIChlLmcuLCBwZXJwZXR1YWxzKQogICAgLy8gaWYgdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUzoKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJ0b3RhbF9jb3Vwb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX2NvdXBvbnMgZXhpc3RzCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgPT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzEKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZSA9IHRpbWVfZXZlbnRzW2NmZy5NQVRVUklUWV9EQVRFX0lEWF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gYXNzZXJ0IG5vdCB0aW1lX3BlcmlvZHMubGVuZ3RoLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRFMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGFyZSBub3QgcHJvcGVybHkgZGVmaW5lZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU2CiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0FDVElWRSkKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGludGNfMiAvLyAxMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDE3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VAMTgKCmFzc2V0X2NvbmZpZ19ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NldF9jb25maWdfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMTUtMTE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE3CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlLCBlcnIuVU5BVVRIT1JJWkVECiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gMHg1MjMyMzAyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjM4LTIzOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkKHNlbGYsIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cykgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MQogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MgogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQxLTI0MgogICAgLy8gdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQwLTI0MwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB0aW1lX2V2ZW50c1tjZmcuUFJJTUFSWV9ESVNUUklCVVRJT05fT1BFTklOR19EQVRFX0lEWF0ubmF0aXZlCiAgICAvLyAgICAgPiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gKSwgZXJyLklOVkFMSURfVElNRQogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIG11c3QgYmUgc2V0IGluIHRoZSBmdXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18wIC8vIDAKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ0CiAgICAvLyBmb3IgX3QgaW4gdXJhbmdlKHRpbWVfZXZlbnRzLmxlbmd0aCAtIDEpOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4OgogICAgcHVzaGludCA3NSAvLyA3NQogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxNAogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDI5IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMjkgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgYiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX3doaWxlX3RvcEA4Cgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX3doaWxlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjQ5CiAgICAvLyB0aW1lX2kgPSB0aW1lX2V2ZW50c1tfdF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgc3dhcAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gdGltZV9mID0gdGltZV9ldmVudHNbX3QgKyAxXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTEKICAgIC8vIGFzc2VydCB0aW1lX2YgPiB0aW1lX2ksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIDwKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1MgogICAgLy8gaWYgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiAhPSBVSW50NjQoY3N0LkRDQ19DT05UKToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBwdXNoaW50IDI1NSAvLyAyNTUKICAgICE9CiAgICBieiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUzLTI1NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUzLTI1NgogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gZGF5cyBmb3IgcmVndWxhciBkYXktY291bnQgY29udmVudGlvbnMKICAgIC8vIGFzc2VydCAodGltZV9mIC0gdGltZV9pKSAlIFVJbnQ2NCgKICAgIC8vICAgICBjc3QuREFZXzJfU0VDCiAgICAvLyApID09IDAsIGVyci5JTlZBTElEX1RJTUVfUEVSSU9ECiAgICBpbnRjIDYgLy8gODY0MDAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBUaW1lIHBlcmlvZHMgaW4gQWN0dWFsL0FjdHVhbCBkYXkgY291bnQgY29udmVudGlvbiBtdXN0IGJlIG11bHRpcGxlcyBvZiBhIGRheSAoaW4gc2Vjb25kcykKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKCmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfZm9yQDY6CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cyhzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiBieXRlcykgLT4gYnl0ZXM6CnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NTgtNTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKAogICAgLy8gICAgIHNlbGYsIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHM6IHR5cC5UaW1lRXZlbnRzCiAgICAvLyApIC0+IHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZToKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU3OQogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTA1CiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19FTkRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjIDcgLy8gMjAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgwCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3RhdHVzX2lzX2VuZGVkKCksIGVyci5VTkFVVEhPUklaRUQKICAgICEKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgxCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4MwogICAgLy8gYXNzZXJ0IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID49IDEsIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODQKICAgIC8vIGlmIHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHMubGVuZ3RoID4gMToKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODUKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMQogICAgZnJhbWVfYnVyeSAxCgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODcKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4OC01OTAKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU4Ny01OTAKICAgIC8vIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gPD0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODYtNTkxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgLy8gICAgIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX09QRU5JTkdfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBvcGVuaW5nIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTItNTk0CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5NQogICAgLy8gaWYgc2VsZi5tYXR1cml0eV9kYXRlOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGJ6IHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTcKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OQogICAgLy8gY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5OC02MDAKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU5Ny02MDAKICAgIC8vIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gPj0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYtNjAxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYubWF0dXJpdHlfZGF0ZQogICAgLy8gICAgID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vICAgICBdLm5hdGl2ZQogICAgLy8gKSwgZXJyLklOVkFMSURfU0VDT05EQVJZX0NMT1NVUkVfREFURQogICAgYXNzZXJ0IC8vIEludmFsaWQgc2Vjb25kYXJ5IG1hcmtldCBjbG9zdXJlIGRhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwMgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDItNjA0CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlID0gc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50c1sKICAgIC8vICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA3CiAgICAvLyBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjA2LTYwOAogICAgLy8gc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMAogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwOS02MTEKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDUtNjEyCiAgICAvLyByZXR1cm4gdHlwLlNlY29uZGFyeU1hcmtldFNjaGVkdWxlKAogICAgLy8gICAgIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzaWduX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMsIGNvbmZpZzogYnl0ZXMpIC0+IGJ5dGVzOgphc3NpZ25fcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxNC02MTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2lnbl9yb2xlKAogICAgLy8gICAgIHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4LCBjb25maWc6IGFyYzQuRHluYW1pY0J5dGVzCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzcKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM4CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgcHVzaGludCAyMCAvLyAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzOQogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQwCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0MQogICAgLy8gVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgcHVzaGludCA2MCAvLyA2MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM3LTY0NAogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0MgogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzctNjQ0CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IGFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQzCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBieiBhc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDcKCmFzc2lnbl9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18xIC8vIDEKCmFzc2lnbl9yb2xlX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNy02NDQKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ2CiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICBwdXNoaW50cyAyMCA0MCA1MCA2MCA3MCA4MCAvLyAyMCwgNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDUtNjc0CiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUik6CiAgICAvLyAgICAgICAgIHNlbGYuYXJyYW5nZXIudmFsdWUgPSByb2xlX2FkZHJlc3MubmF0aXZlCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0ICgKICAgIC8vICAgICAgICAgICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgICAgICAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gICAgICAgICApCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOSBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzJAMTEgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NAogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OAogICAgLy8gcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmludGVyZXN0X29yYWNsZQogICAgYnl0ZWMgMzAgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjctNjY5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3MQogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjcwLTY3MgogICAgLy8gc2VsZi5pbnRlcmVzdF9vcmFjbGVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgc3dhcAogICAgcmV0c3ViCgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV80QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY0CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNCAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjUKICAgIC8vIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNSAvLyAweDUyMzYzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjIKICAgIC8vIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU2CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI2IC8vIDB4NTIzNTMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1OAogICAgLy8gY29uZmlnLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU3LTY1OQogICAgLy8gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzFAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTAKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ5LTY1MQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTMKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1Mi02NTQKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ3CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgYnl0ZWMgMTcgLy8gMHg1MjMyMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9ib29sX2ZhbHNlQDc6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhc3NpZ25fcm9sZV9ib29sX21lcmdlQDgKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5yZXZva2Vfcm9sZShyb2xlX2FkZHJlc3M6IGJ5dGVzLCByb2xlOiBieXRlcykgLT4gYnl0ZXM6CnJldm9rZV9yb2xlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njc3LTY3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmV2b2tlX3JvbGUoc2VsZiwgcm9sZV9hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHJvbGU6IGFyYzQuVUludDgpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NgogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTcKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk4CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk5CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgcHVzaGludCA1MCAvLyA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk3LTcwMwogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogcmV2b2tlX3JvbGVfYm9vbF90cnVlQDUKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAxCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAgLy8gNzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAyCiAgICAvLyBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5Ny03MDMKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogcmV2b2tlX3JvbGVfYm9vbF9mYWxzZUA2CgpyZXZva2Vfcm9sZV9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgpyZXZva2Vfcm9sZV9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTctNzAzCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgYXNzZXJ0IC8vIEludmFsaWQgcm9sZSBpZGVudGlmaWVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDUtNzA2CiAgICAvLyAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyBjYXNlIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgcHVzaGludHMgNDAgNTAgNjAgNzAgODAgLy8gNDAsIDUwLCA2MCwgNzAsIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDQtNzIyCiAgICAvLyBtYXRjaCByb2xlLm5hdGl2ZToKICAgIC8vICAgICAjIEFycmFuZ2VyIHJvbGUgY2FuIG5vdCBiZSByZXZva2VkIChqdXN0IHJvdGF0ZWQpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BQ0NPVU5UX01BTkFHRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICAvLyAgICAgY2FzZSBfOgogICAgLy8gICAgICAgICBvcC5lcnIoKQogICAgZnJhbWVfZGlnIDAKICAgIG1hdGNoIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzBAOCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDkgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8zQDExIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMgogICAgLy8gb3AuZXJyKCkKICAgIGVycgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmludGVyZXN0X29yYWNsZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAzMCAvLyAweDUyMzgzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjAKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9JTlRFUkVTVF9PUkFDTEUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxNgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLmF1dGhvcml0eSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNCAvLyAweDUyMzczMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTcKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9BVVRIT1JJVFkgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjUgLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE0CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfVFJVU1RFRSArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8xQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTAKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTEKICAgIC8vIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9QUklNQVJZX0RFQUxFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MDcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjcgLy8gMHg1MjM0MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBiIHJldm9rZV9yb2xlX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLm9wZW5fYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKb3Blbl9hY2NvdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzI1LTcyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3Blbl9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBwYXltZW50X2FkZHJlc3M6IGFyYzQuQWRkcmVzcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ1CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA3IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDgKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5CiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUzCiAgICAvLyB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgYnl0ZWMgNiAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MS03NTcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdID0gdHlwLkFjY291bnRJbmZvKAogICAgLy8gICAgIHBheW1lbnRfYWRkcmVzcz1wYXltZW50X2FkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgLy8gKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTQKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDYgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU1CiAgICAvLyBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDYgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU2CiAgICAvLyBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICBieXRlYyAxMCAvLyAweDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTEtNzU3CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU4CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE5LTEyMAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNDMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIzLTEyNgogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNC0xMjUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQtMTI2CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjYKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50X21hbmFnZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyNS0xMjYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQtMTI2CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIyLTEyNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIC8vICAgICBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXJfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuY2xvc2VfYWNjb3VudChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKY2xvc2VfYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc2MC03NjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsb3NlX2FjY291bnQoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5UdXBsZVthcmM0LlVJbnQ2NCwgYXJjNC5VSW50NjRdOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NzgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzc5CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODIKICAgIC8vIGNsb3NlZF91bml0cyA9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzgzCiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVCArIGhvbGRpbmdfYWRkcmVzcy5ieXRlcykKICAgIHN3YXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzg0CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIC09IGNsb3NlZF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgIC0KICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4NQogICAgLy8gc2VsZi5lbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMoKQogICAgY2FsbHN1YiBlbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4NwogICAgLy8gKGFyYzQuVUludDY0KGNsb3NlZF91bml0cyksIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSkKICAgIGl0b2IKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4Ni03ODgKICAgIC8vIHJldHVybiBhcmM0LlR1cGxlKAogICAgLy8gICAgIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICAvLyApCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnByaW1hcnlfZGlzdHJpYnV0aW9uKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiBieXRlcykgLT4gYnl0ZXM6CnByaW1hcnlfZGlzdHJpYnV0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzkwLTc5MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcHJpbWFyeV9kaXN0cmlidXRpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHVuaXRzOiBhcmM0LlVJbnQ2NAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg0LTI4NwogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NS0yODYKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg3CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NwogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg2LTI4NwogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGZyYW1lX2RpZyAyCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg3CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODMtMjg4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuUFJJTUFSWV9ESVNUUklCVVRJT05fQ0xPU0VECiAgICBhc3NlcnQgLy8gUHJpbWFyeSBkaXN0cmlidXRpb24gaXMgY2xvc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzMKICAgIC8vIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICBieXRlYyAyNiAvLyAweDUyMzUzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzMtMTM2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM1CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNgogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJpbWFyeV9kZWFsZXIgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNS0xMzYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBiPj0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzNC0xMzYKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgaW50Y18xIC8vIDEKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfbWVyZ2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzItMTM3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnByaW1hcnlfZGVhbGVyCiAgICAvLyAgICAgYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgxOAogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MTkKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X3N1c3BlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIwCiAgICAvLyBhc3NlcnQgdW5pdHMubmF0aXZlID4gMCwgZXJyLlpFUk9fVU5JVFMKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gQ2FuIG5vdCBkaXN0cmlidXRlIHplcm8gdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyMgogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArIHVuaXRzLm5hdGl2ZSA8PSBzZWxmLnRvdGFsX3VuaXRzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjEtODIzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgLy8gKSwgZXJyLk9WRVJfRElTVFJJQlVUSU9OCiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJlbWFpbmluZyBELUFTQSB1bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI1CiAgICAvLyBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICs9IHVuaXRzLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNi04MjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjYKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyNi04MjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IGFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBzd2FwCiAgICByZXBsYWNlMiA0MAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMwCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyAtIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgLQogICAgaXRvYgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTI6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfYXNzZXRfc3VzcGVuc2lvbihzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2Fzc2V0X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzItODMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYXNzZXRfc3VzcGVuc2lvbihzZWxmLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbCkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0NgogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDcKICAgIC8vIHNlbGYuc3VzcGVuZGVkID0gVUludDY0KHN1c3BlbmRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDIwIC8vICJzdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eSgpIC0+IHZvaWQ6CmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ5LTE1MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGJ5dGVjIDI0IC8vIDB4NTIzNzMwMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gY2FsbGVyID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTMKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzLTE1NgogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NC0xNTUKICAgIC8vIGFuZCBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU2CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdXRob3JpdHkgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1NS0xNTYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU2CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUyLTE1NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIC8vICAgICBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHlfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2FjY291bnRfc3VzcGVuc2lvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBzdXNwZW5kZWQ6IGJ5dGVzKSAtPiBieXRlczoKc2V0X2FjY291bnRfc3VzcGVuc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg1MC04NTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9hY2NvdW50X3N1c3BlbnNpb24oCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHN1c3BlbmRlZDogYXJjNC5Cb29sCiAgICAvLyApIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjgKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGludGMgNCAvLyA0NDgKICAgIHN3YXAKICAgIHNldGJpdAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5zZXRfZGVmYXVsdF9zdGF0dXMoZGVmYXVsdGVkOiBieXRlcykgLT4gdm9pZDoKc2V0X2RlZmF1bHRfc3RhdHVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODczLTg3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2RlZmF1bHRfc3RhdHVzKHNlbGYsIGRlZmF1bHRlZDogYXJjNC5Cb29sKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBieXRlYyAyNSAvLyAweDUyMzYzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDMtMTQ2CiAgICAvLyBjYWxsZXIgaW4gc2VsZi50cnVzdGVlCiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYjw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDYKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJ1c3RlZSBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ1LTE0NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMAogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDQtMTQ2CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0Mi0xNDcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gICAgIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4ODUKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KGRlZmF1bHRlZC5uYXRpdmUpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ5dGVjIDIxIC8vICJkZWZhdWx0ZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgpzZXRfZGVmYXVsdF9zdGF0dXNfYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9pbmZvKCkgLT4gYnl0ZXM6CmdldF9hc3NldF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg3LTg4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X2luZm8oc2VsZikgLT4gdHlwLkFzc2V0SW5mbzoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODk4CiAgICAvLyBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTkKICAgIC8vIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgKgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAwCiAgICAvLyB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMQogICAgLy8gZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAyCiAgICAvLyBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pbnRlcmVzdF9yYXRlIGV4aXN0cwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwMwogICAgLy8gdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNAogICAgLy8gY2lyY3VsYXRpbmdfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTA2CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDUtOTA3CiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDkKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDgtOTEwCiAgICAvLyBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTEKICAgIC8vIGlzc3VhbmNlX2RhdGU9YXJjNC5VSW50NjQoc2VsZi5pc3N1YW5jZV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTIKICAgIC8vIG1hdHVyaXR5X2RhdGU9YXJjNC5VSW50NjQoc2VsZi5tYXR1cml0eV9kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTMKICAgIC8vIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIwIC8vICJzdXNwZW5kZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VzcGVuZGVkIGV4aXN0cwogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTQKICAgIC8vIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIxIC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTctOTE1CiAgICAvLyByZXR1cm4gdHlwLkFzc2V0SW5mbygKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ9YXJjNC5VSW50NjQoc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgLy8gKQogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBwdXNoaW50IDYwMSAvLyA2MDEKICAgIHN3YXAKICAgIHNldGJpdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X2FjY291bnRfaW5mbyhob2xkaW5nX2FkZHJlc3M6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X2FjY291bnRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNy05MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hY2NvdW50X2luZm8oc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MpIC0+IHR5cC5BY2NvdW50SW5mbzoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTcxCiAgICAvLyBhc3NlcnQgaG9sZGluZ19hZGRyZXNzIGluIHNlbGYuYWNjb3VudCwgZXJyLklOVkFMSURfSE9MRElOR19BRERSRVNTCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzMgogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3RpbWVfZXZlbnRzKCkgLT4gYnl0ZXM6CmdldF90aW1lX2V2ZW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkzNC05MzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF90aW1lX2V2ZW50cyhzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQyCiAgICAvLyB0aW1lX2V2ZW50cyA9IHR5cC5UaW1lRXZlbnRzKCkKICAgIHB1c2hieXRlcyAweDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDMKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ0CiAgICAvLyB0aW1lX2V2ZW50cyA9IHNlbGYudGltZV9ldmVudHMudmFsdWUuY29weSgpCiAgICBieXRlYyAyMyAvLyAweDc0Njk2ZDY1NDU3NjY1NmU3NDczCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDAKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRpbWVfZXZlbnRzIGV4aXN0cwoKZ2V0X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0NQogICAgLy8gcmV0dXJuIHRpbWVfZXZlbnRzCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKSAtPiBieXRlczoKZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDctOTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZShzZWxmKSAtPiB0eXAuVGltZUV2ZW50czoKICAgIHByb3RvIDAgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTUwCiAgICAvLyBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTEKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0OS05NTIKICAgIC8vIHJldHVybiB0eXAuVGltZUV2ZW50cygKICAgIC8vICAgICBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NChzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMgogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfbWV0YWRhdGEoKSAtPiBieXRlczoKZ2V0X2Fzc2V0X21ldGFkYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU0LTk1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2Fzc2V0X21ldGFkYXRhKHNlbGYpIC0+IHR5cC5Bc3NldE1ldGFkYXRhOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTYKICAgIC8vIHJldHVybiB0eXAuQXNzZXRNZXRhZGF0YShzZWxmLm1ldGFkYXRhKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vICJtZXRhZGF0YSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZXRhZGF0YSBleGlzdHMKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF91cGRhdGUoKSAtPiB2b2lkOgphc3NldF91cGRhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjYtNDY3CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzEtNDc0CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZ3JhbnRzIHRoZSB1cGRhdGUgcGVybWlzc2lvbnMgdG8gdGhlIEFycmFuZ2VyLgogICAgLy8gIyBPdGhlciBpbXBsZW1lbnRhdGlvbnMgbWF5IGRpc2FibGUgRC1BU0EgYXBwbGljYXRpb24gdXBkYXRhYmlsaXR5IG9yIGNoYW5nZSBpdHMgYXV0aG9yaXphdGlvbnMuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5fX2FsZ29weV9lbnRyeXBvaW50X3dpdGhfaW5pdCgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMTAwIDggNDQ4IDEwMDAwIDg2NDAwIDIwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjaXJjdWxhdGluZ191bml0cyIgMHg1MjMzMzAyMyAic3RhdHVzIiAibWF0dXJpdHlfZGF0ZSIgInNldHRsZW1lbnRfYXNzZXRfaWQiICJpc3N1YW5jZV9kYXRlIiAweDAwMDAwMDAwMDAwMDAwMDAgImludGVyZXN0X3JhdGUiICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiIDB4MDAgInVuaXRfdmFsdWUiICJkYXlfY291bnRfY29udmVudGlvbiIgInRvdGFsX3VuaXRzIiAidG90YWxfY291cG9ucyIgInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIiAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiIDB4NTIzMjMwMjMgImRlbm9taW5hdGlvbl9hc3NldF9pZCIgInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIgInN1c3BlbmRlZCIgImRlZmF1bHRlZCIgIm1ldGFkYXRhIiAweDc0Njk2ZDY1NDU3NjY1NmU3NDczIDB4NTIzNzMwMjMgMHg1MjM2MzAyMyAweDUyMzUzMDIzIDB4NTIzNDMwMjMgMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczIDB4MDY4MTAxIDB4NTIzODMwMjMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyAjIFJvbGUgQmFzZWQgQWNjZXNzIENvbnRyb2wKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWMgMTcgLy8gMHg1MjMyMzAyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTktNjAKICAgIC8vICMgQXNzZXQgQ29uZmlndXJhdGlvbgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMTggLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjEKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IFVJbnQ2NCgpCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MgogICAgLy8gc2VsZi51bml0X3ZhbHVlID0gVUludDY0KCkKICAgIGJ5dGVjIDExIC8vICJ1bml0X3ZhbHVlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MwogICAgLy8gc2VsZi5kYXlfY291bnRfY29udmVudGlvbiA9IFVJbnQ2NCgpCiAgICBieXRlYyAxMiAvLyAiZGF5X2NvdW50X2NvbnZlbnRpb24iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1LTY2CiAgICAvLyAjIE1ldGFkYXRhCiAgICAvLyBzZWxmLm1ldGFkYXRhID0gQnl0ZXMoKQogICAgYnl0ZWMgMjIgLy8gIm1ldGFkYXRhIgogICAgcHVzaGJ5dGVzIDB4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjgtNjkKICAgIC8vICMgU3VwcGx5CiAgICAvLyBzZWxmLnRvdGFsX3VuaXRzID0gVUludDY0KCkKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgPSBVSW50NjQoKQogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyLTczCiAgICAvLyAjIEludGVyZXN0CiAgICAvLyBzZWxmLmludGVyZXN0X3JhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgOCAvLyAiaW50ZXJlc3RfcmF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzcKICAgIC8vIHNlbGYudG90YWxfY291cG9ucyA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNCAvLyAidG90YWxfY291cG9ucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODIKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gVUludDY0KCkKICAgIGJ5dGVjIDE5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODUKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IFVJbnQ2NCgpCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSBVSW50NjQoKQogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODktOTAKICAgIC8vICMgU3RhdHVzCiAgICAvLyBzZWxmLnN0YXR1cyA9IFVJbnQ2NChjZmcuU1RBVFVTX0VNUFRZKQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MQogICAgLy8gc2VsZi5zdXNwZW5kZWQgPSBVSW50NjQoKQogICAgYnl0ZWMgMjAgLy8gInN1c3BlbmRlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTIKICAgIC8vIHNlbGYuZGVmYXVsdGVkID0gVUludDY0KCkKICAgIGJ5dGVjIDIxIC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjM1LTM2CiAgICAvLyAjIFN0YXRlIHNjaGVtYSB2YWxpZGF0aW9uCiAgICAvLyBhc3NlcnQgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBXcm9uZyBHbG9iYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MzcKICAgIC8vIGFzc2VydCBUeG4uZ2xvYmFsX251bV91aW50ID09IGNmZy5HTE9CQUxfVUlOVFMsIGVyci5XUk9OR19HTE9CQUxfVUlOVFMKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDE3IC8vIDE3CiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIEdsb2JhbCBVSW50cyBhbGxvY2F0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTozOAogICAgLy8gYXNzZXJ0IFR4bi5sb2NhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuTE9DQUxfQllURVMsIGVyci5XUk9OR19MT0NBTF9CWVRFUwogICAgdHhuIExvY2FsTnVtQnl0ZVNsaWNlCiAgICAhCiAgICBhc3NlcnQgLy8gV3JvbmcgTG9jYWwgQnl0ZXMgYWxsb2NhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MzkKICAgIC8vIGFzc2VydCBUeG4ubG9jYWxfbnVtX3VpbnQgPT0gY2ZnLkxPQ0FMX1VJTlRTLCBlcnIuV1JPTkdfTE9DQUxfVUlOVFMKICAgIHR4biBMb2NhbE51bVVpbnQKICAgICEKICAgIGFzc2VydCAvLyBXcm9uZyBMb2NhbCBVSW50cyBhbGxvY2F0aW9uCgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAMjUKICAgIHB1c2hieXRlc3MgMHg0ZmQ2YTNjYyAweDljNzZiNmEzIDB4NDQzNjNkNDkgMHg2N2RiNGYyMCAweDYzZjk5NTg5IDB4ZDNhNGQ2YWIgMHgxZDZmYzI1NSAweGZlZjc0NTY3IDB4YjhmYzEzOTAgMHgzZDQzZDFmMCAweGViZDk2YjJmIDB4NmM4NWUzZWUgMHhmNjNhY2U4ZCAweGJiY2NhMThhIDB4MWE3YmFiYjQgMHg4MGJmY2RkMSAweGVkMDI3NTlmIDB4ZmFkMjE3M2UgMHgwOGVmZWEzNSAweGRkY2VjMDdiIC8vIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInBheV9wcmluY2lwYWwoYWRkcmVzcyxieXRlW10pKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSIsIG1ldGhvZCAiZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShhZGRyZXNzLHVpbnQ2NCkodWludDY0LHVpbnQ2NCwodWludDY0LHVpbnQ2NCkpIiwgbWV0aG9kICJnZXRfcGF5bWVudF9hbW91bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImFzc2V0X2NyZWF0ZShhZGRyZXNzLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJhc3NldF9jb25maWcodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQxNix1aW50MTZbXSx1aW50NjRbXSwodWludDY0LHVpbnQ2NClbXSl2b2lkIiwgbWV0aG9kICJzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzKHVpbnQ2NFtdKSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiYXNzaWduX3JvbGUoYWRkcmVzcyx1aW50OCxieXRlW10pdWludDY0IiwgbWV0aG9kICJyZXZva2Vfcm9sZShhZGRyZXNzLHVpbnQ4KXVpbnQ2NCIsIG1ldGhvZCAib3Blbl9hY2NvdW50KGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImNsb3NlX2FjY291bnQoYWRkcmVzcykodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInByaW1hcnlfZGlzdHJpYnV0aW9uKGFkZHJlc3MsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAic2V0X2Fzc2V0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInNldF9hY2NvdW50X3N1c3BlbnNpb24oYWRkcmVzcyxib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0X2RlZmF1bHRfc3RhdHVzKGJvb2wpdm9pZCIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDE2LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJvb2wsYm9vbCkiLCBtZXRob2QgImdldF9hY2NvdW50X2luZm8oYWRkcmVzcykoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCxib29sKSIsIG1ldGhvZCAiZ2V0X3RpbWVfZXZlbnRzKCl1aW50NjRbXSIsIG1ldGhvZCAiZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUoKXVpbnQ2NFtdIiwgbWV0aG9kICJnZXRfYXNzZXRfbWV0YWRhdGEoKWJ5dGVbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fYXNzZXRfdHJhbnNmZXJfcm91dGVANSBtYWluX3BheV9wcmluY2lwYWxfcm91dGVANiBtYWluX2dldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfcm91dGVANyBtYWluX2dldF9wYXltZW50X2Ftb3VudF9yb3V0ZUA4IG1haW5fYXNzZXRfY3JlYXRlX3JvdXRlQDkgbWFpbl9hc3NldF9jb25maWdfcm91dGVAMTAgbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDExIG1haW5fYXNzaWduX3JvbGVfcm91dGVAMTIgbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUAxMyBtYWluX29wZW5fYWNjb3VudF9yb3V0ZUAxNCBtYWluX2Nsb3NlX2FjY291bnRfcm91dGVAMTUgbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxNiBtYWluX3NldF9hc3NldF9zdXNwZW5zaW9uX3JvdXRlQDE3IG1haW5fc2V0X2FjY291bnRfc3VzcGVuc2lvbl9yb3V0ZUAxOCBtYWluX3NldF9kZWZhdWx0X3N0YXR1c19yb3V0ZUAxOSBtYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDIwIG1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAyMSBtYWluX2dldF90aW1lX2V2ZW50c19yb3V0ZUAyMiBtYWluX2dldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlX3JvdXRlQDIzIG1haW5fZ2V0X2Fzc2V0X21ldGFkYXRhX3JvdXRlQDI0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl9nZXRfYXNzZXRfbWV0YWRhdGFfcm91dGVAMjQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hc3NldF9tZXRhZGF0YQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZV9yb3V0ZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X3NlY29uZGFyeV9tYXJrZXRfc2NoZWR1bGUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X3RpbWVfZXZlbnRzX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2FjY291bnRfaW5mb19yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfYWNjb3VudF9pbmZvCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldF9hc3NldF9pbmZvX3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXRfaW5mbwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfZGVmYXVsdF9zdGF0dXNfcm91dGVAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2RlZmF1bHRfc3RhdHVzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldF9hY2NvdW50X3N1c3BlbnNpb25fcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOS0yNwogICAgLy8gY2xhc3MgWmVyb0NvdXBvbkJvbmQoCiAgICAvLyAgICAgQmFzZURBc2EsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKAogICAgLy8gICAgICAgICBnbG9iYWxfYnl0ZXM9Y2ZnLkdMT0JBTF9CWVRFUywKICAgIC8vICAgICAgICAgZ2xvYmFsX3VpbnRzPWNmZy5HTE9CQUxfVUlOVFMsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPWNmZy5MT0NBTF9CWVRFUywKICAgIC8vICAgICAgICAgbG9jYWxfdWludHM9Y2ZnLkxPQ0FMX1VJTlRTLAogICAgLy8gICAgICksCiAgICAvLyApOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2FjY291bnRfc3VzcGVuc2lvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfYXNzZXRfc3VzcGVuc2lvbl9yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBzZXRfYXNzZXRfc3VzcGVuc2lvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbG9zZV9hY2NvdW50X3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNsb3NlX2FjY291bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fb3Blbl9hY2NvdW50X3JvdXRlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG9wZW5fYWNjb3VudAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9yZXZva2Vfcm9sZV9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiByZXZva2Vfcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NpZ25fcm9sZV9yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NpZ25fcm9sZQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX3JvdXRlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfY29uZmlnX3JvdXRlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ3NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFzc2V0X2NvbmZpZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hc3NldF9jcmVhdGVfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ1MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGFzc2V0X2NyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRfcGF5bWVudF9hbW91bnRfcm91dGVAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5LTI3CiAgICAvLyBjbGFzcyBaZXJvQ291cG9uQm9uZCgKICAgIC8vICAgICBCYXNlREFzYSwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgY2FsbHN1YiBnZXRfcGF5bWVudF9hbW91bnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcGF5X3ByaW5jaXBhbF9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjExOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHBheV9wcmluY2lwYWwKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYXNzZXRfdHJhbnNmZXJfcm91dGVANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfdHJhbnNmZXIKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDI1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTktMjcKICAgIC8vIGNsYXNzIFplcm9Db3Vwb25Cb25kKAogICAgLy8gICAgIEJhc2VEQXNhLAogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHB1c2hpbnQgNCAvLyA0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBtYWluX2Fzc2V0X3VwZGF0ZUAyNgogICAgYiBtYWluX2FmdGVyX2lmX2Vsc2VAMjcKCm1haW5fYXNzZXRfdXBkYXRlQDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDY0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjQtNDY1CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIGFzc2V0X3VwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgY2FsbHN1YiBhc3NldF91cGRhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5hc3NldF90cmFuc2ZlcihzZW5kZXJfaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXRfdHJhbnNmZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo3NS04MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzZXRfdHJhbnNmZXIoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgICAgcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsCiAgICAvLyAgICAgdW5pdHM6IGFyYzQuVUludDY0LAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gdW5pdHMubmF0aXZlLAogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0dXMgZXhpc3RzCiAgICBpbnRjXzIgLy8gMTAwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjkzLTI5NgogICAgLy8gc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vIGFuZCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBieiBhc3NldF90cmFuc2Zlcl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5NAogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNSAvLyAic2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0LTI5NQogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0LTI5NgogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk2CiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyOTUtMjk2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICBmcmFtZV9kaWcgNAogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjk0LTI5NgogICAgLy8gYW5kIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI5Mi0yOTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCkKICAgIC8vICAgICBhbmQgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLCBlcnIuU0VDT05EQVJZX01BUktFVF9DTE9TRUQKICAgIGFzc2VydCAvLyBTZWNvbmRhcnkgbWFya2V0IGlzIGNsb3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzY3LTM2OQogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGdyYW50cyB0cmFuc2ZlciByaWdodCB0byBELUFTQSBvd25lcnMuIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgcmVsYXkgb24gb3RoZXIKICAgIC8vICMgcm9sZXMsIGV4dGVybmFsIEFwcHMgdGhyb3VnaCBDMkMgY2FsbHMgKGUuZy4sIGFuIG9yZGVyIGJvb2spLCBvciBvZmYtY2hhaW4gdHJhbnNmZXIgYWdlbnRzLgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VuZGVyX2hvbGRpbmdfYWRkcmVzcy5uYXRpdmUsIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzcwCiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3MQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X3N1c3BlbmRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3Rfc3VzcGVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM3NAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10uc3VzcGVuZGVkLm5hdGl2ZSwgZXJyLlNVU1BFTkRFRAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBpbnRjIDQgLy8gNDQ4CiAgICBnZXRiaXQKICAgIGJ5dGVjIDEwIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgIQogICAgYXNzZXJ0IC8vIFN1c3BlbmRlZCBvcGVyYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNzUtMzc3CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuYWNjb3VudFsKICAgIC8vICAgICByZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0uc3VzcGVuZGVkLm5hdGl2ZSwgZXJyLlNVU1BFTkRFRAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50YyA0IC8vIDQ0OAogICAgZ2V0Yml0CiAgICBieXRlYyAxMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgICEKICAgIGFzc2VydCAvLyBTdXNwZW5kZWQgb3BlcmF0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc5CiAgICAvLyB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyA1CiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzc4LTM4MAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB1bml0cyA8PSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuT1ZFUl9UUkFOU0ZFUgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBzZW5kZXIgdW5pdHMgdG8gdHJhbnNmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM4OAogICAgLy8gc2VuZGVyX3VuaXRfdmFsdWUgPSBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZQogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzg5CiAgICAvLyBpZiBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgPiAwOgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0LTMwNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gYW5kIHNlbGYuYWNjb3VudFtzZW5kZXJdLnBhaWRfY291cG9ucyA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnBhaWRfY291cG9ucwogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDQ4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGI9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzA0LTMwNQogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl0udW5pdF92YWx1ZSA9PSBzZWxmLmFjY291bnRbcmVjZWl2ZXJdLnVuaXRfdmFsdWUKICAgIC8vIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VAMTQKICAgIGludGNfMSAvLyAxCgphc3NldF90cmFuc2Zlcl9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzAzLTMwNgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmFjY291bnRbc2VuZGVyXS51bml0X3ZhbHVlID09IHNlbGYuYWNjb3VudFtyZWNlaXZlcl0udW5pdF92YWx1ZQogICAgLy8gICAgIGFuZCBzZWxmLmFjY291bnRbc2VuZGVyXS5wYWlkX2NvdXBvbnMgPT0gc2VsZi5hY2NvdW50W3JlY2VpdmVyXS5wYWlkX2NvdXBvbnMKICAgIC8vICksIGVyci5OT05fRlVOR0lCTEVfVU5JVFMKICAgIGFzc2VydCAvLyBTZW5kZXIgYW5kIHJlY2VpdmVyIHVuaXRzIGFyZSBub3QgZnVuZ2libGUKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMDgtMTA5CiAgICAvLyAjIFRyYW5zZmVycmVkIHVuaXRzIHZhbHVlIChtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSB0aGUgdHJhbnNmZXIpCiAgICAvLyBzZW5kZXJfdW5pdF92YWx1ZSA9IHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA0MCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxMTAtMTEyCiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gc2VsZi5hY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZW5kZXJfaG9sZGluZ19hZGRyZXNzLCB1bml0cy5uYXRpdmUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY292ZXIgMwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MjUKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgLSB1bml0cwogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDIKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNC00MjYKICAgIC8vIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtzZW5kZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgLSB1bml0cwogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI0CiAgICAvLyBzZWxmLmFjY291bnRbc2VuZGVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI0LTQyNgogICAgLy8gc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3NlbmRlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSAtIHVuaXRzCiAgICAvLyApCiAgICBzd2FwCiAgICByZXBsYWNlMiAzMgogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyOAogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICB1bmNvdmVyIDMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNy00MjkKICAgIC8vIHNlbGYuYWNjb3VudFtyZWNlaXZlcl9ob2xkaW5nX2FkZHJlc3NdLnVuaXRzID0gYXJjNC5VSW50NjQoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlICsgdW5pdHMKICAgIC8vICkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQyNwogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDI3LTQyOQogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdHMgPSBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUgKyB1bml0cwogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gaWYgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlID09IDA6CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYm56IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1MgogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IGFyYzQuVUludDY0KCkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgcmVwbGFjZTIgNDAKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNTMKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBhaWRfY291cG9ucyA9IGFyYzQuVUludDY0KCkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiA0OAogICAgYm94X3B1dAoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHVuaXRzLm5hdGl2ZSAqIHNlbmRlcl91bml0X3ZhbHVlLm5hdGl2ZSArIGFjY3J1ZWRfaW50ZXJlc3QpCiAgICBmcmFtZV9kaWcgMAogICAgYnRvaQogICAgZnJhbWVfZGlnIDUKICAgICoKICAgIGZyYW1lX2RpZyAzCiAgICArCiAgICBpdG9iCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKYXNzZXRfdHJhbnNmZXJfYm9vbF9mYWxzZUAxNDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VAMTUKCmFzc2V0X3RyYW5zZmVyX2Vsc2VfYm9keUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NAogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10udW5pdF92YWx1ZSA9IHNlbmRlcl91bml0X3ZhbHVlCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIHJlcGxhY2UyIDQwCiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mzk1LTM5NwogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgLy8gICAgIHNlbmRlcl9ob2xkaW5nX2FkZHJlc3MKICAgIC8vIF0ucGFpZF9jb3Vwb25zCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM5NQogICAgLy8gc2VsZi5hY2NvdW50W3JlY2VpdmVyX2hvbGRpbmdfYWRkcmVzc10ucGFpZF9jb3Vwb25zID0gc2VsZi5hY2NvdW50WwogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozOTUtMzk3CiAgICAvLyBzZWxmLmFjY291bnRbcmVjZWl2ZXJfaG9sZGluZ19hZGRyZXNzXS5wYWlkX2NvdXBvbnMgPSBzZWxmLmFjY291bnRbCiAgICAvLyAgICAgc2VuZGVyX2hvbGRpbmdfYWRkcmVzcwogICAgLy8gXS5wYWlkX2NvdXBvbnMKICAgIHN3YXAKICAgIGV4dHJhY3QgNDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHJlcGxhY2UyIDQ4CiAgICBib3hfcHV0CiAgICBiIGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTcKCmFzc2V0X3RyYW5zZmVyX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X3RyYW5zZmVyX2Jvb2xfbWVyZ2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9pc19ub3RfZGVmYXVsdGVkKCkgLT4gdm9pZDoKYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDctMTA4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIxIC8vICJkZWZhdWx0ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVmYXVsdGVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIERlZmF1bHRlZAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoKSAtPiB2b2lkOgphc3NlcnRfaXNfbm90X3N1c3BlbmRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExMS0xMTIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTEzCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuc3VzcGVuZGVkLCBlcnIuU1VTUEVOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gU3VzcGVuZGVkIG9wZXJhdGlvbnMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy56ZXJvX2NvdXBvbl9ib25kLmNvbnRyYWN0Llplcm9Db3Vwb25Cb25kLmFjY3J1ZWRfaW50ZXJlc3RfYW1vdW50KGhvbGRpbmdfYWRkcmVzczogYnl0ZXMsIHVuaXRzOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWNjcnVlZF9pbnRlcmVzdF9hbW91bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1OS02MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IFVJbnQ2NAogICAgLy8gKSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBkYXlfY291bnRfZmFjdG9yID0gc2VsZi5kYXlfY291bnRfZmFjdG9yKCkKICAgIGNhbGxzdWIgZGF5X2NvdW50X2ZhY3RvcgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NjQKICAgIC8vIGFjY3J1ZWRfcGVyaW9kID0gZGF5X2NvdW50X2ZhY3Rvci5udW1lcmF0b3IubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NjUKICAgIC8vIHByaW5jaXBhbF9wZXJpb2QgPSBkYXlfY291bnRfZmFjdG9yLmRlbm9taW5hdG9yLm5hdGl2ZQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2NwogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhY2NvdW50X3VuaXRzX3ZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2OAogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo2Ny02OAogICAgLy8gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAqIHNlbGYuaW50ZXJlc3RfcmF0ZQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NjctNjkKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vICogYWNjcnVlZF9wZXJpb2QKICAgIHVuY292ZXIgMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NzEKICAgIC8vIGNzdC5CUFMgKiBwcmluY2lwYWxfcGVyaW9kCiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIHVuY292ZXIgMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NjctNzIKICAgIC8vIHNlbGYuYWNjb3VudF91bml0c192YWx1ZShob2xkaW5nX2FkZHJlc3MsIHVuaXRzKQogICAgLy8gKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vICogYWNjcnVlZF9wZXJpb2QKICAgIC8vIC8vICgKICAgIC8vICAgICBjc3QuQlBTICogcHJpbmNpcGFsX3BlcmlvZAogICAgLy8gKSAgIyBkaXYtYnktemVybzogcHJpbmNpcGFsX3BlcmlvZCAhPSAwIGR1ZSB0byBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkIGNoZWNrcwogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NjYtNzMKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcywgdW5pdHMpCiAgICAvLyAgICAgKiBzZWxmLmludGVyZXN0X3JhdGUKICAgIC8vICAgICAqIGFjY3J1ZWRfcGVyaW9kCiAgICAvLyAgICAgLy8gKAogICAgLy8gICAgICAgICBjc3QuQlBTICogcHJpbmNpcGFsX3BlcmlvZAogICAgLy8gICAgICkgICMgZGl2LWJ5LXplcm86IHByaW5jaXBhbF9wZXJpb2QgIT0gMCBkdWUgdG8gYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCBjaGVja3MKICAgIC8vICkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy56ZXJvX2NvdXBvbl9ib25kLmNvbnRyYWN0Llplcm9Db3Vwb25Cb25kLmRheV9jb3VudF9mYWN0b3IoKSAtPiBieXRlczoKZGF5X2NvdW50X2ZhY3RvcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQxLTQyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGRheV9jb3VudF9mYWN0b3Ioc2VsZikgLT4gdHlwLkRheUNvdW50RmFjdG9yOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0My00NAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIG9ubHkgdGhlIEFjdHVhbC9BY3R1YWwgYW5kIENvbnRpbnVvdXMgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhY2NydWVkX3BlcmlvZCA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIC0gc2VsZi5pc3N1YW5jZV9kYXRlCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgLQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0NQogICAgLy8gcHJpbmNpcGFsX3BlcmlvZCA9IHNlbGYubWF0dXJpdHlfZGF0ZSAtIHNlbGYuaXNzdWFuY2VfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAtCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyBpZiBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uID09IFVJbnQ2NChjc3QuRENDX0FfQSk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGJ6IGRheV9jb3VudF9mYWN0b3JfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDcKICAgIC8vIHJldHVybiB0aW1lX3BlcmlvZCAvLyBVSW50NjQoY3N0LkRBWV8yX1NFQykKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjIDYgLy8gODY0MDAKICAgIC8KICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjIDYgLy8gODY0MDAKICAgIC8KICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfYnVyeSAzCgpkYXlfY291bnRfZmFjdG9yX2FmdGVyX2lmX2Vsc2VAMjoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6NTAKICAgIC8vIG51bWVyYXRvcj1hcmM0LlVJbnQ2NChhY2NydWVkX3BlcmlvZCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1MQogICAgLy8gZGVub21pbmF0b3I9YXJjNC5VSW50NjQocHJpbmNpcGFsX3BlcmlvZCksCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo0OS01MgogICAgLy8gcmV0dXJuIHR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQoYWNjcnVlZF9wZXJpb2QpLAogICAgLy8gICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KHByaW5jaXBhbF9wZXJpb2QpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFjY291bnRfdW5pdHNfdmFsdWUoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgdW5pdHM6IHVpbnQ2NCkgLT4gdWludDY0OgphY2NvdW50X3VuaXRzX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzMzLTMzNgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogVUludDY0CiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzM3CiAgICAvLyByZXR1cm4gdW5pdHMgKiBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0X3ZhbHVlLm5hdGl2ZQogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgNDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnplcm9fY291cG9uX2JvbmQuY29udHJhY3QuWmVyb0NvdXBvbkJvbmQucGF5X3ByaW5jaXBhbChob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCBwYXltZW50X2luZm86IGJ5dGVzKSAtPiBieXRlczoKcGF5X3ByaW5jaXBhbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjExOS0xMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHBheV9wcmluY2lwYWwoCiAgICAvLyAgICAgc2VsZiwgaG9sZGluZ19hZGRyZXNzOiBhcmM0LkFkZHJlc3MsIHBheW1lbnRfaW5mbzogYXJjNC5EeW5hbWljQnl0ZXMKICAgIC8vICkgLT4gdHlwLlBheW1lbnRSZXN1bHQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfQUNUSVZFCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzQtNDM1CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgcmVzdHJpY3QgY2FsbGVyIGF1dGhvcml6YXRpb24KICAgIC8vIGFzc2VydCBzZWxmLnN0YXR1c19pc19hY3RpdmUoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzYKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDM3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwbiAyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0MzkKICAgIC8vIHVuaXRzID0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDAKICAgIC8vIGFzc2VydCB1bml0cyA+IDAsIGVyci5OT19VTklUUwogICAgYXNzZXJ0IC8vIE5vIEQtQVNBIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDEKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLm1hdHVyaXR5X2RhdGUsIGVyci5OT1RfTUFUVVJFCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAibWF0dXJpdHlfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXR1cml0eV9kYXRlIGV4aXN0cwogICAgPj0KICAgIGFzc2VydCAvLyBOb3QgbWF0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTEKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnBheW1lbnRfYWRkcmVzcy5uYXRpdmUuaXNfb3B0ZWRfaW4oCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzEyCiAgICAvLyBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzExLTMxMwogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICAvLyApCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzExLTMxNAogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10ucGF5bWVudF9hZGRyZXNzLm5hdGl2ZS5pc19vcHRlZF9pbigKICAgIC8vICAgICBBc3NldChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpCiAgICAvLyApCiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUKICAgIGJ6IHBheV9wcmluY2lwYWxfYm9vbF9mYWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzE0CiAgICAvLyBhbmQgbm90IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZC5uYXRpdmUKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgaW50YyA0IC8vIDQ0OAogICAgZ2V0Yml0CiAgICBieXRlYyAxMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJueiBwYXlfcHJpbmNpcGFsX2Jvb2xfZmFsc2VAMTYKICAgIGludGNfMSAvLyAxCgpwYXlfcHJpbmNpcGFsX2Jvb2xfbWVyZ2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDQKICAgIC8vIGlmIHNlbGYuaXNfcGF5bWVudF9leGVjdXRhYmxlKGhvbGRpbmdfYWRkcmVzcyk6CiAgICBieiBwYXlfcHJpbmNpcGFsX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDUKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyMAogICAgLy8gQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKS5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzIwLTMyMQogICAgLy8gQXNzZXQoc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkKS5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICAvLyA+PSBwYXltZW50X2Ftb3VudAogICAgZGlnIDEKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMTktMzIyCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEFzc2V0KHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCkuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgLy8gICAgID49IHBheW1lbnRfYW1vdW50CiAgICAvLyApLCBlcnIuTk9UX0VOT1VHSF9GVU5EUwogICAgYXNzZXJ0IC8vIE5vdCBlbm91Z2ggZnVuZHMgZm9yIHRoZSBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxNDgtMTQ5CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIHRoZSBzYW1lIGFzc2V0IGZvciBkZW5vbWluYXRpb24gYW5kIHNldHRsZW1lbnQsIG5vIGNvbnZlcnNpb24gbmVlZGVkCiAgICAvLyBzZWxmLnBheShzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS5wYXltZW50X2FkZHJlc3MsIHBheW1lbnRfYW1vdW50KQogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozMjYtMzMxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIubmF0aXZlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzMAogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyNwogICAgLy8geGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAic2V0dGxlbWVudF9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkIGV4aXN0cwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMyNgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzI2LTMzMQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLm5hdGl2ZSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKcGF5X3ByaW5jaXBhbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NDgKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgLT0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLQogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDQ5CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KCkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICByZXBsYWNlMiAzMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUwCiAgICAvLyBzZWxmLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpCiAgICBjYWxsc3ViIGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTU2CiAgICAvLyBhbW91bnQ9YXJjNC5VSW50NjQocGF5bWVudF9hbW91bnQpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTU3CiAgICAvLyB0aW1lc3RhbXA9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTU1LTE1OQogICAgLy8gcmV0dXJuIHR5cC5QYXltZW50UmVzdWx0KAogICAgLy8gICAgIGFtb3VudD1hcmM0LlVJbnQ2NChwYXltZW50X2Ftb3VudCksCiAgICAvLyAgICAgdGltZXN0YW1wPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICAgICBjb250ZXh0PXBheW1lbnRfaW5mby5jb3B5KCksICAjIFRPRE86IEFkZCBpbmZvIG9uIGZhaWxlZCBwYXltZW50CiAgICAvLyApCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHJldHN1YgoKcGF5X3ByaW5jaXBhbF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE1MS0xNTIKICAgIC8vICMgQWNjb3VudHMgc3VzcGVuZGVkIG9yIG5vdCBvcHRlZCBpbiBhdCB0aGUgdGltZSBvZiBwYXltZW50cyBtdXN0IG5vdCBzdGFsbCB0aGUgRC1BU0EKICAgIC8vIHBheW1lbnRfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICBiIHBheV9wcmluY2lwYWxfYWZ0ZXJfaWZfZWxzZUAzCgpwYXlfcHJpbmNpcGFsX2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBwYXlfcHJpbmNpcGFsX2Jvb2xfbWVyZ2VAMTcKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IHVpbnQ2NDoKYWNjb3VudF90b3RhbF91bml0c192YWx1ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjMzOS0zNDAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWNjb3VudF90b3RhbF91bml0c192YWx1ZShzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTozNDIKICAgIC8vIGhvbGRpbmdfYWRkcmVzcywgc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICBieXRlY18yIC8vIDB4NTIzMzMwMjMKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MzQxLTM0MwogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF91bml0c192YWx1ZSgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIGFjY291bnRfdW5pdHNfdmFsdWUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0cygpIC0+IHZvaWQ6CmVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1NS0zNTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1NwogICAgLy8gaWYgc2VsZi5jaXJjdWxhdGluZ191bml0cyA9PSAwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgYm56IGVuZF9pZl9ub19jaXJjdWxhdGluZ191bml0c19hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjM1OAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19FTkRFRCkKICAgIGJ5dGVjXzMgLy8gInN0YXR1cyIKICAgIGludGMgNyAvLyAyMDAKICAgIGFwcF9nbG9iYWxfcHV0CgplbmRfaWZfbm9fY2lyY3VsYXRpbmdfdW5pdHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLnplcm9fY291cG9uX2JvbmQuY29udHJhY3QuWmVyb0NvdXBvbkJvbmQuZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZShob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTYxLTE2NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgdW5pdHM6IGFyYzQuVUludDY0CiAgICAvLyApIC0+IHR5cC5DdXJyZW50VW5pdHNWYWx1ZToKICAgIHByb3RvIDIgMQogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4MS0xODIKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxODIKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUgZXhpc3RzCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTgxLTE4MgogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIGFuZCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+PSBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4MC0xODMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICAgICBhbmQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vICksIGVyci5OT19QUklNQVJZX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIG5vdCB5ZXQgZXhlY3V0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE4NgogICAgLy8gMCA8IHVuaXRzIDw9IHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYj4KICAgIGJ6IGdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3CiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMQogICAgYj49CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VANwogICAgaW50Y18xIC8vIDEKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg1LTE4NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICAwIDwgdW5pdHMgPD0gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10udW5pdHMubmF0aXZlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9VTklUUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYW1vdW50IG9mIHVuaXRzIGZvciB0aGUgYWNjb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTkwCiAgICAvLyBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MTg5LTE5MQogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlID0gc2VsZi5hY2NvdW50X3VuaXRzX3ZhbHVlKAogICAgLy8gICAgIGhvbGRpbmdfYWRkcmVzcywgdW5pdHMubmF0aXZlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNhbGxzdWIgYWNjb3VudF91bml0c192YWx1ZQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlICogc2VsZi5pbnRlcmVzdF9yYXRlIC8vIGNzdC5CUFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBkaWcgMQogICAgKgogICAgaW50YyA1IC8vIDEwMDAwCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToxOTgKICAgIC8vIGFjY291bnRfdW5pdHNfbm9taW5hbF92YWx1ZSAtIGFjY291bnRfdW5pdHNfZGlzY291bnQKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjE5Ni0xOTkKICAgIC8vICMgVmFsdWUgZHVyaW5nIHByaW1hcnkgZGlzdHJpYnV0aW9uCiAgICAvLyBhY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWUgPSAoCiAgICAvLyAgICAgYWNjb3VudF91bml0c19ub21pbmFsX3ZhbHVlIC0gYWNjb3VudF91bml0c19kaXNjb3VudAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDEtMjAyCiAgICAvLyAjIEFjY3J1aW5nIGludGVyZXN0IGR1cmluZyBwcmltYXJ5IGRpc3RyaWJ1dGlvbiBhbmQgYXQgbWF0dXJpdHkKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3QgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjAzCiAgICAvLyBudW1lcmF0b3IgPSBVSW50NjQoKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjA0CiAgICAvLyBkZW5vbWluYXRvciA9IFVJbnQ2NCgpCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weTo1Ni01NwogICAgLy8gIyBUaGUgY2hlY2sgb24gbWF0dXJpdHkgZGF0ZSBlbnN1cmVzIEQtQVNBIGhhcyBiZWVuIGNvbmZpZ3VyZWQgYXMgYmxvY2sgdGltZXN0YW1wIGNhbm5vdCBiZSBsZXNzIHRoYW4gMCAoaW5pdCkuCiAgICAvLyByZXR1cm4gc2VsZi5pc3N1YW5jZV9kYXRlIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDwgc2VsZi5tYXR1cml0eV9kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pc3N1YW5jZV9kYXRlIGV4aXN0cwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIDw9CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMTYKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgNAogICAgPgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX2ZhbHNlQDE2CiAgICBpbnRjXzEgLy8gMQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjA2LTIwNwogICAgLy8gIyBBY2NydWluZyBpbnRlcmVzdAogICAgLy8gaWYgc2VsZi5pc19hY2NydWluZ19pbnRlcmVzdCgpOgogICAgYnogZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDgKICAgIC8vIGRheV9jb3VudF9mYWN0b3IgPSBzZWxmLmRheV9jb3VudF9mYWN0b3IoKQogICAgY2FsbHN1YiBkYXlfY291bnRfZmFjdG9yCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMDktMjExCiAgICAvLyBhY2NydWVkX2ludGVyZXN0ID0gc2VsZi5hY2NydWVkX2ludGVyZXN0X2Ftb3VudCgKICAgIC8vICAgICBob2xkaW5nX2FkZHJlc3MsIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgNwogICAgY2FsbHN1YiBhY2NydWVkX2ludGVyZXN0X2Ftb3VudAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTIKICAgIC8vIG51bWVyYXRvciA9IGRheV9jb3VudF9mYWN0b3IubnVtZXJhdG9yLm5hdGl2ZQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjEzCiAgICAvLyBkZW5vbWluYXRvciA9IGRheV9jb3VudF9mYWN0b3IuZGVub21pbmF0b3IubmF0aXZlCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNQoKZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjE1LTIxNgogICAgLy8gIyBWYWx1ZSBhdCBtYXR1cml0eQogICAgLy8gaWYgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gc2VsZi5tYXR1cml0eV9kYXRlOgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgID49CiAgICBieiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2FmdGVyX2lmX2Vsc2VAMTIKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9idXJ5IDEKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyMAogICAgLy8gdW5pdHNfdmFsdWU9YXJjNC5VSW50NjQoYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlKSwKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjEKICAgIC8vIGFjY3J1ZWRfaW50ZXJlc3Q9YXJjNC5VSW50NjQoYWNjcnVlZF9pbnRlcmVzdCksCiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjIzCiAgICAvLyBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIGZyYW1lX2RpZyA2CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjQKICAgIC8vIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIGZyYW1lX2RpZyA1CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMjItMjI1CiAgICAvLyBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICBudW1lcmF0b3I9YXJjNC5VSW50NjQobnVtZXJhdG9yKSwKICAgIC8vICAgICBkZW5vbWluYXRvcj1hcmM0LlVJbnQ2NChkZW5vbWluYXRvciksCiAgICAvLyApLAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyMTktMjI2CiAgICAvLyByZXR1cm4gdHlwLkN1cnJlbnRVbml0c1ZhbHVlKAogICAgLy8gICAgIHVuaXRzX3ZhbHVlPWFyYzQuVUludDY0KGFjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZSksCiAgICAvLyAgICAgYWNjcnVlZF9pbnRlcmVzdD1hcmM0LlVJbnQ2NChhY2NydWVkX2ludGVyZXN0KSwKICAgIC8vICAgICBkYXlfY291bnRfZmFjdG9yPXR5cC5EYXlDb3VudEZhY3RvcigKICAgIC8vICAgICAgICAgbnVtZXJhdG9yPWFyYzQuVUludDY0KG51bWVyYXRvciksCiAgICAvLyAgICAgICAgIGRlbm9taW5hdG9yPWFyYzQuVUludDY0KGRlbm9taW5hdG9yKSwKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfZmFsc2VAMTY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRfYWNjb3VudF91bml0c19jdXJyZW50X3ZhbHVlX2Jvb2xfbWVyZ2VAMTcKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDgKCmdldF9hY2NvdW50X3VuaXRzX2N1cnJlbnRfdmFsdWVfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0X2FjY291bnRfdW5pdHNfY3VycmVudF92YWx1ZV9ib29sX21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMuemVyb19jb3Vwb25fYm9uZC5jb250cmFjdC5aZXJvQ291cG9uQm9uZC5nZXRfcGF5bWVudF9hbW91bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmdldF9wYXltZW50X2Ftb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjIyOC0yMjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wYXltZW50X2Ftb3VudChzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLlBheW1lbnRBbW91bnRzOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCBob2xkaW5nIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gaW50ZXJlc3RfYW1vdW50ID0gVUludDY0KCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDUKICAgIC8vIHByaW5jaXBhbF9hbW91bnQgPSBVSW50NjQoKQogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDEKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0FDVElWRQogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGNfMiAvLyAxMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDYKICAgIC8vIGlmIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpOgogICAgYnogZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQ3CiAgICAvLyBwcmluY2lwYWxfYW1vdW50ID0gc2VsZi5hY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlKGhvbGRpbmdfYWRkcmVzcykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhY2NvdW50X3RvdGFsX3VuaXRzX3ZhbHVlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3plcm9fY291cG9uX2JvbmQvY29udHJhY3QucHk6MjQ4CiAgICAvLyBpbnRlcmVzdF9hbW91bnQgPSBwcmluY2lwYWxfYW1vdW50ICogc2VsZi5pbnRlcmVzdF9yYXRlIC8vIGNzdC5CUFMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICAqCiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIC8KICAgIGZyYW1lX2J1cnkgMAoKZ2V0X3BheW1lbnRfYW1vdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy96ZXJvX2NvdXBvbl9ib25kL2NvbnRyYWN0LnB5OjI1MAogICAgLy8gaW50ZXJlc3Q9YXJjNC5VSW50NjQoaW50ZXJlc3RfYW1vdW50KSwKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNTEKICAgIC8vIHByaW5jaXBhbD1hcmM0LlVJbnQ2NChwcmluY2lwYWxfYW1vdW50KSwKICAgIGZyYW1lX2RpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvemVyb19jb3Vwb25fYm9uZC9jb250cmFjdC5weToyNDktMjUyCiAgICAvLyByZXR1cm4gdHlwLlBheW1lbnRBbW91bnRzKAogICAgLy8gICAgIGludGVyZXN0PWFyYzQuVUludDY0KGludGVyZXN0X2Ftb3VudCksCiAgICAvLyAgICAgcHJpbmNpcGFsPWFyYzQuVUludDY0KHByaW5jaXBhbF9hbW91bnQpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X2NyZWF0ZShhcnJhbmdlcjogYnl0ZXMsIG1ldGFkYXRhOiBieXRlcykgLT4gdm9pZDoKYXNzZXRfY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDUyLTQ1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgYXNzZXRfY3JlYXRlKHNlbGYsIGFycmFuZ2VyOiBhcmM0LkFkZHJlc3MsIG1ldGFkYXRhOiB0eXAuQXNzZXRNZXRhZGF0YSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NDYxCiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gYXJyYW5nZXIubmF0aXZlCiAgICBieXRlYyAxNyAvLyAweDUyMzIzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NjIKICAgIC8vIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjIDIyIC8vICJtZXRhZGF0YSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5hc3NldF9jb25maWcoZGVub21pbmF0aW9uX2Fzc2V0X2lkOiBieXRlcywgc2V0dGxlbWVudF9hc3NldF9pZDogYnl0ZXMsIHByaW5jaXBhbDogYnl0ZXMsIG1pbmltdW1fZGVub21pbmF0aW9uOiBieXRlcywgZGF5X2NvdW50X2NvbnZlbnRpb246IGJ5dGVzLCBpbnRlcmVzdF9yYXRlOiBieXRlcywgY291cG9uX3JhdGVzOiBieXRlcywgdGltZV9ldmVudHM6IGJ5dGVzLCB0aW1lX3BlcmlvZHM6IGJ5dGVzKSAtPiB2b2lkOgphc3NldF9jb25maWc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo0NzQtNDg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NldF9jb25maWcoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBkZW5vbWluYXRpb25fYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHNldHRsZW1lbnRfYXNzZXRfaWQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHByaW5jaXBhbDogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgbWluaW11bV9kZW5vbWluYXRpb246IGFyYzQuVUludDY0LAogICAgLy8gICAgIGRheV9jb3VudF9jb252ZW50aW9uOiBhcmM0LlVJbnQ4LAogICAgLy8gICAgIGludGVyZXN0X3JhdGU6IGFyYzQuVUludDE2LAogICAgLy8gICAgIGNvdXBvbl9yYXRlczogdHlwLkNvdXBvblJhdGVzLAogICAgLy8gICAgIHRpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cywKICAgIC8vICAgICB0aW1lX3BlcmlvZHM6IHR5cC5UaW1lUGVyaW9kcywKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDkgMAogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MTUKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUxNgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU1QVFksIGVyci5BTFJFQURZX0NPTkZJR1VSRUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEQtQVNBIGFscmVhZHkgY29uZmlndXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTE4LTUxOQogICAgLy8gIyBTZXQgRGVub21pbmF0aW9uIEFzc2V0CiAgICAvLyBzZWxmLmFzc2VydF9kZW5vbWluYXRpb25fYXNzZXQoZGVub21pbmF0aW9uX2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtOQogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzcKICAgIC8vIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgYnogYXNzZXRfY29uZmlnX2Jvb2xfZmFsc2VANAogICAgZnJhbWVfZGlnIDMKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzEgLy8gMQoKYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3NS0xNzgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gZGVub21pbmF0aW9uIHdpdGggQVNBCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZCAhPSBVSW50NjQoMCkgYW5kIEFzc2V0KGRlbm9taW5hdGlvbl9hc3NldF9pZCkuY3JlYXRvcgogICAgLy8gKSwgZXJyLklOVkFMSURfREVOT01JTkFUSU9OCiAgICBhc3NlcnQgLy8gRGVub21pbmF0aW9uIGFzc2V0IGlzIG5vdCBwcm9wZXJseSBzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgPSBkZW5vbWluYXRpb25fYXNzZXRfaWQKICAgIGJ5dGVjIDE4IC8vICJkZW5vbWluYXRpb25fYXNzZXRfaWQiCiAgICBmcmFtZV9kaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyMi01MjMKICAgIC8vICMgU2V0IERlbm9taW5hdGlvbiBBc3NldAogICAgLy8gc2VsZi5hc3NlcnRfc2V0dGxlbWVudF9hc3NldChzZXR0bGVtZW50X2Fzc2V0X2lkLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtOAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTg4CiAgICAvLyBzZXR0bGVtZW50X2Fzc2V0X2lkID09IHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gImRlbm9taW5hdGlvbl9hc3NldF9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZW5vbWluYXRpb25fYXNzZXRfaWQgZXhpc3RzCiAgICBkaWcgMQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE4Ni0xODkKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzZXR0bGVtZW50IGFzc2V0IGlzIHRoZSBkZW5vbWluYXRpb24gYXNzZXQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZCA9PSBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZAogICAgLy8gKSwgZXJyLklOVkFMSURfU0VUVExFTUVOVF9BU1NFVAogICAgYXNzZXJ0IC8vIERpZmZlcmVudCBzZXR0bGVtZW50IGFzc2V0IG5vdCBzdXBwb3J0ZWQsIG11c3QgYmUgZXF1YWwgdG8gZGVub21pbmF0aW9uIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTMKICAgIC8vIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCA9IHNldHRsZW1lbnRfYXNzZXRfaWQKICAgIGJ5dGVjIDUgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk0LTIwMAogICAgLy8gIyBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGhhcyBvbi1jaGFpbiBzZXR0bGVtZW50IHdpdGggQVNBCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk5CiAgICAvLyBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk2CiAgICAvLyB4ZmVyX2Fzc2V0PXNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJzZXR0bGVtZW50X2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTcKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTk4CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxOTQtMTk1CiAgICAvLyAjIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaGFzIG9uLWNoYWluIHNldHRsZW1lbnQgd2l0aCBBU0EKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE5NC0yMDAKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBoYXMgb24tY2hhaW4gc2V0dGxlbWVudCB3aXRoIEFTQQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9c2VsZi5zZXR0bGVtZW50X2Fzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MjgKICAgIC8vIHByaW5jaXBhbC5uYXRpdmUgJSBtaW5pbXVtX2Rlbm9taW5hdGlvbi5uYXRpdmUgPT0gMAogICAgZnJhbWVfZGlnIC03CiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTYKICAgIGJ0b2kKICAgIGR1cDIKICAgICUKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUyNi01MjkKICAgIC8vICMgU2V0IFByaW5jaXBhbCBhbmQgTWluaW11bSBEZW5vbWluYXRpb24KICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcHJpbmNpcGFsLm5hdGl2ZSAlIG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZSA9PSAwCiAgICAvLyApLCBlcnIuSU5WQUxJRF9NSU5JTVVNX0RFTk9NSU5BVElPTgogICAgYXNzZXJ0IC8vIE1pbmltdW0gZGVub21pbmF0aW9uIGlzIG5vdCBhIGRpdmlzb3Igb2YgcHJpbmNpcGFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzAKICAgIC8vIHNlbGYudW5pdF92YWx1ZSA9IG1pbmltdW1fZGVub21pbmF0aW9uLm5hdGl2ZQogICAgYnl0ZWMgMTEgLy8gInVuaXRfdmFsdWUiCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjUzMQogICAgLy8gc2VsZi50b3RhbF91bml0cyA9IHByaW5jaXBhbC5uYXRpdmUgLy8gbWluaW11bV9kZW5vbWluYXRpb24ubmF0aXZlCiAgICAvCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTMzLTUzNAogICAgLy8gIyBTZXQgRGF5LUNvdW50IENvbnZlbnRpb24KICAgIC8vIHNlbGYuYXNzZXJ0X2RheV9jb3VudF9jb252ZW50aW9uKGRheV9jb3VudF9jb252ZW50aW9uLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtNQogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNgogICAgLy8gVUludDY0KGNzdC5EQ0NfQV9BKSwKICAgIGludGNfMiAvLyAxMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBibnogYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNgogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNwogICAgLy8gVUludDY0KGNzdC5EQ0NfQ09OVCksCiAgICBwdXNoaW50IDI1NSAvLyAyNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgID09CiAgICBieiBhc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNwoKYXNzZXRfY29uZmlnX2Jvb2xfdHJ1ZUAxNjoKICAgIGludGNfMSAvLyAxCgphc3NldF9jb25maWdfYm9vbF9tZXJnZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIwNC0yMDgKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IHRoZSBBY3R1YWwvQWN0dWFsIGFuZCBDb250aW51b3VzIGRheS1jb3VudCBjb252ZW50aW9ucwogICAgLy8gYXNzZXJ0IGRheV9jb3VudF9jb252ZW50aW9uIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LkRDQ19BX0EpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuRENDX0NPTlQpLAogICAgLy8gKSwgZXJyLklOVkFMSURfREFZX0NPVU5UX0NPTlZFTlRJT04KICAgIGFzc2VydCAvLyBJbnZhbGlkIGRheS1jb3VudCBjb252ZW50aW9uIElECiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTIKICAgIC8vIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gPSBkYXlfY291bnRfY29udmVudGlvbgogICAgYnl0ZWMgMTIgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1MzctNTM4CiAgICAvLyAjIFNldCBJbnRlcmVzdCBSYXRlCiAgICAvLyBzZWxmLmFzc2VydF9pbnRlcmVzdF9yYXRlKGludGVyZXN0X3JhdGUubmF0aXZlKQogICAgZnJhbWVfZGlnIC00CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMTYKICAgIC8vIGFzc2VydCBpbnRlcmVzdF9yYXRlID4gVUludDY0KDApLCBlcnIuSU5WQUxJRF9JTlRFUkVTVF9SQVRFCiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnRlcmVzdCByYXRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMjAKICAgIC8vIHNlbGYuaW50ZXJlc3RfcmF0ZSA9IGludGVyZXN0X3JhdGUKICAgIGJ5dGVjIDggLy8gImludGVyZXN0X3JhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI0CiAgICAvLyBhc3NlcnQgbm90IGNvdXBvbl9yYXRlcy5sZW5ndGgsIGVyci5JTlZBTElEX0NPVVBPTl9SQVRFUwogICAgZnJhbWVfZGlnIC0zCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgIQogICAgYXNzZXJ0IC8vIENvdXBvbiByYXRlcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIyOAogICAgLy8gc2VsZi50b3RhbF9jb3Vwb25zID0gY291cG9uX3JhdGVzLmxlbmd0aAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjI5CiAgICAvLyBpZiBzZWxmLnRvdGFsX2NvdXBvbnM6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gInRvdGFsX2NvdXBvbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfY291cG9ucyBleGlzdHMKICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzAKICAgIC8vIHNlbGYuY291cG9uX3JhdGVzLnZhbHVlID0gY291cG9uX3JhdGVzLmNvcHkoKQogICAgYnl0ZWMgMjggLy8gMHg2MzZmNzU3MDZmNmU1MjYxNzQ2NTczCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDI4IC8vIDB4NjM2Zjc1NzA2ZjZlNTI2MTc0NjU3MwogICAgZnJhbWVfZGlnIC0zCiAgICBib3hfcHV0Cgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gdGltZV9ldmVudHMubGVuZ3RoID09IHNlbGYudG90YWxfY291cG9ucyArIGNmZy5USU1FX1NDSEVEVUxFX0xJTUlUUwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgICsKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyMzQtMjM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFMKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUVfRVZFTlRTX0xFTkdUSAogICAgYXNzZXJ0IC8vIFRpbWUgZXZlbnRzIGxlbmd0aCBpcyBpbnZhbGlkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NDcKICAgIC8vIHNlbGYuYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZCh0aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjAKICAgIC8vIHNlbGYudGltZV9ldmVudHMudmFsdWUgPSB0aW1lX2V2ZW50cy5jb3B5KCkKICAgIGJ5dGVjIDIzIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjMgLy8gMHg3NDY5NmQ2NTQ1NzY2NTZlNzQ3MwogICAgZnJhbWVfZGlnIC0yCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEtMjYzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlID0gdGltZV9ldmVudHNbCiAgICBieXRlYyA5IC8vICJwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjEtMjYzCiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyBdLm5hdGl2ZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY0CiAgICAvLyBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSA9IHRpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTkgLy8gInByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlID0gdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjY3CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuSVNTVUFOQ0VfREFURV9JRFhdLm5hdGl2ZQogICAgZXh0cmFjdCAxNiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgYnl0ZWMgNiAvLyAiaXNzdWFuY2VfZGF0ZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNjktMjcwCiAgICAvLyAjIFNvbWUgRC1BU0EgbWF5IG5vdCBoYXZlIGEgbWF0dXJpdHkgZGF0ZSAoZS5nLiwgcGVycGV0dWFscykKICAgIC8vIGlmIHRpbWVfZXZlbnRzLmxlbmd0aCA9PSBzZWxmLnRvdGFsX2NvdXBvbnMgKyBjZmcuVElNRV9TQ0hFRFVMRV9MSU1JVFM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAidG90YWxfY291cG9ucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF9jb3Vwb25zIGV4aXN0cwogICAgcHVzaGludCA0IC8vIDQKICAgICsKICAgID09CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAzNgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjcxCiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUgPSB0aW1lX2V2ZW50c1tjZmcuTUFUVVJJVFlfREFURV9JRFhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNzUKICAgIC8vIGFzc2VydCBub3QgdGltZV9wZXJpb2RzLmxlbmd0aCwgZXJyLklOVkFMSURfVElNRV9QRVJJT0RTCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgIQogICAgYXNzZXJ0IC8vIFRpbWUgcGVyaW9kcyBhcmUgbm90IHByb3Blcmx5IGRlZmluZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU1NAogICAgLy8gc2VsZi5zdGF0dXMgPSBVSW50NjQoY2ZnLlNUQVRVU19BQ1RJVkUpCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBpbnRjXzIgLy8gMTAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgphc3NldF9jb25maWdfYm9vbF9mYWxzZUAxNzoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2V0X2NvbmZpZ19ib29sX21lcmdlQDE4Cgphc3NldF9jb25maWdfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzZXRfY29uZmlnX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTE1LTExNgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExNwogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5hcnJhbmdlci52YWx1ZSwgZXJyLlVOQVVUSE9SSVpFRAogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vIDB4NTIzMjMwMjMKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcnJhbmdlciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQodGltZV9ldmVudHM6IGJ5dGVzKSAtPiBieXRlczoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjIzOC0yMzkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZChzZWxmLCB0aW1lX2V2ZW50czogdHlwLlRpbWVFdmVudHMpIC0+IE5vbmU6CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDEKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDIKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MS0yNDIKICAgIC8vIHRpbWVfZXZlbnRzW2NmZy5QUklNQVJZX0RJU1RSSUJVVElPTl9PUEVOSU5HX0RBVEVfSURYXS5uYXRpdmUKICAgIC8vID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0MC0yNDMKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgdGltZV9ldmVudHNbY2ZnLlBSSU1BUllfRElTVFJJQlVUSU9OX09QRU5JTkdfREFURV9JRFhdLm5hdGl2ZQogICAgLy8gICAgID4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICksIGVyci5JTlZBTElEX1RJTUUKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNldCBpbiB0aGUgZnV0dXJlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNDQKICAgIC8vIGZvciBfdCBpbiB1cmFuZ2UodGltZV9ldmVudHMubGVuZ3RoIC0gMSk6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0NAogICAgLy8gZm9yIF90IGluIHVyYW5nZSh0aW1lX2V2ZW50cy5sZW5ndGggLSAxKToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl9mb3JANgoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF93aGlsZV90b3BAODoKICAgIHB1c2hpbnQgNzUgLy8gNzUKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfYWZ0ZXJfd2hpbGVAMTQKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAyOSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDI5IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF93aGlsZV90b3BAOAoKYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9hZnRlcl93aGlsZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gdGltZV9pID0gdGltZV9ldmVudHNbX3RdLm5hdGl2ZQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTAKICAgIC8vIHRpbWVfZiA9IHRpbWVfZXZlbnRzW190ICsgMV0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjUxCiAgICAvLyBhc3NlcnQgdGltZV9mID4gdGltZV9pLCBlcnIuSU5WQUxJRF9TT1JUSU5HCiAgICA8CiAgICBhc3NlcnQgLy8gVGltZSBldmVudHMgbXVzdCBiZSBzb3J0ZWQgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyNTIKICAgIC8vIGlmIHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24gIT0gVUludDY0KGNzdC5EQ0NfQ09OVCk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImRheV9jb3VudF9jb252ZW50aW9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRheV9jb3VudF9jb252ZW50aW9uIGV4aXN0cwogICAgcHVzaGludCAyNTUgLy8gMjU1CiAgICAhPQogICAgYnogYXNzZXJ0X3RpbWVfZXZlbnRzX3NvcnRlZF9mb3JfaGVhZGVyQDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1My0yNTQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI1My0yNTYKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aW1lIHBlcmlvZHMgZXhwcmVzc2VkIGluIGRheXMgZm9yIHJlZ3VsYXIgZGF5LWNvdW50IGNvbnZlbnRpb25zCiAgICAvLyBhc3NlcnQgKHRpbWVfZiAtIHRpbWVfaSkgJSBVSW50NjQoCiAgICAvLyAgICAgY3N0LkRBWV8yX1NFQwogICAgLy8gKSA9PSAwLCBlcnIuSU5WQUxJRF9USU1FX1BFUklPRAogICAgaW50YyA2IC8vIDg2NDAwCiAgICAlCiAgICAhCiAgICBhc3NlcnQgLy8gVGltZSBwZXJpb2RzIGluIEFjdHVhbC9BY3R1YWwgZGF5IGNvdW50IGNvbnZlbnRpb24gbXVzdCBiZSBtdWx0aXBsZXMgb2YgYSBkYXkgKGluIHNlY29uZHMpCiAgICBiIGFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWRfZm9yX2hlYWRlckAxCgphc3NlcnRfdGltZV9ldmVudHNfc29ydGVkX2FmdGVyX2ZvckA2OgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9zZWNvbmRhcnlfdGltZV9ldmVudHMoc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50czogYnl0ZXMpIC0+IGJ5dGVzOgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTU2LTU1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50cygKICAgIC8vICAgICBzZWxmLCBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzOiB0eXAuVGltZUV2ZW50cwogICAgLy8gKSAtPiB0eXAuU2Vjb25kYXJ5TWFya2V0U2NoZWR1bGU6CiAgICBwcm90byAxIDEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1NzcKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gcmV0dXJuIHNlbGYuc3RhdHVzID09IGNmZy5TVEFUVVNfRU5ERUQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50YyA3IC8vIDIwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU3OAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLnN0YXR1c19pc19lbmRlZCgpLCBlcnIuVU5BVVRIT1JJWkVECiAgICAhCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjU3OQogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODEKICAgIC8vIGFzc2VydCBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+PSAxLCBlcnIuSU5WQUxJRF9USU1FX0VWRU5UU19MRU5HVEgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBsZW5ndGggaXMgaW52YWxpZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgyCiAgICAvLyBpZiBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzLmxlbmd0aCA+IDE6CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTgzCiAgICAvLyBzZWxmLmFzc2VydF90aW1lX2V2ZW50c19zb3J0ZWQoc2Vjb25kYXJ5X21hcmtldF90aW1lX2V2ZW50cykKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhc3NlcnRfdGltZV9ldmVudHNfc29ydGVkCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgLTEKICAgIGZyYW1lX2J1cnkgMQoKc2V0X3NlY29uZGFyeV90aW1lX2V2ZW50c19hZnRlcl9pZl9lbHNlQDI6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTg1CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJpc3N1YW5jZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzc3VhbmNlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODYtNTg4CiAgICAvLyA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX09QRU5JTkdfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1ODUtNTg4CiAgICAvLyBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vIDw9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTg0LTU4OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmlzc3VhbmNlX2RhdGUKICAgIC8vICAgICA8PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9PUEVOSU5HX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9PUEVOSU5HX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgb3BlbmluZyBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTAKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTUgLy8gInNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTkwLTU5MgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfT1BFTklOR19EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTMKICAgIC8vIGlmIHNlbGYubWF0dXJpdHlfZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICBieiBzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk1CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJtYXR1cml0eV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hdHVyaXR5X2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTcKICAgIC8vIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTYtNTk4CiAgICAvLyA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgIGNmZy5TRUNPTkRBUllfTUFSS0VUX0NMT1NVUkVfREFURV9JRFgKICAgIC8vIF0ubmF0aXZlCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDgKICAgICoKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo1OTUtNTk4CiAgICAvLyBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vID49IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NTk0LTU5OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLm1hdHVyaXR5X2RhdGUKICAgIC8vICAgICA+PSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgLy8gICAgICAgICBjZmcuU0VDT05EQVJZX01BUktFVF9DTE9TVVJFX0RBVEVfSURYCiAgICAvLyAgICAgXS5uYXRpdmUKICAgIC8vICksIGVyci5JTlZBTElEX1NFQ09OREFSWV9DTE9TVVJFX0RBVEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHNlY29uZGFyeSBtYXJrZXQgY2xvc3VyZSBkYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDAKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgPSBzZWNvbmRhcnlfbWFya2V0X3RpbWVfZXZlbnRzWwogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAwLTYwMgogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSA9IHNlY29uZGFyeV9tYXJrZXRfdGltZV9ldmVudHNbCiAgICAvLyAgICAgY2ZnLlNFQ09OREFSWV9NQVJLRVRfQ0xPU1VSRV9EQVRFX0lEWAogICAgLy8gXS5uYXRpdmUKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpzZXRfc2Vjb25kYXJ5X3RpbWVfZXZlbnRzX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNQogICAgLy8gc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYwNC02MDYKICAgIC8vIHNlY29uZGFyeV9tYXJrZXRfb3BlbmluZ19kYXRlPWFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUKICAgIC8vICksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDgKICAgIC8vIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAic2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MDctNjA5CiAgICAvLyBzZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjAzLTYxMAogICAgLy8gcmV0dXJuIHR5cC5TZWNvbmRhcnlNYXJrZXRTY2hlZHVsZSgKICAgIC8vICAgICBzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZQogICAgLy8gICAgICksCiAgICAvLyAgICAgc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUKICAgIC8vICAgICApLAogICAgLy8gKQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2lnbl9yb2xlKHJvbGVfYWRkcmVzczogYnl0ZXMsIHJvbGU6IGJ5dGVzLCBjb25maWc6IGJ5dGVzKSAtPiBieXRlczoKYXNzaWduX3JvbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MTItNjE1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhc3NpZ25fcm9sZSgKICAgIC8vICAgICBzZWxmLCByb2xlX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcm9sZTogYXJjNC5VSW50OCwgY29uZmlnOiBhcmM0LkR5bmFtaWNCeXRlcwogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjMzCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzQKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNgogICAgLy8gVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzcKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgcHVzaGludCA0MCAvLyA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzOAogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzkKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjYzNS02NDIKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FSUkFOR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogYXNzaWduX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NDAKICAgIC8vIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgcHVzaGludCA3MCAvLyA3MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjM1LTY0MgogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBhc3NpZ25fcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0MQogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogYXNzaWduX3JvbGVfYm9vbF9mYWxzZUA3Cgphc3NpZ25fcm9sZV9ib29sX3RydWVANjoKICAgIGludGNfMSAvLyAxCgphc3NpZ25fcm9sZV9ib29sX21lcmdlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2MzUtNjQyCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BUlJBTkdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NAogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgcHVzaGludHMgMjAgNDAgNTAgNjAgNzAgODAgLy8gMjAsIDQwLCA1MCwgNjAsIDcwLCA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQzLTY3MgogICAgLy8gbWF0Y2ggcm9sZS5uYXRpdmU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVJSQU5HRVIpOgogICAgLy8gICAgICAgICBzZWxmLmFycmFuZ2VyLnZhbHVlID0gcm9sZV9hZGRyZXNzLm5hdGl2ZQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCAoCiAgICAvLyAgICAgICAgICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgICAgICBjb25maWcubmF0aXZlCiAgICAvLyAgICAgICAgICkKICAgIC8vICAgICBjYXNlIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKGNvbmZpZy5uYXRpdmUpCiAgICAvLyAgICAgY2FzZSBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCAoCiAgICAvLyAgICAgICAgICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBzZWxmLmludGVyZXN0X29yYWNsZVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICAgICAgICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKCkKICAgIGZyYW1lX2RpZyAwCiAgICBtYXRjaCBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8wQDkgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMUAxMCBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8yQDExIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzNAMTIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMyBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV81QDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzIKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjYKICAgIC8vIHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUKICAgIGJ5dGVjIDMwIC8vIDB4NTIzODMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjY1LTY2NwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuaW50ZXJlc3Rfb3JhY2xlCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NjkKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2OC02NzAKICAgIC8vIHNlbGYuaW50ZXJlc3Rfb3JhY2xlW3JvbGVfYWRkcmVzc10gPSB0eXAuUm9sZUNvbmZpZy5mcm9tX2J5dGVzKAogICAgLy8gICAgIGNvbmZpZy5uYXRpdmUKICAgIC8vICkKICAgIGJveF9wdXQKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NzMKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHN3YXAKICAgIHJldHN1YgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfNEAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY2MgogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjQgLy8gMHg1MjM3MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYzCiAgICAvLyBzZWxmLmF1dGhvcml0eVtyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcyhjb25maWcubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8zQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjU5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjUgLy8gMHg1MjM2MzAyMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjYwCiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoY29uZmlnLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGJveF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfMkAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1NAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyAyNiAvLyAweDUyMzUzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTYKICAgIC8vIGNvbmZpZy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY1NS02NTcKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHR5cC5Sb2xlQ29uZmlnLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgY29uZmlnLm5hdGl2ZQogICAgLy8gKQogICAgYm94X3B1dAogICAgYiBhc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE2Cgphc3NpZ25fcm9sZV9zd2l0Y2hfY2FzZV8xQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjQ4CiAgICAvLyByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICBieXRlYyAyNyAvLyAweDUyMzQzMDIzCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0Ny02NDkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjUxCiAgICAvLyBjb25maWcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2NTAtNjUyCiAgICAvLyBzZWxmLmFjY291bnRfbWFuYWdlcltyb2xlX2FkZHJlc3NdID0gdHlwLlJvbGVDb25maWcuZnJvbV9ieXRlcygKICAgIC8vICAgICBjb25maWcubmF0aXZlCiAgICAvLyApCiAgICBib3hfcHV0CiAgICBiIGFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTYKCmFzc2lnbl9yb2xlX3N3aXRjaF9jYXNlXzBAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY0NQogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IHJvbGVfYWRkcmVzcy5uYXRpdmUKICAgIGJ5dGVjIDE3IC8vIDB4NTIzMjMwMjMKICAgIGZyYW1lX2RpZyAtMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgYXNzaWduX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNgoKYXNzaWduX3JvbGVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXNzaWduX3JvbGVfYm9vbF9tZXJnZUA4CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EucmV2b2tlX3JvbGUocm9sZV9hZGRyZXNzOiBieXRlcywgcm9sZTogYnl0ZXMpIC0+IGJ5dGVzOgpyZXZva2Vfcm9sZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY3NS02NzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHJldm9rZV9yb2xlKHNlbGYsIHJvbGVfYWRkcmVzczogYXJjNC5BZGRyZXNzLCByb2xlOiBhcmM0LlVJbnQ4KSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NjkzCiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTQKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1CiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NgogICAgLy8gVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBwdXNoaW50IDQwIC8vIDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUtNzAxCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NwogICAgLy8gVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5NS03MDEKICAgIC8vIGFzc2VydCByb2xlLm5hdGl2ZSBpbiAoCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IHJldm9rZV9yb2xlX2Jvb2xfdHJ1ZUA1CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk4CiAgICAvLyBVSW50NjQoY3N0LlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUtNzAxCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjY5OQogICAgLy8gVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSksCiAgICBwdXNoaW50IDcwIC8vIDcwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUtNzAxCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiByZXZva2Vfcm9sZV9ib29sX3RydWVANQogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwMAogICAgLy8gVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSksCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo2OTUtNzAxCiAgICAvLyBhc3NlcnQgcm9sZS5uYXRpdmUgaW4gKAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9JTlRFUkVTVF9PUkFDTEUpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJ6IHJldm9rZV9yb2xlX2Jvb2xfZmFsc2VANgoKcmV2b2tlX3JvbGVfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKcmV2b2tlX3JvbGVfYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Njk1LTcwMQogICAgLy8gYXNzZXJ0IHJvbGUubmF0aXZlIGluICgKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChjc3QuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoY3N0LlJPTEVfSU5URVJFU1RfT1JBQ0xFKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAzLTcwNAogICAgLy8gIyBBcnJhbmdlciByb2xlIGNhbiBub3QgYmUgcmV2b2tlZCAoanVzdCByb3RhdGVkKQogICAgLy8gY2FzZSBVSW50NjQoY3N0LlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIHB1c2hpbnRzIDQwIDUwIDYwIDcwIDgwIC8vIDQwLCA1MCwgNjAsIDcwLCA4MAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzAyLTcyMAogICAgLy8gbWF0Y2ggcm9sZS5uYXRpdmU6CiAgICAvLyAgICAgIyBBcnJhbmdlciByb2xlIGNhbiBub3QgYmUgcmV2b2tlZCAoanVzdCByb3RhdGVkKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FDQ09VTlRfTUFOQUdFUik6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQUNDT1VOVF9NQU5BR0VSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1BSSU1BUllfREVBTEVSKToKICAgIC8vICAgICAgICAgYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnByaW1hcnlfZGVhbGVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1BSSU1BUllfREVBTEVSICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYudHJ1c3RlZSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIG9wLkJveC5kZWxldGUoY3N0LlBSRUZJWF9JRF9UUlVTVEVFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0FVVEhPUklUWSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQVVUSE9SSVRZICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgVUludDY0KGNzdC5ST0xFX0lOVEVSRVNUX09SQUNMRSk6CiAgICAvLyAgICAgICAgIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfSU5URVJFU1RfT1JBQ0xFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgLy8gICAgIGNhc2UgXzoKICAgIC8vICAgICAgICAgb3AuZXJyKCkKICAgIGZyYW1lX2RpZyAwCiAgICBtYXRjaCByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV8wQDggcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMUA5IHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzJAMTAgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfM0AxMSByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV80QDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MjAKICAgIC8vIG9wLmVycigpCiAgICBlcnIKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzRAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTcKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5pbnRlcmVzdF9vcmFjbGUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMzAgLy8gMHg1MjM4MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE4CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfSU5URVJFU1RfT1JBQ0xFICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCgpyZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzIxCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICBzd2FwCiAgICByZXRzdWIKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzNAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTQKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5hdXRob3JpdHksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjQgLy8gMHg1MjM3MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzE1CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfQVVUSE9SSVRZICsgcm9sZV9hZGRyZXNzLmJ5dGVzKQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJldm9rZV9yb2xlX3N3aXRjaF9jYXNlX25leHRAMTQKCnJldm9rZV9yb2xlX3N3aXRjaF9jYXNlXzJAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3MTEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi50cnVzdGVlLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI1IC8vIDB4NTIzNjMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcxMgogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX1RSVVNURUUgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA4CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYucHJpbWFyeV9kZWFsZXIsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWMgMjYgLy8gMHg1MjM1MzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA5CiAgICAvLyBvcC5Cb3guZGVsZXRlKGNzdC5QUkVGSVhfSURfUFJJTUFSWV9ERUFMRVIgKyByb2xlX2FkZHJlc3MuYnl0ZXMpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGIgcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfbmV4dEAxNAoKcmV2b2tlX3JvbGVfc3dpdGNoX2Nhc2VfMEA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzA1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDI3IC8vIDB4NTIzNDMwMjMKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcwNgogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlRfTUFOQUdFUiArIHJvbGVfYWRkcmVzcy5ieXRlcykKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiByZXZva2Vfcm9sZV9zd2l0Y2hfY2FzZV9uZXh0QDE0CgpyZXZva2Vfcm9sZV9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYiByZXZva2Vfcm9sZV9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5vcGVuX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcywgcGF5bWVudF9hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6Cm9wZW5fYWNjb3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjcyMy03MjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wZW5fYWNjb3VudCgKICAgIC8vICAgICBzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcywgcGF5bWVudF9hZGRyZXNzOiBhcmM0LkFkZHJlc3MKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0MwogICAgLy8gc2VsZi5hc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMDUKICAgIC8vIHJldHVybiBzZWxmLnN0YXR1cyA9PSBjZmcuU1RBVFVTX0VOREVECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAic3RhdHVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXR1cyBleGlzdHMKICAgIGludGMgNyAvLyAyMDAKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDQKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5zdGF0dXNfaXNfZW5kZWQoKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgIQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDUKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ2CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc0NwogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBub3QgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MQogICAgLy8gdW5pdHM9YXJjNC5VSW50NjQoKSwKICAgIGJ5dGVjIDcgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NDktNzU1CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXSA9IHR5cC5BY2NvdW50SW5mbygKICAgIC8vICAgICBwYXltZW50X2FkZHJlc3M9cGF5bWVudF9hZGRyZXNzLAogICAgLy8gICAgIHVuaXRzPWFyYzQuVUludDY0KCksCiAgICAvLyAgICAgdW5pdF92YWx1ZT1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHBhaWRfY291cG9ucz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzUyCiAgICAvLyB1bml0X3ZhbHVlPWFyYzQuVUludDY0KCksCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1MwogICAgLy8gcGFpZF9jb3Vwb25zPWFyYzQuVUludDY0KCksCiAgICBieXRlYyA3IC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NAogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbCgpLAogICAgYnl0ZWMgMTAgLy8gMHgwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzQ5LTc1NQogICAgLy8gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10gPSB0eXAuQWNjb3VudEluZm8oCiAgICAvLyAgICAgcGF5bWVudF9hZGRyZXNzPXBheW1lbnRfYWRkcmVzcywKICAgIC8vICAgICB1bml0cz1hcmM0LlVJbnQ2NCgpLAogICAgLy8gICAgIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBwYWlkX2NvdXBvbnM9YXJjNC5VSW50NjQoKSwKICAgIC8vICAgICBzdXNwZW5kZWQ9YXJjNC5Cb29sKCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc1NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2FjY291bnRfbWFuYWdlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjExOS0xMjAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICBieXRlYyAyNyAvLyAweDUyMzQzMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTIzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hY2NvdW50X21hbmFnZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMy0xMjYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmFjY291bnRfbWFuYWdlcgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9tYW5hZ2VyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjQtMTI1CiAgICAvLyBhbmQgc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI2CiAgICAvLyA8PSBzZWxmLmFjY291bnRfbWFuYWdlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudF9tYW5hZ2VyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMjUtMTI2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEyMi0xMjcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyCiAgICAvLyAgICAgYW5kIHNlbGYuYWNjb3VudF9tYW5hZ2VyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hY2NvdW50X21hbmFnZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmNsb3NlX2FjY291bnQoaG9sZGluZ19hZGRyZXNzOiBieXRlcykgLT4gYnl0ZXM6CmNsb3NlX2FjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3NTgtNzYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjbG9zZV9hY2NvdW50KAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzCiAgICAvLyApIC0+IGFyYzQuVHVwbGVbYXJjNC5VSW50NjQsIGFyYzQuVUludDY0XToKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Nzc2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYWNjb3VudF9tYW5hZ2VyKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hY2NvdW50X21hbmFnZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc3NwogICAgLy8gc2VsZi5hc3NlcnRfaXNfbm90X2RlZmF1bHRlZCgpCiAgICBjYWxsc3ViIGFzc2VydF9pc19ub3RfZGVmYXVsdGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6NzgwCiAgICAvLyBjbG9zZWRfdW5pdHMgPSBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cy5uYXRpdmUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWNjb3VudCBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMzIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MQogICAgLy8gb3AuQm94LmRlbGV0ZShjc3QuUFJFRklYX0lEX0FDQ09VTlQgKyBob2xkaW5nX2FkZHJlc3MuYnl0ZXMpCiAgICBzd2FwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4MgogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyAtPSBjbG9zZWRfdW5pdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICAtCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODMKICAgIC8vIHNlbGYuZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzKCkKICAgIGNhbGxzdWIgZW5kX2lmX25vX2NpcmN1bGF0aW5nX3VuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODUKICAgIC8vIChhcmM0LlVJbnQ2NChjbG9zZWRfdW5pdHMpLCBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICBpdG9iCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo3ODQtNzg2CiAgICAvLyByZXR1cm4gYXJjNC5UdXBsZSgKICAgIC8vICAgICAoYXJjNC5VSW50NjQoY2xvc2VkX3VuaXRzKSwgYXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApKQogICAgLy8gKQogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5wcmltYXJ5X2Rpc3RyaWJ1dGlvbihob2xkaW5nX2FkZHJlc3M6IGJ5dGVzLCB1bml0czogYnl0ZXMpIC0+IGJ5dGVzOgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojc4OC03OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHByaW1hcnlfZGlzdHJpYnV0aW9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCB1bml0czogYXJjNC5VSW50NjQKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyIDEKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NC0yODcKICAgIC8vIHNlbGYuc3RhdHVzX2lzX2FjdGl2ZSgpCiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODUtMjg2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1LTI4NwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToyODcKICAgIC8vIDwgc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjI4Ni0yODcKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8IHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICBmcmFtZV9kaWcgMgogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6Mjg1LTI4NwogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1CiAgICBpbnRjXzEgLy8gMQoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MjgzLTI4OAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLnN0YXR1c19pc19hY3RpdmUoKQogICAgLy8gICAgIGFuZCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPCBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwgZXJyLlBSSU1BUllfRElTVFJJQlVUSU9OX0NMT1NFRAogICAgYXNzZXJ0IC8vIFByaW1hcnkgZGlzdHJpYnV0aW9uIGlzIGNsb3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgYnl0ZWMgMjYgLy8gMHg1MjM1MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMzLTEzNgogICAgLy8gY2FsbGVyIGluIHNlbGYucHJpbWFyeV9kZWFsZXIKICAgIC8vIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmltYXJ5X2RlYWxlciBlbnRyeSBleGlzdHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM1CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0LTEzNQogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTM0LTEzNgogICAgLy8gYW5kIHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzYKICAgIC8vIDw9IHNlbGYucHJpbWFyeV9kZWFsZXJbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGVhbGVyIGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzUtMTM2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYj49CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxMzQtMTM2CiAgICAvLyBhbmQgc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IHByaW1hcnlfZGlzdHJpYnV0aW9uX2Jvb2xfZmFsc2VAMTIKICAgIGludGNfMSAvLyAxCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX21lcmdlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTMyLTEzNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBjYWxsZXIgaW4gc2VsZi5wcmltYXJ5X2RlYWxlcgogICAgLy8gICAgIGFuZCBzZWxmLnByaW1hcnlfZGVhbGVyW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5wcmltYXJ5X2RlYWxlcltjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MTYKICAgIC8vIHNlbGYuYXNzZXJ0X2lzX25vdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBhc3NlcnRfaXNfbm90X2RlZmF1bHRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODE3CiAgICAvLyBzZWxmLmFzc2VydF9pc19ub3Rfc3VzcGVuZGVkKCkKICAgIGNhbGxzdWIgYXNzZXJ0X2lzX25vdF9zdXNwZW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgxOAogICAgLy8gYXNzZXJ0IHVuaXRzLm5hdGl2ZSA+IDAsIGVyci5aRVJPX1VOSVRTCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGR1cAogICAgYXNzZXJ0IC8vIENhbiBub3QgZGlzdHJpYnV0ZSB6ZXJvIHVuaXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjAKICAgIC8vIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKyB1bml0cy5uYXRpdmUgPD0gc2VsZi50b3RhbF91bml0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgZGlnIDEKICAgICsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAidG90YWxfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfdW5pdHMgZXhpc3RzCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODE5LTgyMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICsgdW5pdHMubmF0aXZlIDw9IHNlbGYudG90YWxfdW5pdHMKICAgIC8vICksIGVyci5PVkVSX0RJU1RSSUJVVElPTgogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCByZW1haW5pbmcgRC1BU0EgdW5pdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyMwogICAgLy8gc2VsZi5jaXJjdWxhdGluZ191bml0cyArPSB1bml0cy5uYXRpdmUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjUKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDMyIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjQtODI2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODI0CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjQtODI2CiAgICAvLyBzZWxmLmFjY291bnRbaG9sZGluZ19hZGRyZXNzXS51bml0cyA9IGFyYzQuVUludDY0KAogICAgLy8gICAgIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRzLm5hdGl2ZSArIHVuaXRzLm5hdGl2ZQogICAgLy8gKQogICAgc3dhcAogICAgcmVwbGFjZTIgMzIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4MjcKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnVuaXRfdmFsdWUgPSBhcmM0LlVJbnQ2NChzZWxmLnVuaXRfdmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gInVuaXRfdmFsdWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudW5pdF92YWx1ZSBleGlzdHMKICAgIGl0b2IKICAgIGRpZyAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgcmVwbGFjZTIgNDAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjgyOAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMgLSBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJ0b3RhbF91bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b3RhbF91bml0cyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjaXJjdWxhdGluZ191bml0cyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jaXJjdWxhdGluZ191bml0cyBleGlzdHMKICAgIC0KICAgIGl0b2IKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9ib29sX2ZhbHNlQDEyOgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUAxMwoKcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJpbWFyeV9kaXN0cmlidXRpb25fYm9vbF9tZXJnZUA2CgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2Fzc2V0X3N1c3BlbnNpb24oc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hc3NldF9zdXNwZW5zaW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODMwLTgzMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgc2V0X2Fzc2V0X3N1c3BlbnNpb24oc2VsZiwgc3VzcGVuZGVkOiBhcmM0LkJvb2wpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDQKICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKQogICAgY2FsbHN1YiBhc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODQ1CiAgICAvLyBzZWxmLnN1c3BlbmRlZCA9IFVJbnQ2NChzdXNwZW5kZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAyMCAvLyAic3VzcGVuZGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg0NgogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2EuYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoKSAtPiB2b2lkOgphc3NlcnRfY2FsbGVyX2lzX2F1dGhvcml0eToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0OS0xNTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICBieXRlYyAyNCAvLyAweDUyMzczMDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTEKICAgIC8vIGNhbGxlciA9IGFyYzQuQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTUzCiAgICAvLyBjYWxsZXIgaW4gc2VsZi5hdXRob3JpdHkKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1My0xNTYKICAgIC8vIGNhbGxlciBpbiBzZWxmLmF1dGhvcml0eQogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTUKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTQtMTU1CiAgICAvLyBhbmQgc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0LTE1NgogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU2CiAgICAvLyA8PSBzZWxmLmF1dGhvcml0eVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXV0aG9yaXR5IGVudHJ5IGV4aXN0cwogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNTUtMTU2CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTU0LTE1NgogICAgLy8gYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIGJ6IGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANAogICAgaW50Y18xIC8vIDEKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE1Mi0xNTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgY2FsbGVyIGluIHNlbGYuYXV0aG9yaXR5CiAgICAvLyAgICAgYW5kIHNlbGYuYXV0aG9yaXR5W2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi5hdXRob3JpdHlbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgLy8gKSwgZXJyLlVOQVVUSE9SSVpFRAogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICByZXRzdWIKCmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIGFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5X2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLnNldF9hY2NvdW50X3N1c3BlbnNpb24oaG9sZGluZ19hZGRyZXNzOiBieXRlcywgc3VzcGVuZGVkOiBieXRlcykgLT4gYnl0ZXM6CnNldF9hY2NvdW50X3N1c3BlbnNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NDgtODUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYWNjb3VudF9zdXNwZW5zaW9uKAogICAgLy8gICAgIHNlbGYsIGhvbGRpbmdfYWRkcmVzczogYXJjNC5BZGRyZXNzLCBzdXNwZW5kZWQ6IGFyYzQuQm9vbAogICAgLy8gKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODY2CiAgICAvLyBzZWxmLmFzc2VydF9jYWxsZXJfaXNfYXV0aG9yaXR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0X2NhbGxlcl9pc19hdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE3MQogICAgLy8gYXNzZXJ0IGhvbGRpbmdfYWRkcmVzcyBpbiBzZWxmLmFjY291bnQsIGVyci5JTlZBTElEX0hPTERJTkdfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyMzMzMDIzCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgaG9sZGluZyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4NjgKICAgIC8vIHNlbGYuYWNjb3VudFtob2xkaW5nX2FkZHJlc3NdLnN1c3BlbmRlZCA9IHN1c3BlbmRlZAogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hY2NvdW50IGVudHJ5IGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBpbnRjIDQgLy8gNDQ4CiAgICBzd2FwCiAgICBzZXRiaXQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg2OQogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmJhc2VfZF9hc2EuY29udHJhY3QuQmFzZURBc2Euc2V0X2RlZmF1bHRfc3RhdHVzKGRlZmF1bHRlZDogYnl0ZXMpIC0+IHZvaWQ6CnNldF9kZWZhdWx0X3N0YXR1czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg3MS04NzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHNldF9kZWZhdWx0X3N0YXR1cyhzZWxmLCBkZWZhdWx0ZWQ6IGFyYzQuQm9vbCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgYnl0ZWMgMjUgLy8gMHg1MjM2MzAyMwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQxCiAgICAvLyBjYWxsZXIgPSBhcmM0LkFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0MwogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQzLTE0NgogICAgLy8gY2FsbGVyIGluIHNlbGYudHJ1c3RlZQogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0CiAgICAvLyBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NQogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NC0xNDUKICAgIC8vIGFuZCBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NgogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ2CiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRydXN0ZWUgZW50cnkgZXhpc3RzCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjE0NS0xNDYKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZnJhbWVfZGlnIDAKICAgIGI+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTQ0LTE0NgogICAgLy8gYW5kIHNlbGYudHJ1c3RlZVtjYWxsZXJdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSBzZWxmLnRydXN0ZWVbY2FsbGVyXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANQogICAgaW50Y18xIC8vIDEKCnNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNDItMTQ3CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGNhbGxlciBpbiBzZWxmLnRydXN0ZWUKICAgIC8vICAgICBhbmQgc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9zdGFydAogICAgLy8gICAgIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyAgICAgPD0gc2VsZi50cnVzdGVlW2NhbGxlcl0ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5VTkFVVEhPUklaRUQKICAgIGFzc2VydCAvLyBOb3QgYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6ODgzCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IFVJbnQ2NChkZWZhdWx0ZWQubmF0aXZlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlYyAyMSAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKc2V0X2RlZmF1bHRfc3RhdHVzX2Jvb2xfZmFsc2VANToKICAgIGludGNfMCAvLyAwCiAgICBiIHNldF9kZWZhdWx0X3N0YXR1c19ib29sX21lcmdlQDYKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYXNzZXRfaW5mbygpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg4NS04ODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldF9pbmZvKHNlbGYpIC0+IHR5cC5Bc3NldEluZm86CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NgogICAgLy8gZGVub21pbmF0aW9uX2Fzc2V0X2lkPWFyYzQuVUludDY0KHNlbGYuZGVub21pbmF0aW9uX2Fzc2V0X2lkKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOCAvLyAiZGVub21pbmF0aW9uX2Fzc2V0X2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NwogICAgLy8gc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInNldHRsZW1lbnRfYXNzZXRfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2V0dGxlbWVudF9hc3NldF9pZCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5OAogICAgLy8gb3V0c3RhbmRpbmdfcHJpbmNpcGFsPWFyYzQuVUludDY0KHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgKiBzZWxmLnVuaXRfdmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNpcmN1bGF0aW5nX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNpcmN1bGF0aW5nX3VuaXRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDExIC8vICJ1bml0X3ZhbHVlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfdmFsdWUgZXhpc3RzCiAgICAqCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo4OTkKICAgIC8vIHVuaXRfdmFsdWU9YXJjNC5VSW50NjQoc2VsZi51bml0X3ZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAidW5pdF92YWx1ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi51bml0X3ZhbHVlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAwCiAgICAvLyBkYXlfY291bnRfY29udmVudGlvbj1hcmM0LlVJbnQ4KHNlbGYuZGF5X2NvdW50X2NvbnZlbnRpb24pLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJkYXlfY291bnRfY29udmVudGlvbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kYXlfY291bnRfY29udmVudGlvbiBleGlzdHMKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDEKICAgIC8vIGludGVyZXN0X3JhdGU9YXJjNC5VSW50MTYoc2VsZi5pbnRlcmVzdF9yYXRlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJpbnRlcmVzdF9yYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludGVyZXN0X3JhdGUgZXhpc3RzCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAyCiAgICAvLyB0b3RhbF9zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi50b3RhbF91bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTMgLy8gInRvdGFsX3VuaXRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3VuaXRzIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTAzCiAgICAvLyBjaXJjdWxhdGluZ19zdXBwbHk9YXJjNC5VSW50NjQoc2VsZi5jaXJjdWxhdGluZ191bml0cyksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2lyY3VsYXRpbmdfdW5pdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2lyY3VsYXRpbmdfdW5pdHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5MDUKICAgIC8vIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNC05MDYKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX29wZW5pbmdfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwOAogICAgLy8gc2VsZi5wcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxOSAvLyAicHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkwNy05MDkKICAgIC8vIHByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZT1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICBzZWxmLnByaW1hcnlfZGlzdHJpYnV0aW9uX2Nsb3N1cmVfZGF0ZQogICAgLy8gKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMAogICAgLy8gaXNzdWFuY2VfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLmlzc3VhbmNlX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImlzc3VhbmNlX2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaXNzdWFuY2VfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMQogICAgLy8gbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gIm1hdHVyaXR5X2RhdGUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWF0dXJpdHlfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMgogICAgLy8gc3VzcGVuZGVkPWFyYzQuQm9vbChib29sKHNlbGYuc3VzcGVuZGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gInN1c3BlbmRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdXNwZW5kZWQgZXhpc3RzCiAgICBieXRlYyAxMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjkxMwogICAgLy8gZGVmYXVsdGVkPWFyYzQuQm9vbChib29sKHNlbGYuZGVmYXVsdGVkKSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICBieXRlYyAxMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojg5NS05MTQKICAgIC8vIHJldHVybiB0eXAuQXNzZXRJbmZvKAogICAgLy8gICAgIGRlbm9taW5hdGlvbl9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLmRlbm9taW5hdGlvbl9hc3NldF9pZCksCiAgICAvLyAgICAgc2V0dGxlbWVudF9hc3NldF9pZD1hcmM0LlVJbnQ2NChzZWxmLnNldHRsZW1lbnRfYXNzZXRfaWQpLAogICAgLy8gICAgIG91dHN0YW5kaW5nX3ByaW5jaXBhbD1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzICogc2VsZi51bml0X3ZhbHVlKSwKICAgIC8vICAgICB1bml0X3ZhbHVlPWFyYzQuVUludDY0KHNlbGYudW5pdF92YWx1ZSksCiAgICAvLyAgICAgZGF5X2NvdW50X2NvbnZlbnRpb249YXJjNC5VSW50OChzZWxmLmRheV9jb3VudF9jb252ZW50aW9uKSwKICAgIC8vICAgICBpbnRlcmVzdF9yYXRlPWFyYzQuVUludDE2KHNlbGYuaW50ZXJlc3RfcmF0ZSksCiAgICAvLyAgICAgdG90YWxfc3VwcGx5PWFyYzQuVUludDY0KHNlbGYudG90YWxfdW5pdHMpLAogICAgLy8gICAgIGNpcmN1bGF0aW5nX3N1cHBseT1hcmM0LlVJbnQ2NChzZWxmLmNpcmN1bGF0aW5nX3VuaXRzKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9vcGVuaW5nX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fb3BlbmluZ19kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBwcmltYXJ5X2Rpc3RyaWJ1dGlvbl9jbG9zdXJlX2RhdGU9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgICAgIHNlbGYucHJpbWFyeV9kaXN0cmlidXRpb25fY2xvc3VyZV9kYXRlCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBpc3N1YW5jZV9kYXRlPWFyYzQuVUludDY0KHNlbGYuaXNzdWFuY2VfZGF0ZSksCiAgICAvLyAgICAgbWF0dXJpdHlfZGF0ZT1hcmM0LlVJbnQ2NChzZWxmLm1hdHVyaXR5X2RhdGUpLAogICAgLy8gICAgIHN1c3BlbmRlZD1hcmM0LkJvb2woYm9vbChzZWxmLnN1c3BlbmRlZCkpLAogICAgLy8gICAgIGRlZmF1bHRlZD1hcmM0LkJvb2woYm9vbChzZWxmLmRlZmF1bHRlZCkpLAogICAgLy8gKQogICAgdW5jb3ZlciAxMwogICAgdW5jb3ZlciAxMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDEyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICB1bmNvdmVyIDkKICAgIGNvbmNhdAogICAgdW5jb3ZlciA4CiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHB1c2hpbnQgNjY1IC8vIDY2NQogICAgc3dhcAogICAgc2V0Yml0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfYWNjb3VudF9pbmZvKGhvbGRpbmdfYWRkcmVzczogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRfYWNjb3VudF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTE2LTkxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X2FjY291bnRfaW5mbyhzZWxmLCBob2xkaW5nX2FkZHJlc3M6IGFyYzQuQWRkcmVzcykgLT4gdHlwLkFjY291bnRJbmZvOgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weToxNzEKICAgIC8vIGFzc2VydCBob2xkaW5nX2FkZHJlc3MgaW4gc2VsZi5hY2NvdW50LCBlcnIuSU5WQUxJRF9IT0xESU5HX0FERFJFU1MKICAgIGJ5dGVjXzIgLy8gMHg1MjMzMzAyMwogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IGhvbGRpbmcgYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMxCiAgICAvLyByZXR1cm4gc2VsZi5hY2NvdW50W2hvbGRpbmdfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFjY291bnQgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfdGltZV9ldmVudHMoKSAtPiBieXRlczoKZ2V0X3RpbWVfZXZlbnRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTMzLTkzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICAvLyBkZWYgZ2V0X3RpbWVfZXZlbnRzKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDEKICAgIC8vIHRpbWVfZXZlbnRzID0gdHlwLlRpbWVFdmVudHMoKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6MTAxCiAgICAvLyByZXR1cm4gc2VsZi5zdGF0dXMgPT0gY2ZnLlNUQVRVU19BQ1RJVkUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJzdGF0dXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdHVzIGV4aXN0cwogICAgaW50Y18yIC8vIDEwMAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0MgogICAgLy8gaWYgc2VsZi5zdGF0dXNfaXNfYWN0aXZlKCk6CiAgICBieiBnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NDMKICAgIC8vIHRpbWVfZXZlbnRzID0gc2VsZi50aW1lX2V2ZW50cy52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDIzIC8vIDB4NzQ2OTZkNjU0NTc2NjU2ZTc0NzMKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGltZV9ldmVudHMgZXhpc3RzCgpnZXRfdGltZV9ldmVudHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTQ0CiAgICAvLyByZXR1cm4gdGltZV9ldmVudHMKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYmFzZV9kX2FzYS5jb250cmFjdC5CYXNlREFzYS5nZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZSgpIC0+IGJ5dGVzOgpnZXRfc2Vjb25kYXJ5X21hcmtldF9zY2hlZHVsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk0Ni05NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9zZWNvbmRhcnlfbWFya2V0X3NjaGVkdWxlKHNlbGYpIC0+IHR5cC5UaW1lRXZlbnRzOgogICAgcHJvdG8gMCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTUKICAgIC8vIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJzZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zZWNvbmRhcnlfbWFya2V0X29wZW5pbmdfZGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk1NgogICAgLy8gYXJjNC5VSW50NjQoc2VsZi5zZWNvbmRhcnlfbWFya2V0X2Nsb3N1cmVfZGF0ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTYgLy8gInNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNlY29uZGFyeV9tYXJrZXRfY2xvc3VyZV9kYXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2VfZF9hc2EvY29udHJhY3QucHk6OTU0LTk1NwogICAgLy8gcmV0dXJuIHR5cC5UaW1lRXZlbnRzKAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9vcGVuaW5nX2RhdGUpLAogICAgLy8gICAgIGFyYzQuVUludDY0KHNlbGYuc2Vjb25kYXJ5X21hcmtldF9jbG9zdXJlX2RhdGUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmdldF9hc3NldF9tZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRfYXNzZXRfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZV9kX2FzYS9jb250cmFjdC5weTo5NTktOTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIC8vIGRlZiBnZXRfYXNzZXRfbWV0YWRhdGEoc2VsZikgLT4gdHlwLkFzc2V0TWV0YWRhdGE6CiAgICBwcm90byAwIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5Ojk2NwogICAgLy8gcmV0dXJuIHR5cC5Bc3NldE1ldGFkYXRhKHNlbGYubWV0YWRhdGEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjIgLy8gIm1ldGFkYXRhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1ldGFkYXRhIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5iYXNlX2RfYXNhLmNvbnRyYWN0LkJhc2VEQXNhLmFzc2V0X3VwZGF0ZSgpIC0+IHZvaWQ6CmFzc2V0X3VwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2NC00NjUKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgYXNzZXRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlX2RfYXNhL2NvbnRyYWN0LnB5OjQ2OS00NzIKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIE90aGVyIGltcGxlbWVudGF0aW9ucyBtYXkgZGlzYWJsZSBELUFTQSBhcHBsaWNhdGlvbiB1cGRhdGFiaWxpdHkgb3IgY2hhbmdlIGl0cyBhdXRob3JpemF0aW9ucy4KICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IEFwcGxpY2F0aW9uIHVwZGF0ZXMgbXVzdCBiZSBleGVjdXRlZCBWRVJZIGNhcmVmdWxseSwgYXMgdGhleSBtaWdodCBpbnRyb2R1Y2UgYnJlYWtpbmcgY2hhbmdlcy4KICAgIC8vIHNlbGYuYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpCiAgICBjYWxsc3ViIGFzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" }, "state": { @@ -430,7 +434,7 @@ ], "returns": { "type": "(uint64,uint64,byte[])", - "desc": "Paid amount, Payment timestamp, Payment context" + "desc": "Paid amount in denomination asset, Payment timestamp, Payment context" }, "desc": "Pay the outstanding principal and interest to an account" }, @@ -710,8 +714,8 @@ "name": "get_asset_info", "args": [], "returns": { - "type": "(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", - "desc": "Denomination Asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary Distribution Opening Date, Primary Distribution Closure Date, Issuance Date, Maturity Date, Suspended, Defaulted" + "type": "(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)", + "desc": "Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Defaulted" }, "desc": "Get D-ASA info" }, @@ -726,7 +730,7 @@ ], "returns": { "type": "(address,uint64,uint64,uint64,bool)", - "desc": "Payment Address, D-ASA units, Unit value, Paid coupons, Suspended" + "desc": "Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended" }, "desc": "Get account info" }, @@ -743,15 +747,19 @@ "name": "get_secondary_market_schedule", "args": [], "returns": { - "type": "uint64[]" - } + "type": "uint64[]", + "desc": "Secondary market schedule" + }, + "desc": "Get secondary market schedule" }, { "name": "get_asset_metadata", "args": [], "returns": { - "type": "byte[]" - } + "type": "byte[]", + "desc": "Asset metadata" + }, + "desc": "Get D-ASA metadata" } ], "networks": {}, @@ -1072,6 +1080,7 @@ def method() -> str: @dataclasses.dataclass(kw_only=True) class AssetInfo: denomination_asset_id: int + settlement_asset_id: int outstanding_principal: int unit_value: int day_count_convention: int @@ -1092,7 +1101,7 @@ class GetAssetInfoArgs(_ArgsBase[AssetInfo]): @staticmethod def method() -> str: - return "get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)" + return "get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)" @dataclasses.dataclass(kw_only=True) @@ -1127,6 +1136,8 @@ def method() -> str: @dataclasses.dataclass(kw_only=True) class GetSecondaryMarketScheduleArgs(_ArgsBase[list[int]]): + """Get secondary market schedule""" + @staticmethod def method() -> str: return "get_secondary_market_schedule()uint64[]" @@ -1134,6 +1145,8 @@ def method() -> str: @dataclasses.dataclass(kw_only=True) class GetAssetMetadataArgs(_ArgsBase[bytes | bytearray]): + """Get D-ASA metadata""" + @staticmethod def method() -> str: return "get_asset_metadata()byte[]" @@ -1639,7 +1652,7 @@ def get_asset_info( ) -> "Composer": """Get D-ASA info - Adds a call to `get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)` ABI method + Adds a call to `get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters :returns Composer: This Composer instance""" @@ -1704,7 +1717,9 @@ def get_secondary_market_schedule( *, transaction_parameters: algokit_utils.TransactionParameters | None = None, ) -> "Composer": - """Adds a call to `get_secondary_market_schedule()uint64[]` ABI method + """Get secondary market schedule + + Adds a call to `get_secondary_market_schedule()uint64[]` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters :returns Composer: This Composer instance""" @@ -1723,7 +1738,9 @@ def get_asset_metadata( *, transaction_parameters: algokit_utils.TransactionParameters | None = None, ) -> "Composer": - """Adds a call to `get_asset_metadata()byte[]` ABI method + """Get D-ASA metadata + + Adds a call to `get_asset_metadata()byte[]` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters :returns Composer: This Composer instance""" @@ -1978,7 +1995,7 @@ def pay_principal( :param str holding_address: Account Holding Address :param bytes | bytearray payment_info: Additional payment information (Optional) :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[PaymentResult]: Paid amount, Payment timestamp, Payment context""" + :returns algokit_utils.ABITransactionResponse[PaymentResult]: Paid amount in denomination asset, Payment timestamp, Payment context""" args = PayPrincipalArgs( holding_address=holding_address, @@ -2343,10 +2360,10 @@ def get_asset_info( ) -> algokit_utils.ABITransactionResponse[AssetInfo]: """Get D-ASA info - Calls `get_asset_info()(uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)` ABI method + Calls `get_asset_info()(uint64,uint64,uint64,uint64,uint8,uint16,uint64,uint64,uint64,uint64,uint64,uint64,bool,bool)` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[AssetInfo]: Denomination Asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary Distribution Opening Date, Primary Distribution Closure Date, Issuance Date, Maturity Date, Suspended, Defaulted""" + :returns algokit_utils.ABITransactionResponse[AssetInfo]: Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution closure date, Issuance date, Maturity date, Suspended, Defaulted""" args = GetAssetInfoArgs() result = self.app_client.call( @@ -2371,7 +2388,7 @@ def get_account_info( :param str holding_address: Account Holding Address :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[AccountInfo]: Payment Address, D-ASA units, Unit value, Paid coupons, Suspended""" + :returns algokit_utils.ABITransactionResponse[AccountInfo]: Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended""" args = GetAccountInfoArgs( holding_address=holding_address, @@ -2411,10 +2428,12 @@ def get_secondary_market_schedule( *, transaction_parameters: algokit_utils.TransactionParameters | None = None, ) -> algokit_utils.ABITransactionResponse[list[int]]: - """Calls `get_secondary_market_schedule()uint64[]` ABI method + """Get secondary market schedule + + Calls `get_secondary_market_schedule()uint64[]` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[list[int]]: The result of the transaction""" + :returns algokit_utils.ABITransactionResponse[list[int]]: Secondary market schedule""" args = GetSecondaryMarketScheduleArgs() result = self.app_client.call( @@ -2429,10 +2448,12 @@ def get_asset_metadata( *, transaction_parameters: algokit_utils.TransactionParameters | None = None, ) -> algokit_utils.ABITransactionResponse[bytes | bytearray]: - """Calls `get_asset_metadata()byte[]` ABI method + """Get D-ASA metadata + + Calls `get_asset_metadata()byte[]` ABI method :param algokit_utils.TransactionParameters transaction_parameters: (optional) Additional transaction parameters - :returns algokit_utils.ABITransactionResponse[bytes | bytearray]: The result of the transaction""" + :returns algokit_utils.ABITransactionResponse[bytes | bytearray]: Asset metadata""" args = GetAssetMetadataArgs() result = self.app_client.call( diff --git a/smart_contracts/base_d_asa/contract.py b/smart_contracts/base_d_asa/contract.py index ee75369..18a9f28 100644 --- a/smart_contracts/base_d_asa/contract.py +++ b/smart_contracts/base_d_asa/contract.py @@ -309,7 +309,7 @@ def assert_are_units_fungible( def is_payment_executable(self, holding_address: arc4.Address) -> bool: return ( self.account[holding_address].payment_address.native.is_opted_in( - Asset(self.denomination_asset_id) + Asset(self.settlement_asset_id) ) and not self.account[holding_address].suspended.native ) @@ -317,9 +317,7 @@ def is_payment_executable(self, holding_address: arc4.Address) -> bool: @subroutine def assert_enough_funds(self, payment_amount: UInt64) -> None: assert ( - Asset(self.denomination_asset_id).balance( - Global.current_application_address - ) + Asset(self.settlement_asset_id).balance(Global.current_application_address) >= payment_amount ), err.NOT_ENOUGH_FUNDS @@ -890,12 +888,13 @@ def get_asset_info(self) -> typ.AssetInfo: Get D-ASA info Returns: - Denomination Asset ID, Outstanding principal, Unit nominal value, Day-count convention, Interest rate, Total - supply, Circulating supply, Primary Distribution Opening Date, Primary Distribution Closure Date, Issuance - Date, Maturity Date, Suspended, Defaulted + Denomination asset ID, Settlement asset ID, Outstanding principal, Unit nominal value, Day-count convention, + Interest rate, Total supply, Circulating supply, Primary distribution opening date, Primary distribution + closure date, Issuance date, Maturity date, Suspended, Defaulted """ return typ.AssetInfo( denomination_asset_id=arc4.UInt64(self.denomination_asset_id), + settlement_asset_id=arc4.UInt64(self.settlement_asset_id), outstanding_principal=arc4.UInt64(self.circulating_units * self.unit_value), unit_value=arc4.UInt64(self.unit_value), day_count_convention=arc4.UInt8(self.day_count_convention), @@ -923,7 +922,7 @@ def get_account_info(self, holding_address: arc4.Address) -> typ.AccountInfo: holding_address: Account Holding Address Returns: - Payment Address, D-ASA units, Unit value, Paid coupons, Suspended + Payment Address, D-ASA units, Unit nominal value in denomination asset, Paid coupons, Suspended Raises: INVALID_HOLDING_ADDRESS: Invalid account holding address @@ -946,6 +945,12 @@ def get_time_events(self) -> typ.TimeEvents: @arc4.abimethod(readonly=True) def get_secondary_market_schedule(self) -> typ.TimeEvents: + """ + Get secondary market schedule + + Returns: + Secondary market schedule + """ return typ.TimeEvents( arc4.UInt64(self.secondary_market_opening_date), arc4.UInt64(self.secondary_market_closure_date), @@ -953,4 +958,10 @@ def get_secondary_market_schedule(self) -> typ.TimeEvents: @arc4.abimethod(readonly=True) def get_asset_metadata(self) -> typ.AssetMetadata: + """ + Get D-ASA metadata + + Returns: + Asset metadata + """ return typ.AssetMetadata(self.metadata) diff --git a/smart_contracts/fixed_coupon_bond/contract.py b/smart_contracts/fixed_coupon_bond/contract.py index 0c05964..9879b2c 100644 --- a/smart_contracts/fixed_coupon_bond/contract.py +++ b/smart_contracts/fixed_coupon_bond/contract.py @@ -211,7 +211,7 @@ def pay_coupon( payment_info: Additional payment information (Optional) Returns: - Paid coupon amount, Payment timestamp, Payment context + Paid coupon amount in denomination asset, Payment timestamp, Payment context Raises: UNAUTHORIZED: Not authorized @@ -273,7 +273,7 @@ def pay_principal( payment_info: Additional payment information (Optional) Returns: - Paid principal amount, Payment timestamp, Payment context + Paid principal amount in denomination asset, Payment timestamp, Payment context Raises: UNAUTHORIZED: Not authorized diff --git a/smart_contracts/perpetual_bond/contract.py b/smart_contracts/perpetual_bond/contract.py index ae3a154..1d9bc22 100644 --- a/smart_contracts/perpetual_bond/contract.py +++ b/smart_contracts/perpetual_bond/contract.py @@ -203,7 +203,7 @@ def pay_coupon( payment_info: Additional payment information (Optional) Returns: - Paid coupon amount, Payment timestamp, Payment context + Paid coupon amount in denomination asset, Payment timestamp, Payment context Raises: UNAUTHORIZED: Not authorized diff --git a/smart_contracts/zero_coupon_bond/contract.py b/smart_contracts/zero_coupon_bond/contract.py index 514ee80..f8755fb 100644 --- a/smart_contracts/zero_coupon_bond/contract.py +++ b/smart_contracts/zero_coupon_bond/contract.py @@ -128,7 +128,7 @@ def pay_principal( payment_info: Additional payment information (Optional) Returns: - Paid amount, Payment timestamp, Payment context + Paid amount in denomination asset, Payment timestamp, Payment context Raises: UNAUTHORIZED: Not authorized diff --git a/tests/base_d_asa/test_asset_config.py b/tests/base_d_asa/test_asset_config.py index dd5b2dd..2a1af28 100644 --- a/tests/base_d_asa/test_asset_config.py +++ b/tests/base_d_asa/test_asset_config.py @@ -37,6 +37,7 @@ def test_pass_asset_config( # Asset Configuration assert state.denomination_asset_id == currency.id + assert state.settlement_asset_id == state.denomination_asset_id assert state.unit_value == base_d_asa_cfg.minimum_denomination assert state.day_count_convention == base_d_asa_cfg.day_count_convention diff --git a/tests/base_d_asa/test_asset_create.py b/tests/base_d_asa/test_asset_create.py index aa1901c..cbb293d 100644 --- a/tests/base_d_asa/test_asset_create.py +++ b/tests/base_d_asa/test_asset_create.py @@ -21,6 +21,7 @@ def test_pass_asset_create( # Asset Configuration assert not state.denomination_asset_id + assert not state.settlement_asset_id assert not state.unit_value assert not state.day_count_convention diff --git a/tests/fixed_coupon_bond/test_asset_config.py b/tests/fixed_coupon_bond/test_asset_config.py index 65a727f..dac6b25 100644 --- a/tests/fixed_coupon_bond/test_asset_config.py +++ b/tests/fixed_coupon_bond/test_asset_config.py @@ -42,6 +42,7 @@ def test_pass_asset_config( # Asset Configuration assert state.denomination_asset_id == currency.id + assert state.settlement_asset_id == state.denomination_asset_id assert state.unit_value == fixed_coupon_bond_cfg.minimum_denomination assert state.day_count_convention == fixed_coupon_bond_cfg.day_count_convention diff --git a/tests/fixed_coupon_bond/test_asset_create.py b/tests/fixed_coupon_bond/test_asset_create.py index c2f86c6..1c848c3 100644 --- a/tests/fixed_coupon_bond/test_asset_create.py +++ b/tests/fixed_coupon_bond/test_asset_create.py @@ -23,6 +23,7 @@ def test_pass_asset_create( # Asset Configuration assert not state.denomination_asset_id + assert not state.settlement_asset_id assert not state.unit_value assert not state.day_count_convention diff --git a/tests/perpetual_bond/test_asset_config.py b/tests/perpetual_bond/test_asset_config.py index d46ea4d..4329b2f 100644 --- a/tests/perpetual_bond/test_asset_config.py +++ b/tests/perpetual_bond/test_asset_config.py @@ -43,6 +43,7 @@ def test_pass_asset_config( # Asset Configuration assert state.denomination_asset_id == currency.id + assert state.settlement_asset_id == state.denomination_asset_id assert state.unit_value == perpetual_bond_cfg.minimum_denomination assert state.day_count_convention == perpetual_bond_cfg.day_count_convention diff --git a/tests/perpetual_bond/test_asset_create.py b/tests/perpetual_bond/test_asset_create.py index 216351b..07becc5 100644 --- a/tests/perpetual_bond/test_asset_create.py +++ b/tests/perpetual_bond/test_asset_create.py @@ -23,6 +23,7 @@ def test_pass_asset_create( # Asset Configuration assert not state.denomination_asset_id + assert not state.settlement_asset_id assert not state.unit_value assert not state.day_count_convention diff --git a/tests/zero_coupon_bond/test_asset_config.py b/tests/zero_coupon_bond/test_asset_config.py index a6dd022..cd3bf47 100644 --- a/tests/zero_coupon_bond/test_asset_config.py +++ b/tests/zero_coupon_bond/test_asset_config.py @@ -38,6 +38,7 @@ def test_pass_asset_config( # Asset Configuration assert state.denomination_asset_id == currency.id + assert state.settlement_asset_id == state.denomination_asset_id assert state.unit_value == zero_coupon_bond_cfg.minimum_denomination assert state.day_count_convention == zero_coupon_bond_cfg.day_count_convention diff --git a/tests/zero_coupon_bond/test_asset_create.py b/tests/zero_coupon_bond/test_asset_create.py index 6c2be60..26222a8 100644 --- a/tests/zero_coupon_bond/test_asset_create.py +++ b/tests/zero_coupon_bond/test_asset_create.py @@ -23,6 +23,7 @@ def test_pass_asset_create( # Asset Configuration assert not state.denomination_asset_id + assert not state.settlement_asset_id assert not state.unit_value assert not state.day_count_convention