{ "name": "CollateralXProtocolManager", "structs": { "OwnerVaultIndexKey": [ { "name": "owner", "type": "address" }, { "name": "vaultId", "type": "uint64" } ], "ProtocolParamsSnapshot": [ { "name": "minCollateralRatioBps", "type": "uint64" }, { "name": "liquidationRatioBps", "type": "uint64" }, { "name": "liquidationPenaltyBps", "type": "uint64" }, { "name": "liquidationBonusBps", "type": "uint64" }, { "name": "oracleFreshnessWindowSeconds", "type": "uint64" }, { "name": "vaultMintCapMicroStable", "type": "uint64" }, { "name": "protocolDebtCeilingMicroStable", "type": "uint64" }, { "name": "minDebtFloorMicroStable", "type": "uint64" } ], "ProtocolStatusSnapshot": [ { "name": "admin", "type": "address" }, { "name": "initialized", "type": "uint64" }, { "name": "nextVaultId", "type": "uint64" }, { "name": "vaultCount", "type": "uint64" }, { "name": "totalDebtMicroStable", "type": "uint64" }, { "name": "totalCollateralMicroAlgo", "type": "uint64" }, { "name": "protocolFeeCollateralMicroAlgo", "type": "uint64" }, { "name": "pauseFlags", "type": "uint64" }, { "name": "oracleAppId", "type": "uint64" }, { "name": "stablecoinAppId", "type": "uint64" }, { "name": "liquidationAppId", "type": "uint64" } ], "VaultRecord": [ { "name": "id", "type": "uint64" }, { "name": "owner", "type": "address" }, { "name": "collateralMicroAlgo", "type": "uint64" }, { "name": "debtMicroStable", "type": "uint64" }, { "name": "createdAt", "type": "uint64" }, { "name": "updatedAt", "type": "uint64" }, { "name": "status", "type": "uint64" }, { "name": "version", "type": "uint64" } ] }, "methods": [ { "name": "createApplication", "args": [ { "type": "address", "name": "admin" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "desc": "Sets the immutable bootstrap admin at application creation.\nProtocol params are initialized separately so deployers can fund the app\naccount for boxes before vault creation starts.", "events": [ { "name": "ProtocolAdminCreated", "args": [ { "type": "address", "name": "0" } ] } ], "recommendations": {} }, { "name": "initializeProtocol", "args": [ { "type": "uint64", "name": "minCollateralRatioBps" }, { "type": "uint64", "name": "liquidationRatioBps" }, { "type": "uint64", "name": "liquidationPenaltyBps" }, { "type": "uint64", "name": "liquidationBonusBps" }, { "type": "uint64", "name": "oracleFreshnessWindowSeconds" }, { "type": "uint64", "name": "vaultMintCapMicroStable" }, { "type": "uint64", "name": "protocolDebtCeilingMicroStable" }, { "type": "uint64", "name": "minDebtFloorMicroStable" }, { "type": "uint64", "name": "oracleAppId" }, { "type": "uint64", "name": "stablecoinAppId" }, { "type": "uint64", "name": "liquidationAppId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "One-time protocol initialization. Only the bootstrap admin can call this.", "events": [ { "name": "ProtocolInitializedEvent", "args": [ { "type": "address", "name": "admin" }, { "type": "uint64", "name": "oracleAppId" }, { "type": "uint64", "name": "stablecoinAppId" }, { "type": "uint64", "name": "liquidationAppId" } ] } ], "recommendations": {} }, { "name": "createVault", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Creates an empty vault owned by the sender and returns its deterministic id.\nThe caller must include box refs and the app account must already have MBR.", "events": [ { "name": "VaultCreatedEvent", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "address", "name": "owner" }, { "type": "uint64", "name": "createdAt" } ] } ], "recommendations": {} }, { "name": "readVault", "args": [ { "type": "uint64", "name": "vaultId" } ], "returns": { "type": "(uint64,address,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "VaultRecord" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Read a vault record by deterministic id. Requires the vault box ref.", "events": [], "recommendations": {} }, { "name": "vaultExists", "args": [ { "type": "uint64", "name": "vaultId" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "True when the vault box exists. Useful for frontends and keepers.", "events": [], "recommendations": {} }, { "name": "readMaxMintable", "args": [ { "type": "uint64", "name": "vaultId" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the currently mintable amount for a vault after applying collateral,\nper-vault, protocol debt, and stablecoin supply ceilings. Requires vault box,\noracle app, and stablecoin controller app resources.", "events": [], "recommendations": {} }, { "name": "readProtocolStatus", "args": [], "returns": { "type": "(address,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "ProtocolStatusSnapshot" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns protocol-wide counters, pause flags, and integration ids.", "events": [], "recommendations": {} }, { "name": "readProtocolParams", "args": [], "returns": { "type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "ProtocolParamsSnapshot" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns protocol risk parameters.", "events": [], "recommendations": {} }, { "name": "adminSetParams", "args": [ { "type": "uint64", "name": "minCollateralRatioBps" }, { "type": "uint64", "name": "liquidationRatioBps" }, { "type": "uint64", "name": "liquidationPenaltyBps" }, { "type": "uint64", "name": "liquidationBonusBps" }, { "type": "uint64", "name": "oracleFreshnessWindowSeconds" }, { "type": "uint64", "name": "vaultMintCapMicroStable" }, { "type": "uint64", "name": "protocolDebtCeilingMicroStable" }, { "type": "uint64", "name": "minDebtFloorMicroStable" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Admin-only full parameter update. Future governance can wrap this call.", "events": [ { "name": "ProtocolParamsUpdatedEvent", "args": [ { "type": "address", "name": "admin" }, { "type": "uint64", "name": "minCollateralRatioBps" }, { "type": "uint64", "name": "liquidationRatioBps" }, { "type": "uint64", "name": "protocolDebtCeilingMicroStable" } ] } ], "recommendations": {} }, { "name": "adminSetIntegrations", "args": [ { "type": "uint64", "name": "oracleAppId" }, { "type": "uint64", "name": "stablecoinAppId" }, { "type": "uint64", "name": "liquidationAppId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Admin-only integration pointer update for replaceable modules.", "events": [ { "name": "ProtocolIntegrationsUpdatedEvent", "args": [ { "type": "address", "name": "admin" }, { "type": "uint64", "name": "oracleAppId" }, { "type": "uint64", "name": "stablecoinAppId" }, { "type": "uint64", "name": "liquidationAppId" } ] } ], "recommendations": {} }, { "name": "adminSetPauseFlags", "args": [ { "type": "uint64", "name": "pauseFlags" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Admin-only replacement of the pause bitmask.", "events": [ { "name": "ProtocolPauseFlagsUpdatedEvent", "args": [ { "type": "address", "name": "admin" }, { "type": "uint64", "name": "pauseFlags" } ] } ], "recommendations": {} }, { "name": "adminTransfer", "args": [ { "type": "address", "name": "newAdmin" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Admin transfer is explicit and logged for governance/indexers.", "events": [ { "name": "ProtocolAdminTransferred", "args": [ { "type": "address", "name": "0" }, { "type": "address", "name": "1" } ] } ], "recommendations": {} }, { "name": "depositCollateral", "args": [ { "type": "pay", "name": "payment" }, { "type": "uint64", "name": "vaultId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Deposits ALGO collateral into a vault.\n\nRequired group shape:\n- tx 0: payment from vault owner to this app address\n- tx 1: this app call with the payment transaction argument", "events": [ { "name": "CollateralDepositedEvent", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "address", "name": "owner" }, { "type": "uint64", "name": "amountMicroAlgo" }, { "type": "uint64", "name": "newCollateralMicroAlgo" }, { "type": "uint64", "name": "totalCollateralMicroAlgo" } ] } ], "recommendations": {} }, { "name": "mintStablecoin", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "uint64", "name": "amountMicroStable" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Mints stablecoin to the vault owner through the stablecoin controller.\n\nThis call must be a single outer transaction. It performs a protocol-gated\ninner app call to the stablecoin controller, which then transfers ASA units\nfrom its reserve account to the vault owner.", "events": [ { "name": "StablecoinMintedEvent", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "address", "name": "owner" }, { "type": "uint64", "name": "amountMicroStable" }, { "type": "uint64", "name": "newDebtMicroStable" }, { "type": "uint64", "name": "totalDebtMicroStable" } ] } ], "recommendations": {} }, { "name": "repay", "args": [ { "type": "axfer", "name": "repayment" }, { "type": "uint64", "name": "vaultId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Repays stablecoin debt.\n\nRequired group shape:\n- tx 0: stablecoin ASA transfer from vault owner to stablecoin controller\n- tx 1: this app call with the asset-transfer transaction argument", "events": [ { "name": "StablecoinRepaidEvent", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "address", "name": "owner" }, { "type": "uint64", "name": "amountMicroStable" }, { "type": "uint64", "name": "newDebtMicroStable" }, { "type": "uint64", "name": "totalDebtMicroStable" } ] } ], "recommendations": {} }, { "name": "withdrawCollateral", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "uint64", "name": "amountMicroAlgo" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Withdraws ALGO collateral. If this drains a debt-free vault, the vault and\nowner index boxes are deleted after aggregate accounting is updated.", "events": [ { "name": "CollateralWithdrawnEvent", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "address", "name": "owner" }, { "type": "uint64", "name": "amountMicroAlgo" }, { "type": "uint64", "name": "remainingCollateralMicroAlgo" }, { "type": "uint64", "name": "totalCollateralMicroAlgo" } ] }, { "name": "VaultClosedEvent", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "address", "name": "owner" }, { "type": "uint64", "name": "returnedCollateralMicroAlgo" }, { "type": "uint64", "name": "closedAt" } ] } ], "recommendations": {} }, { "name": "closeVault", "args": [ { "type": "uint64", "name": "vaultId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Closes a debt-free vault, returns all remaining collateral, and deletes the\nvault and owner-index boxes.", "events": [ { "name": "VaultClosedEvent", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "address", "name": "owner" }, { "type": "uint64", "name": "returnedCollateralMicroAlgo" }, { "type": "uint64", "name": "closedAt" } ] } ], "recommendations": {} }, { "name": "liquidate", "args": [ { "type": "axfer", "name": "repayment" }, { "type": "uint64", "name": "vaultId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Fully liquidates an unhealthy vault.\n\nRequired group shape:\n- tx 0: stablecoin ASA transfer from liquidator to stablecoin controller\n- tx 1: this app call with the asset-transfer transaction argument\n\nFull liquidation is intentionally atomic: the liquidator must repay exactly\nthe vault debt, the protocol retires that debt, deletes the vault boxes,\npays the configured collateral reward, records protocol fees, and returns\nany surplus collateral to the original vault owner.", "events": [ { "name": "VaultLiquidatedEvent", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "address", "name": "owner" }, { "type": "address", "name": "liquidator" }, { "type": "uint64", "name": "repaidDebtMicroStable" }, { "type": "uint64", "name": "liquidatorCollateralMicroAlgo" }, { "type": "uint64", "name": "protocolFeeCollateralMicroAlgo" }, { "type": "uint64", "name": "ownerRefundCollateralMicroAlgo" }, { "type": "uint64", "name": "pricePerAlgoMicroStable" }, { "type": "uint64", "name": "oracleUpdatedRound" }, { "type": "uint64", "name": "totalDebtMicroStable" }, { "type": "uint64", "name": "totalCollateralMicroAlgo" } ] } ], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "Protocol/vault manager.\n\nSafety-critical assumption: this contract owns the protocol's canonical vault\nboxes, while the stablecoin controller owns ASA reserve movement. Minting is\nonly requested by this app after vault health, caps, and oracle freshness pass.", "networks": {}, "state": { "schema": { "global": { "ints": 18, "bytes": 1 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "admin": { "keyType": "AVMString", "valueType": "address", "key": "YWRt" }, "initialized": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "aW5pdA==" }, "nextVaultId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bnZpZA==" }, "vaultCount": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dmNudA==" }, "totalDebtMicroStable": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dGRidA==" }, "totalCollateralMicroAlgo": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dGNvbA==" }, "protocolFeeCollateralMicroAlgo": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cGZlZQ==" }, "minCollateralRatioBps": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bWNy" }, "liquidationRatioBps": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bHFy" }, "liquidationPenaltyBps": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bHBu" }, "liquidationBonusBps": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bGJu" }, "oracleFreshnessWindowSeconds": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "b2Z3" }, "vaultMintCapMicroStable": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dm1jcA==" }, "protocolDebtCeilingMicroStable": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cGRj" }, "minDebtFloorMicroStable": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZGZsbw==" }, "pauseFlags": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cGZsZw==" }, "oracleAppId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "b2FwcA==" }, "stablecoinAppId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c2FwcA==" }, "liquidationAppId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bGFwcA==" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "vaults": { "keyType": "uint64", "valueType": "VaultRecord", "prefix": "dg==" }, "ownerVaults": { "keyType": "OwnerVaultIndexKey", "valueType": "uint64", "prefix": "bw==" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 2012, 2640 ], "errorMessage": "Box must have value" }, { "pc": [ 211 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 3097 ], "errorMessage": "action paused" }, { "pc": [ 3075 ], "errorMessage": "admin only" }, { "pc": [ 483, 1415 ], "errorMessage": "admin required" }, { "pc": [ 608 ], "errorMessage": "already initialized" }, { "pc": [ 1797, 1971, 2682 ], "errorMessage": "application exists" }, { "pc": [ 3672 ], "errorMessage": "bonus too high" }, { "pc": [ 635, 1224 ], "errorMessage": "ceiling below debt" }, { "pc": [ 3684 ], "errorMessage": "ceiling below vault cap" }, { "pc": [ 606, 631, 699, 734, 808, 945, 950, 955, 960, 964, 968, 973, 978, 983, 988, 993, 1047, 1052, 1057, 1062, 1067, 1072, 1077, 1082, 1220, 1564, 1733, 1747, 1761, 1781, 1951, 2049, 2064, 2250, 2266, 2479, 2661, 2740, 2755, 2791, 2849, 2869, 2887, 3062, 3073, 3084, 3103, 3110, 3258, 3335, 3343, 3350, 3358, 3559 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 2431 ], "errorMessage": "close app call index" }, { "pc": [ 2427 ], "errorMessage": "close group size" }, { "pc": [ 1751, 2060 ], "errorMessage": "debt below floor" }, { "pc": [ 3690 ], "errorMessage": "debt floor too high" }, { "pc": [ 2468 ], "errorMessage": "debt not zero" }, { "pc": [ 1474 ], "errorMessage": "deposit app call index" }, { "pc": [ 1463 ], "errorMessage": "deposit group size" }, { "pc": [ 1469 ], "errorMessage": "deposit payment index" }, { "pc": [ 425 ], "errorMessage": "division by zero" }, { "pc": [ 3095 ], "errorMessage": "emergency paused" }, { "pc": [ 478, 1404 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 507, 516, 525, 534, 543, 552, 561, 570, 579, 588, 597, 845, 872, 902, 1127, 1136, 1145, 1154, 1163, 1172, 1181, 1190, 1295, 1304, 1313, 1367, 1453, 1627, 1636, 1899, 2146, 2155, 2418, 2557 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 2577 ], "errorMessage": "liquidation app call index" }, { "pc": [ 2691 ], "errorMessage": "liquidation asset mismatch" }, { "pc": [ 2705 ], "errorMessage": "liquidation close forbidden" }, { "pc": [ 2568 ], "errorMessage": "liquidation group size" }, { "pc": [ 3660 ], "errorMessage": "liquidation ratio above min" }, { "pc": [ 2745, 3654 ], "errorMessage": "liquidation ratio too low" }, { "pc": [ 2684 ], "errorMessage": "liquidation receiver mismatch" }, { "pc": [ 2698 ], "errorMessage": "liquidation rekey forbidden" }, { "pc": [ 2711 ], "errorMessage": "liquidation repay amount" }, { "pc": [ 2674 ], "errorMessage": "liquidation sender mismatch" }, { "pc": [ 2572 ], "errorMessage": "liquidation transfer index" }, { "pc": [ 368, 3375, 3649 ], "errorMessage": "min ratio too low" }, { "pc": [ 1650 ], "errorMessage": "mint app call index" }, { "pc": [ 1712 ], "errorMessage": "mint exceeds safe amount" }, { "pc": [ 1646 ], "errorMessage": "mint group size" }, { "pc": [ 2656 ], "errorMessage": "no debt" }, { "pc": [ 3105 ], "errorMessage": "oracle app required" }, { "pc": [ 3160 ], "errorMessage": "oracle max age missing" }, { "pc": [ 3173 ], "errorMessage": "oracle max age required" }, { "pc": [ 3161 ], "errorMessage": "oracle pause missing" }, { "pc": [ 3151 ], "errorMessage": "oracle price missing" }, { "pc": [ 363, 396, 2742, 3164, 3378 ], "errorMessage": "oracle price required" }, { "pc": [ 3179 ], "errorMessage": "oracle reads paused" }, { "pc": [ 3191 ], "errorMessage": "oracle round future" }, { "pc": [ 3157 ], "errorMessage": "oracle round missing" }, { "pc": [ 3170 ], "errorMessage": "oracle round required" }, { "pc": [ 3201, 3205 ], "errorMessage": "oracle stale" }, { "pc": [ 3185 ], "errorMessage": "oracle timestamp future" }, { "pc": [ 3154 ], "errorMessage": "oracle timestamp missing" }, { "pc": [ 3167 ], "errorMessage": "oracle timestamp required" }, { "pc": [ 3675 ], "errorMessage": "oracle window required" }, { "pc": [ 3638 ], "errorMessage": "owner index cleanup missing" }, { "pc": [ 1538 ], "errorMessage": "payment close forbidden" }, { "pc": [ 1522 ], "errorMessage": "payment receiver mismatch" }, { "pc": [ 1530 ], "errorMessage": "payment rekey forbidden" }, { "pc": [ 1514 ], "errorMessage": "payment sender mismatch" }, { "pc": [ 3666 ], "errorMessage": "penalty too high" }, { "pc": [ 3065 ], "errorMessage": "protocol not initialized" }, { "pc": [ 1923 ], "errorMessage": "repay app call index" }, { "pc": [ 1979 ], "errorMessage": "repay asset mismatch" }, { "pc": [ 1995 ], "errorMessage": "repay close forbidden" }, { "pc": [ 2033 ], "errorMessage": "repay exceeds debt" }, { "pc": [ 1912 ], "errorMessage": "repay group size" }, { "pc": [ 1973 ], "errorMessage": "repay receiver mismatch" }, { "pc": [ 1987 ], "errorMessage": "repay rekey forbidden" }, { "pc": [ 1962 ], "errorMessage": "repay sender mismatch" }, { "pc": [ 1918 ], "errorMessage": "repay transfer index" }, { "pc": [ 3290 ], "errorMessage": "stable asset missing" }, { "pc": [ 3297 ], "errorMessage": "stable asset required" }, { "pc": [ 3294 ], "errorMessage": "stable ceiling missing" }, { "pc": [ 3299 ], "errorMessage": "stable ceiling required" }, { "pc": [ 3293 ], "errorMessage": "stable supply missing" }, { "pc": [ 3260 ], "errorMessage": "stablecoin app required" }, { "pc": [ 1891, 2549 ], "errorMessage": "transaction type is axfer" }, { "pc": [ 1445 ], "errorMessage": "transaction type is pay" }, { "pc": [ 444, 455, 466, 1559, 1572, 1728, 1741, 2764, 2899, 3391, 3403 ], "errorMessage": "uint64 overflow" }, { "pc": [ 2038, 2072, 2229, 2274, 2484, 2820, 2840, 2857, 2877 ], "errorMessage": "uint64 underflow" }, { "pc": [ 3678 ], "errorMessage": "vault cap required" }, { "pc": [ 3624 ], "errorMessage": "vault cleanup missing" }, { "pc": [ 746 ], "errorMessage": "vault exists" }, { "pc": [ 2750 ], "errorMessage": "vault healthy" }, { "pc": [ 1498, 1680, 2019, 2206, 2454, 2647 ], "errorMessage": "vault inactive" }, { "pc": [ 855, 915, 1488, 1667, 1943, 2191, 2445, 2628 ], "errorMessage": "vault missing" }, { "pc": [ 1506, 1688, 2027, 2214, 2462 ], "errorMessage": "vault owner only" }, { "pc": [ 1772 ], "errorMessage": "vault unhealthy" }, { "pc": [ 2171 ], "errorMessage": "withdraw app call index" }, { "pc": [ 2224 ], "errorMessage": "withdraw exceeds collateral" }, { "pc": [ 2167 ], "errorMessage": "withdraw group size" }, { "pc": [ 2262 ], "errorMessage": "withdraw unhealthy" }, { "pc": [ 1544 ], "errorMessage": "zero deposit" }, { "pc": [ 1670 ], "errorMessage": "zero mint" }, { "pc": [ 2003 ], "errorMessage": "zero repay" }, { "pc": [ 2194 ], "errorMessage": "zero withdraw" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMTAwMDAgMTAwMDAwCiAgICBieXRlY2Jsb2NrICJ0ZGJ0IiAweGZmZmZmZmZmZmZmZmZmZmYgInYiICJ0Y29sIiAic2FwcCIgIm1jciIgImRmbG8iIDB4MTUxZjdjNzUgImluaXQiICJscXIiICJscG4iICJsYm4iICJvZnciICJ2bWNwIiAicGRjIiAicGZsZyIgIm9hcHAiICJhZG0iICJudmlkIiAidmNudCIgInBmZWUiICJsYXBwIiAweDI3MTAgMHgwZjQyNDAgMHg4YmVjNGRhNyAweDA2ODEwMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjAzCiAgICAvLyBpbml0aWFsaXplZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdpbml0JywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDggLy8gImluaXQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwNAogICAgLy8gbmV4dFZhdWx0SWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnZpZCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDEpIH0pCiAgICBieXRlYyAxOCAvLyAibnZpZCIKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA1CiAgICAvLyB2YXVsdENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3ZjbnQnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMTkgLy8gInZjbnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gdG90YWxEZWJ0TWljcm9TdGFibGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndGRidCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18wIC8vICJ0ZGJ0IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMDcKICAgIC8vIHRvdGFsQ29sbGF0ZXJhbE1pY3JvQWxnbyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd0Y29sJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjXzMgLy8gInRjb2wiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwOAogICAgLy8gcHJvdG9jb2xGZWVDb2xsYXRlcmFsTWljcm9BbGdvID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3BmZWUnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMjAgLy8gInBmZWUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwOQogICAgLy8gbWluQ29sbGF0ZXJhbFJhdGlvQnBzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ21jcicsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA1IC8vICJtY3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIxMAogICAgLy8gbGlxdWlkYXRpb25SYXRpb0JwcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdscXInLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgOSAvLyAibHFyIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTEKICAgIC8vIGxpcXVpZGF0aW9uUGVuYWx0eUJwcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdscG4nLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMTAgLy8gImxwbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjEyCiAgICAvLyBsaXF1aWRhdGlvbkJvbnVzQnBzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2xibicsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxMSAvLyAibGJuIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTMKICAgIC8vIG9yYWNsZUZyZXNobmVzc1dpbmRvd1NlY29uZHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnb2Z3JywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDEyIC8vICJvZnciCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIxNAogICAgLy8gdmF1bHRNaW50Q2FwTWljcm9TdGFibGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndm1jcCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxMyAvLyAidm1jcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjE1CiAgICAvLyBwcm90b2NvbERlYnRDZWlsaW5nTWljcm9TdGFibGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncGRjJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDE0IC8vICJwZGMiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gbWluRGVidEZsb29yTWljcm9TdGFibGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZGZsbycsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA2IC8vICJkZmxvIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTcKICAgIC8vIHBhdXNlRmxhZ3MgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncGZsZycsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxNSAvLyAicGZsZyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjE4CiAgICAvLyBvcmFjbGVBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdvYXBwJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDE2IC8vICJvYXBwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTkKICAgIC8vIHN0YWJsZWNvaW5BcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzYXBwJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDQgLy8gInNhcHAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIyMAogICAgLy8gbGlxdWlkYXRpb25BcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdsYXBwJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDIxIC8vICJsYXBwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwMQogICAgLy8gZXhwb3J0IGNsYXNzIENvbGxhdGVyYWxYUHJvdG9jb2xNYW5hZ2VyIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDIzCiAgICBwdXNoYnl0ZXNzIDB4NjAxNDFmMmIgMHg2OWExOGE0YyAweDk4YTc1ZDQ3IDB4OGZiMTVkZTMgMHhiMmJkYjdjNiAweDVjOTc5NThhIDB4NDViYTE1YjQgMHg3ZWJjN2U1MSAweDA4NDczYTNiIDB4ZjdjZDg5ODAgMHg5OWVjNGEwNSAweDcxMjgzYjJkIDB4YjFiOGU2MzEgMHhjNTk5ZDY2NiAweDE3M2I0YTM0IDB4MDBiYjg4ZTkgMHgwN2IyNzFhZCAvLyBtZXRob2QgImluaXRpYWxpemVQcm90b2NvbCh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgImNyZWF0ZVZhdWx0KCl1aW50NjQiLCBtZXRob2QgInJlYWRWYXVsdCh1aW50NjQpKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidmF1bHRFeGlzdHModWludDY0KWJvb2wiLCBtZXRob2QgInJlYWRNYXhNaW50YWJsZSh1aW50NjQpdWludDY0IiwgbWV0aG9kICJyZWFkUHJvdG9jb2xTdGF0dXMoKShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiLCBtZXRob2QgInJlYWRQcm90b2NvbFBhcmFtcygpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhZG1pblNldFBhcmFtcyh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgImFkbWluU2V0SW50ZWdyYXRpb25zKHVpbnQ2NCx1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgImFkbWluU2V0UGF1c2VGbGFncyh1aW50NjQpdm9pZCIsIG1ldGhvZCAiYWRtaW5UcmFuc2ZlcihhZGRyZXNzKXZvaWQiLCBtZXRob2QgImRlcG9zaXRDb2xsYXRlcmFsKHBheSx1aW50NjQpdm9pZCIsIG1ldGhvZCAibWludFN0YWJsZWNvaW4odWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJyZXBheShheGZlcix1aW50NjQpdm9pZCIsIG1ldGhvZCAid2l0aGRyYXdDb2xsYXRlcmFsKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiY2xvc2VWYXVsdCh1aW50NjQpdm9pZCIsIG1ldGhvZCAibGlxdWlkYXRlKGF4ZmVyLHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggaW5pdGlhbGl6ZVByb3RvY29sIGNyZWF0ZVZhdWx0IHJlYWRWYXVsdCB2YXVsdEV4aXN0cyByZWFkTWF4TWludGFibGUgcmVhZFByb3RvY29sU3RhdHVzIHJlYWRQcm90b2NvbFBhcmFtcyBhZG1pblNldFBhcmFtcyBhZG1pblNldEludGVncmF0aW9ucyBhZG1pblNldFBhdXNlRmxhZ3MgYWRtaW5UcmFuc2ZlciBkZXBvc2l0Q29sbGF0ZXJhbCBtaW50U3RhYmxlY29pbiByZXBheSB3aXRoZHJhd0NvbGxhdGVyYWwgY2xvc2VWYXVsdCBsaXF1aWRhdGUKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwMQogICAgLy8gZXhwb3J0IGNsYXNzIENvbGxhdGVyYWxYUHJvdG9jb2xNYW5hZ2VyIGV4dGVuZHMgQ29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4ZDMyNGJlYTQgLy8gbWV0aG9kICJjcmVhdGVBcHBsaWNhdGlvbihhZGRyZXNzKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGVBcHBsaWNhdGlvbgogICAgZXJyCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6OmlzSGVhbHRoeURlYnQoY29sbGF0ZXJhbE1pY3JvQWxnbzogdWludDY0LCBkZWJ0TWljcm9TdGFibGU6IHVpbnQ2NCwgcHJpY2VQZXJBbGdvTWljcm9TdGFibGU6IHVpbnQ2NCwgbWluQ29sbGF0ZXJhbFJhdGlvQnBzOiB1aW50NjQpIC0+IHVpbnQ2NDoKaXNIZWFsdGh5RGVidDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjU2LTYxCiAgICAvLyBleHBvcnQgZnVuY3Rpb24gaXNIZWFsdGh5RGVidCgKICAgIC8vICAgY29sbGF0ZXJhbE1pY3JvQWxnbzogdWludDY0LAogICAgLy8gICBkZWJ0TWljcm9TdGFibGU6IHVpbnQ2NCwKICAgIC8vICAgcHJpY2VQZXJBbGdvTWljcm9TdGFibGU6IHVpbnQ2NCwKICAgIC8vICAgbWluQ29sbGF0ZXJhbFJhdGlvQnBzOiB1aW50NjQKICAgIC8vICk6IGJvb2xlYW4gewogICAgcHJvdG8gNCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo2MgogICAgLy8gYXNzZXJ0KHByaWNlUGVyQWxnb01pY3JvU3RhYmxlID4gVWludDY0KDApLCAnb3JhY2xlIHByaWNlIHJlcXVpcmVkJykKICAgIGZyYW1lX2RpZyAtMgogICAgYXNzZXJ0IC8vIG9yYWNsZSBwcmljZSByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6NjMKICAgIC8vIGFzc2VydChtaW5Db2xsYXRlcmFsUmF0aW9CcHMgPj0gQlBTX0RFTk9NSU5BVE9SLCAnbWluIHJhdGlvIHRvbyBsb3cnKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzMgLy8gMTAwMDAKICAgID49CiAgICBhc3NlcnQgLy8gbWluIHJhdGlvIHRvbyBsb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjY0CiAgICAvLyBjb25zdCBsZWZ0OiBiaWd1aW50ID0gQmlnVWludChjb2xsYXRlcmFsTWljcm9BbGdvKSAqIEJpZ1VpbnQocHJpY2VQZXJBbGdvTWljcm9TdGFibGUpICogQmlnVWludChCUFNfREVOT01JTkFUT1IpCiAgICBmcmFtZV9kaWcgLTQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgYioKICAgIGJ5dGVjIDIyIC8vIDB4MjcxMAogICAgYioKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjY1CiAgICAvLyBjb25zdCByaWdodDogYmlndWludCA9IEJpZ1VpbnQoZGVidE1pY3JvU3RhYmxlKSAqIEJpZ1VpbnQoTUlDUk9fVU5JVCkgKiBCaWdVaW50KG1pbkNvbGxhdGVyYWxSYXRpb0JwcykKICAgIGZyYW1lX2RpZyAtMwogICAgaXRvYgogICAgYnl0ZWMgMjMgLy8gMHgwZjQyNDAKICAgIGIqCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo2NgogICAgLy8gcmV0dXJuIGxlZnQgPj0gcmlnaHQKICAgIGI+PQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6OmRlYnRUb0NvbGxhdGVyYWxNaWNyb0FsZ28oZGVidE1pY3JvU3RhYmxlOiB1aW50NjQsIHByaWNlUGVyQWxnb01pY3JvU3RhYmxlOiB1aW50NjQsIHByZW1pdW1PckZlZUJwczogdWludDY0LCByb3VuZFVwOiB1aW50NjQpIC0+IHVpbnQ2NDoKZGVidFRvQ29sbGF0ZXJhbE1pY3JvQWxnbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjg2LTkxCiAgICAvLyBmdW5jdGlvbiBkZWJ0VG9Db2xsYXRlcmFsTWljcm9BbGdvKAogICAgLy8gICBkZWJ0TWljcm9TdGFibGU6IHVpbnQ2NCwKICAgIC8vICAgcHJpY2VQZXJBbGdvTWljcm9TdGFibGU6IHVpbnQ2NCwKICAgIC8vICAgcHJlbWl1bU9yRmVlQnBzOiB1aW50NjQsCiAgICAvLyAgIHJvdW5kVXA6IGJvb2xlYW4KICAgIC8vICk6IHVpbnQ2NCB7CiAgICBwcm90byA0IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjkyCiAgICAvLyBhc3NlcnQocHJpY2VQZXJBbGdvTWljcm9TdGFibGUgPiBVaW50NjQoMCksICdvcmFjbGUgcHJpY2UgcmVxdWlyZWQnKQogICAgZnJhbWVfZGlnIC0zCiAgICBhc3NlcnQgLy8gb3JhY2xlIHByaWNlIHJlcXVpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo5MwogICAgLy8gY29uc3QgbnVtZXJhdG9yOiBiaWd1aW50ID0gQmlnVWludChkZWJ0TWljcm9TdGFibGUpICogQmlnVWludChNSUNST19VTklUKSAqIEJpZ1VpbnQocHJlbWl1bU9yRmVlQnBzKQogICAgZnJhbWVfZGlnIC00CiAgICBpdG9iCiAgICBieXRlYyAyMyAvLyAweDBmNDI0MAogICAgYioKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgYioKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjk0CiAgICAvLyBjb25zdCBkZW5vbWluYXRvcjogYmlndWludCA9IEJpZ1VpbnQocHJpY2VQZXJBbGdvTWljcm9TdGFibGUpICogQmlnVWludChCUFNfREVOT01JTkFUT1IpCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIGJ5dGVjIDIyIC8vIDB4MjcxMAogICAgYioKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjk1CiAgICAvLyBpZiAocm91bmRVcCkgewogICAgZnJhbWVfZGlnIC0xCiAgICBieiBkZWJ0VG9Db2xsYXRlcmFsTWljcm9BbGdvX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MjAKICAgIC8vIGFzc2VydChkZW5vbWluYXRvciA+IEJpZ1VpbnQoMCksICdkaXZpc2lvbiBieSB6ZXJvJykKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAweAogICAgYj4KICAgIGFzc2VydCAvLyBkaXZpc2lvbiBieSB6ZXJvCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoyMQogICAgLy8gY29uc3QgcXVvdGllbnQ6IGJpZ3VpbnQgPSBudW1lcmF0b3IgLyBkZW5vbWluYXRvcgogICAgc3dhcAogICAgZHVwCiAgICBkaWcgMgogICAgYi8KICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjIyCiAgICAvLyBpZiAobnVtZXJhdG9yICUgZGVub21pbmF0b3IgPT09IEJpZ1VpbnQoMCkpIHsKICAgIHN3YXAKICAgIGIlCiAgICBwdXNoYnl0ZXMgMHgKICAgIGI9PQogICAgYnogZGVidFRvQ29sbGF0ZXJhbE1pY3JvQWxnb19hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjE1CiAgICAvLyBhc3NlcnQodmFsdWUgPD0gQmlnVWludChVaW50NjQuTUFYX1ZBTFVFKSwgJ3VpbnQ2NCBvdmVyZmxvdycpCiAgICBkdXAKICAgIGJ5dGVjXzEgLy8gMHhmZmZmZmZmZmZmZmZmZmZmCiAgICBiPD0KICAgIGFzc2VydCAvLyB1aW50NjQgb3ZlcmZsb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjE2CiAgICAvLyByZXR1cm4gb3AuYnRvaShCeXRlcyh2YWx1ZSkpCiAgICBidG9pCgpkZWJ0VG9Db2xsYXRlcmFsTWljcm9BbGdvX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6OmJpZ0RpdkNlaWxANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjk2CiAgICAvLyByZXR1cm4gYmlnRGl2Q2VpbChudW1lcmF0b3IsIGRlbm9taW5hdG9yKQogICAgc3dhcAogICAgcmV0c3ViCgpkZWJ0VG9Db2xsYXRlcmFsTWljcm9BbGdvX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjI1CiAgICAvLyByZXR1cm4gYmlnVG9VaW50NjQocXVvdGllbnQgKyBCaWdVaW50KDEpKQogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGIrCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxNQogICAgLy8gYXNzZXJ0KHZhbHVlIDw9IEJpZ1VpbnQoVWludDY0Lk1BWF9WQUxVRSksICd1aW50NjQgb3ZlcmZsb3cnKQogICAgZHVwCiAgICBieXRlY18xIC8vIDB4ZmZmZmZmZmZmZmZmZmZmZgogICAgYjw9CiAgICBhc3NlcnQgLy8gdWludDY0IG92ZXJmbG93CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxNgogICAgLy8gcmV0dXJuIG9wLmJ0b2koQnl0ZXModmFsdWUpKQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6OTYKICAgIC8vIHJldHVybiBiaWdEaXZDZWlsKG51bWVyYXRvciwgZGVub21pbmF0b3IpCiAgICBiIGRlYnRUb0NvbGxhdGVyYWxNaWNyb0FsZ29fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo6YmlnRGl2Q2VpbEA2CgpkZWJ0VG9Db2xsYXRlcmFsTWljcm9BbGdvX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjk4CiAgICAvLyByZXR1cm4gYmlnVG9VaW50NjQobnVtZXJhdG9yIC8gZGVub21pbmF0b3IpCiAgICBmcmFtZV9kaWcgMAogICAgYi8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjE1CiAgICAvLyBhc3NlcnQodmFsdWUgPD0gQmlnVWludChVaW50NjQuTUFYX1ZBTFVFKSwgJ3VpbnQ2NCBvdmVyZmxvdycpCiAgICBkdXAKICAgIGJ5dGVjXzEgLy8gMHhmZmZmZmZmZmZmZmZmZmZmCiAgICBiPD0KICAgIGFzc2VydCAvLyB1aW50NjQgb3ZlcmZsb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjE2CiAgICAvLyByZXR1cm4gb3AuYnRvaShCeXRlcyh2YWx1ZSkpCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo5OAogICAgLy8gcmV0dXJuIGJpZ1RvVWludDY0KG51bWVyYXRvciAvIGRlbm9taW5hdG9yKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6OkNvbGxhdGVyYWxYUHJvdG9jb2xNYW5hZ2VyLmNyZWF0ZUFwcGxpY2F0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlQXBwbGljYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMzAKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMzIKICAgIC8vIGFzc2VydChhZG1pbiAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAnYWRtaW4gcmVxdWlyZWQnKQogICAgZHVwCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gYWRtaW4gcmVxdWlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwMgogICAgLy8gYWRtaW4gPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogJ2FkbScgfSkKICAgIGJ5dGVjIDE3IC8vICJhZG0iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMzMKICAgIC8vIHRoaXMuYWRtaW4udmFsdWUgPSBhZG1pbgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMzQKICAgIC8vIGVtaXQoJ1Byb3RvY29sQWRtaW5DcmVhdGVkJywgYWRtaW4pCiAgICBwdXNoYnl0ZXMgMHgzZDhjN2EzYSAvLyBtZXRob2QgIlByb3RvY29sQWRtaW5DcmVhdGVkKGFkZHJlc3MpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIzMAogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo6Q29sbGF0ZXJhbFhQcm90b2NvbE1hbmFnZXIuaW5pdGlhbGl6ZVByb3RvY29sW3JvdXRpbmddKCkgLT4gdm9pZDoKaW5pdGlhbGl6ZVByb3RvY29sOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjQwLTI1MgogICAgLy8gcHVibGljIGluaXRpYWxpemVQcm90b2NvbCgKICAgIC8vICAgbWluQ29sbGF0ZXJhbFJhdGlvQnBzOiB1aW50NjQsCiAgICAvLyAgIGxpcXVpZGF0aW9uUmF0aW9CcHM6IHVpbnQ2NCwKICAgIC8vICAgbGlxdWlkYXRpb25QZW5hbHR5QnBzOiB1aW50NjQsCiAgICAvLyAgIGxpcXVpZGF0aW9uQm9udXNCcHM6IHVpbnQ2NCwKICAgIC8vICAgb3JhY2xlRnJlc2huZXNzV2luZG93U2Vjb25kczogdWludDY0LAogICAgLy8gICB2YXVsdE1pbnRDYXBNaWNyb1N0YWJsZTogdWludDY0LAogICAgLy8gICBwcm90b2NvbERlYnRDZWlsaW5nTWljcm9TdGFibGU6IHVpbnQ2NCwKICAgIC8vICAgbWluRGVidEZsb29yTWljcm9TdGFibGU6IHVpbnQ2NCwKICAgIC8vICAgb3JhY2xlQXBwSWQ6IHVpbnQ2NCwKICAgIC8vICAgc3RhYmxlY29pbkFwcElkOiB1aW50NjQsCiAgICAvLyAgIGxpcXVpZGF0aW9uQXBwSWQ6IHVpbnQ2NAogICAgLy8gKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjI1MwogICAgLy8gdGhpcy5hc3NlcnRBZG1pbigpCiAgICBjYWxsc3ViIGFzc2VydEFkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyNTQKICAgIC8vIGFzc2VydCh0aGlzLmluaXRpYWxpemVkLnZhbHVlID09PSBVaW50NjQoMCksICdhbHJlYWR5IGluaXRpYWxpemVkJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMDMKICAgIC8vIGluaXRpYWxpemVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2luaXQnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgOCAvLyAiaW5pdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjI1NAogICAgLy8gYXNzZXJ0KHRoaXMuaW5pdGlhbGl6ZWQudmFsdWUgPT09IFVpbnQ2NCgwKSwgJ2FscmVhZHkgaW5pdGlhbGl6ZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IGluaXRpYWxpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyNTUtMjY0CiAgICAvLyB0aGlzLnZhbGlkYXRlUGFyYW1zKAogICAgLy8gICBtaW5Db2xsYXRlcmFsUmF0aW9CcHMsCiAgICAvLyAgIGxpcXVpZGF0aW9uUmF0aW9CcHMsCiAgICAvLyAgIGxpcXVpZGF0aW9uUGVuYWx0eUJwcywKICAgIC8vICAgbGlxdWlkYXRpb25Cb251c0JwcywKICAgIC8vICAgb3JhY2xlRnJlc2huZXNzV2luZG93U2Vjb25kcywKICAgIC8vICAgdmF1bHRNaW50Q2FwTWljcm9TdGFibGUsCiAgICAvLyAgIHByb3RvY29sRGVidENlaWxpbmdNaWNyb1N0YWJsZSwKICAgIC8vICAgbWluRGVidEZsb29yTWljcm9TdGFibGUKICAgIC8vICkKICAgIGRpZyAxMAogICAgZGlnIDEwCiAgICBkaWcgMTAKICAgIGRpZyAxMAogICAgZGlnIDEwCiAgICBkaWcgMTAKICAgIGRpZyAxMAogICAgZGlnIDEwCiAgICBjYWxsc3ViIHZhbGlkYXRlUGFyYW1zCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyNjUKICAgIC8vIGFzc2VydCh0aGlzLnRvdGFsRGVidE1pY3JvU3RhYmxlLnZhbHVlIDw9IHByb3RvY29sRGVidENlaWxpbmdNaWNyb1N0YWJsZSwgJ2NlaWxpbmcgYmVsb3cgZGVidCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA2CiAgICAvLyB0b3RhbERlYnRNaWNyb1N0YWJsZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd0ZGJ0JywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjXzAgLy8gInRkYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyNjUKICAgIC8vIGFzc2VydCh0aGlzLnRvdGFsRGVidE1pY3JvU3RhYmxlLnZhbHVlIDw9IHByb3RvY29sRGVidENlaWxpbmdNaWNyb1N0YWJsZSwgJ2NlaWxpbmcgYmVsb3cgZGVidCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDUKICAgIDw9CiAgICBhc3NlcnQgLy8gY2VpbGluZyBiZWxvdyBkZWJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMDkKICAgIC8vIG1pbkNvbGxhdGVyYWxSYXRpb0JwcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdtY3InLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgNSAvLyAibWNyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjY3CiAgICAvLyB0aGlzLm1pbkNvbGxhdGVyYWxSYXRpb0Jwcy52YWx1ZSA9IG1pbkNvbGxhdGVyYWxSYXRpb0JwcwogICAgdW5jb3ZlciAxMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIxMAogICAgLy8gbGlxdWlkYXRpb25SYXRpb0JwcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdscXInLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgOSAvLyAibHFyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjY4CiAgICAvLyB0aGlzLmxpcXVpZGF0aW9uUmF0aW9CcHMudmFsdWUgPSBsaXF1aWRhdGlvblJhdGlvQnBzCiAgICB1bmNvdmVyIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjExCiAgICAvLyBsaXF1aWRhdGlvblBlbmFsdHlCcHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbHBuJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDEwIC8vICJscG4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyNjkKICAgIC8vIHRoaXMubGlxdWlkYXRpb25QZW5hbHR5QnBzLnZhbHVlID0gbGlxdWlkYXRpb25QZW5hbHR5QnBzCiAgICB1bmNvdmVyIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTIKICAgIC8vIGxpcXVpZGF0aW9uQm9udXNCcHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbGJuJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDExIC8vICJsYm4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyNzAKICAgIC8vIHRoaXMubGlxdWlkYXRpb25Cb251c0Jwcy52YWx1ZSA9IGxpcXVpZGF0aW9uQm9udXNCcHMKICAgIHVuY292ZXIgOAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIxMwogICAgLy8gb3JhY2xlRnJlc2huZXNzV2luZG93U2Vjb25kcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdvZncnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMTIgLy8gIm9mdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gdGhpcy5vcmFjbGVGcmVzaG5lc3NXaW5kb3dTZWNvbmRzLnZhbHVlID0gb3JhY2xlRnJlc2huZXNzV2luZG93U2Vjb25kcwogICAgdW5jb3ZlciA3CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjE0CiAgICAvLyB2YXVsdE1pbnRDYXBNaWNyb1N0YWJsZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd2bWNwJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDEzIC8vICJ2bWNwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjcyCiAgICAvLyB0aGlzLnZhdWx0TWludENhcE1pY3JvU3RhYmxlLnZhbHVlID0gdmF1bHRNaW50Q2FwTWljcm9TdGFibGUKICAgIHVuY292ZXIgNgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIxNQogICAgLy8gcHJvdG9jb2xEZWJ0Q2VpbGluZ01pY3JvU3RhYmxlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3BkYycsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxNCAvLyAicGRjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjczCiAgICAvLyB0aGlzLnByb3RvY29sRGVidENlaWxpbmdNaWNyb1N0YWJsZS52YWx1ZSA9IHByb3RvY29sRGVidENlaWxpbmdNaWNyb1N0YWJsZQogICAgdW5jb3ZlciA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjE2CiAgICAvLyBtaW5EZWJ0Rmxvb3JNaWNyb1N0YWJsZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdkZmxvJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDYgLy8gImRmbG8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyNzQKICAgIC8vIHRoaXMubWluRGVidEZsb29yTWljcm9TdGFibGUudmFsdWUgPSBtaW5EZWJ0Rmxvb3JNaWNyb1N0YWJsZQogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjE4CiAgICAvLyBvcmFjbGVBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdvYXBwJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDE2IC8vICJvYXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6Mjc1CiAgICAvLyB0aGlzLm9yYWNsZUFwcElkLnZhbHVlID0gb3JhY2xlQXBwSWQKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjE5CiAgICAvLyBzdGFibGVjb2luQXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc2FwcCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA0IC8vICJzYXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyB0aGlzLnN0YWJsZWNvaW5BcHBJZC52YWx1ZSA9IHN0YWJsZWNvaW5BcHBJZAogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMjAKICAgIC8vIGxpcXVpZGF0aW9uQXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbGFwcCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAyMSAvLyAibGFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjI3NwogICAgLy8gdGhpcy5saXF1aWRhdGlvbkFwcElkLnZhbHVlID0gbGlxdWlkYXRpb25BcHBJZAogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMDMKICAgIC8vIGluaXRpYWxpemVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2luaXQnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgOCAvLyAiaW5pdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjI3OAogICAgLy8gdGhpcy5pbml0aWFsaXplZC52YWx1ZSA9IFVpbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyODEKICAgIC8vIGFkbWluOiB0aGlzLmFkbWluLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwMgogICAgLy8gYWRtaW4gPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogJ2FkbScgfSkKICAgIGJ5dGVjIDE3IC8vICJhZG0iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyODEKICAgIC8vIGFkbWluOiB0aGlzLmFkbWluLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjI4MC0yODUKICAgIC8vIGVtaXQ8UHJvdG9jb2xJbml0aWFsaXplZEV2ZW50Pih7CiAgICAvLyAgIGFkbWluOiB0aGlzLmFkbWluLnZhbHVlLAogICAgLy8gICBvcmFjbGVBcHBJZCwKICAgIC8vICAgc3RhYmxlY29pbkFwcElkLAogICAgLy8gICBsaXF1aWRhdGlvbkFwcElkLAogICAgLy8gfSkKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg0MjAxZTE3NiAvLyBtZXRob2QgIlByb3RvY29sSW5pdGlhbGl6ZWRFdmVudChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyNDAtMjUyCiAgICAvLyBwdWJsaWMgaW5pdGlhbGl6ZVByb3RvY29sKAogICAgLy8gICBtaW5Db2xsYXRlcmFsUmF0aW9CcHM6IHVpbnQ2NCwKICAgIC8vICAgbGlxdWlkYXRpb25SYXRpb0JwczogdWludDY0LAogICAgLy8gICBsaXF1aWRhdGlvblBlbmFsdHlCcHM6IHVpbnQ2NCwKICAgIC8vICAgbGlxdWlkYXRpb25Cb251c0JwczogdWludDY0LAogICAgLy8gICBvcmFjbGVGcmVzaG5lc3NXaW5kb3dTZWNvbmRzOiB1aW50NjQsCiAgICAvLyAgIHZhdWx0TWludENhcE1pY3JvU3RhYmxlOiB1aW50NjQsCiAgICAvLyAgIHByb3RvY29sRGVidENlaWxpbmdNaWNyb1N0YWJsZTogdWludDY0LAogICAgLy8gICBtaW5EZWJ0Rmxvb3JNaWNyb1N0YWJsZTogdWludDY0LAogICAgLy8gICBvcmFjbGVBcHBJZDogdWludDY0LAogICAgLy8gICBzdGFibGVjb2luQXBwSWQ6IHVpbnQ2NCwKICAgIC8vICAgbGlxdWlkYXRpb25BcHBJZDogdWludDY0CiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo6Q29sbGF0ZXJhbFhQcm90b2NvbE1hbmFnZXIuY3JlYXRlVmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGVWYXVsdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjI5MwogICAgLy8gdGhpcy5hc3NlcnRSZWFkeSgpCiAgICBjYWxsc3ViIGFzc2VydFJlYWR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyOTQKICAgIC8vIHRoaXMuYXNzZXJ0Tm90UGF1c2VkKFBBVVNFX0NSRUFURV9WQVVMVCkKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGNhbGxzdWIgYXNzZXJ0Tm90UGF1c2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyOTYKICAgIC8vIGNvbnN0IHZhdWx0SWQ6IHVpbnQ2NCA9IHRoaXMubmV4dFZhdWx0SWQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMDQKICAgIC8vIG5leHRWYXVsdElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ252aWQnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgxKSB9KQogICAgYnl0ZWMgMTggLy8gIm52aWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyOTYKICAgIC8vIGNvbnN0IHZhdWx0SWQ6IHVpbnQ2NCA9IHRoaXMubmV4dFZhdWx0SWQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyOTcKICAgIC8vIGFzc2VydCghdGhpcy52YXVsdHModmF1bHRJZCkuZXhpc3RzLCAndmF1bHQgZXhpc3RzJykKICAgIGR1cAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjIyCiAgICAvLyB2YXVsdHMgPSBCb3hNYXA8dWludDY0LCBWYXVsdFJlY29yZD4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMiAvLyAidiIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjI5NwogICAgLy8gYXNzZXJ0KCF0aGlzLnZhdWx0cyh2YXVsdElkKS5leGlzdHMsICd2YXVsdCBleGlzdHMnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyB2YXVsdCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjI5OQogICAgLy8gY29uc3Qgbm93OiB1aW50NjQgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozMDAtMzA5CiAgICAvLyBjb25zdCB2YXVsdDogVmF1bHRSZWNvcmQgPSB7CiAgICAvLyAgIGlkOiB2YXVsdElkLAogICAgLy8gICBvd25lcjogVHhuLnNlbmRlciwKICAgIC8vICAgY29sbGF0ZXJhbE1pY3JvQWxnbzogVWludDY0KDApLAogICAgLy8gICBkZWJ0TWljcm9TdGFibGU6IFVpbnQ2NCgwKSwKICAgIC8vICAgY3JlYXRlZEF0OiBub3csCiAgICAvLyAgIHVwZGF0ZWRBdDogbm93LAogICAgLy8gICBzdGF0dXM6IFZBVUxUX1NUQVRVU19BQ1RJVkUsCiAgICAvLyAgIHZlcnNpb246IFZBVUxUX1NDSEVNQV9WRVJTSU9OLAogICAgLy8gfQogICAgZGlnIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjMwMgogICAgLy8gb3duZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozMDAtMzA5CiAgICAvLyBjb25zdCB2YXVsdDogVmF1bHRSZWNvcmQgPSB7CiAgICAvLyAgIGlkOiB2YXVsdElkLAogICAgLy8gICBvd25lcjogVHhuLnNlbmRlciwKICAgIC8vICAgY29sbGF0ZXJhbE1pY3JvQWxnbzogVWludDY0KDApLAogICAgLy8gICBkZWJ0TWljcm9TdGFibGU6IFVpbnQ2NCgwKSwKICAgIC8vICAgY3JlYXRlZEF0OiBub3csCiAgICAvLyAgIHVwZGF0ZWRBdDogbm93LAogICAgLy8gICBzdGF0dXM6IFZBVUxUX1NUQVRVU19BQ1RJVkUsCiAgICAvLyAgIHZlcnNpb246IFZBVUxUX1NDSEVNQV9WRVJTSU9OLAogICAgLy8gfQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozMDMKICAgIC8vIGNvbGxhdGVyYWxNaWNyb0FsZ286IFVpbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozMDAtMzA5CiAgICAvLyBjb25zdCB2YXVsdDogVmF1bHRSZWNvcmQgPSB7CiAgICAvLyAgIGlkOiB2YXVsdElkLAogICAgLy8gICBvd25lcjogVHhuLnNlbmRlciwKICAgIC8vICAgY29sbGF0ZXJhbE1pY3JvQWxnbzogVWludDY0KDApLAogICAgLy8gICBkZWJ0TWljcm9TdGFibGU6IFVpbnQ2NCgwKSwKICAgIC8vICAgY3JlYXRlZEF0OiBub3csCiAgICAvLyAgIHVwZGF0ZWRBdDogbm93LAogICAgLy8gICBzdGF0dXM6IFZBVUxUX1NUQVRVU19BQ1RJVkUsCiAgICAvLyAgIHZlcnNpb246IFZBVUxUX1NDSEVNQV9WRVJTSU9OLAogICAgLy8gfQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozMDcKICAgIC8vIHN0YXR1czogVkFVTFRfU1RBVFVTX0FDVElWRSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozMDAtMzA5CiAgICAvLyBjb25zdCB2YXVsdDogVmF1bHRSZWNvcmQgPSB7CiAgICAvLyAgIGlkOiB2YXVsdElkLAogICAgLy8gICBvd25lcjogVHhuLnNlbmRlciwKICAgIC8vICAgY29sbGF0ZXJhbE1pY3JvQWxnbzogVWludDY0KDApLAogICAgLy8gICBkZWJ0TWljcm9TdGFibGU6IFVpbnQ2NCgwKSwKICAgIC8vICAgY3JlYXRlZEF0OiBub3csCiAgICAvLyAgIHVwZGF0ZWRBdDogbm93LAogICAgLy8gICBzdGF0dXM6IFZBVUxUX1NUQVRVU19BQ1RJVkUsCiAgICAvLyAgIHZlcnNpb246IFZBVUxUX1NDSEVNQV9WRVJTSU9OLAogICAgLy8gfQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzExCiAgICAvLyB0aGlzLnZhdWx0cyh2YXVsdElkKS52YWx1ZSA9IGNsb25lKHZhdWx0KQogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozMTIKICAgIC8vIHRoaXMub3duZXJWYXVsdHMoeyBvd25lcjogVHhuLnNlbmRlciwgdmF1bHRJZCB9KS52YWx1ZSA9IFVpbnQ2NCgxKQogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjIzCiAgICAvLyBvd25lclZhdWx0cyA9IEJveE1hcDxPd25lclZhdWx0SW5kZXhLZXksIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdvJyB9KQogICAgcHVzaGJ5dGVzICJvIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozMTIKICAgIC8vIHRoaXMub3duZXJWYXVsdHMoeyBvd25lcjogVHhuLnNlbmRlciwgdmF1bHRJZCB9KS52YWx1ZSA9IFVpbnQ2NCgxKQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzEzCiAgICAvLyB0aGlzLm5leHRWYXVsdElkLnZhbHVlID0gdmF1bHRJZCArIFVpbnQ2NCgxKQogICAgdW5jb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA0CiAgICAvLyBuZXh0VmF1bHRJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdudmlkJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMSkgfSkKICAgIGJ5dGVjIDE4IC8vICJudmlkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzEzCiAgICAvLyB0aGlzLm5leHRWYXVsdElkLnZhbHVlID0gdmF1bHRJZCArIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjMxNAogICAgLy8gdGhpcy52YXVsdENvdW50LnZhbHVlID0gdGhpcy52YXVsdENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA1CiAgICAvLyB2YXVsdENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3ZjbnQnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMTkgLy8gInZjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozMTQKICAgIC8vIHRoaXMudmF1bHRDb3VudC52YWx1ZSA9IHRoaXMudmF1bHRDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMDUKICAgIC8vIHZhdWx0Q291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndmNudCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxOSAvLyAidmNudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjMxNAogICAgLy8gdGhpcy52YXVsdENvdW50LnZhbHVlID0gdGhpcy52YXVsdENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzE2CiAgICAvLyBlbWl0PFZhdWx0Q3JlYXRlZEV2ZW50Pih7IHZhdWx0SWQsIG93bmVyOiBUeG4uc2VuZGVyLCBjcmVhdGVkQXQ6IG5vdyB9KQogICAgZGlnIDEKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHhjZjhmMDU3MyAvLyBtZXRob2QgIlZhdWx0Q3JlYXRlZEV2ZW50KHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjkyCiAgICAvLyBwdWJsaWMgY3JlYXRlVmF1bHQoKTogdWludDY0IHsKICAgIGJ5dGVjIDcgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo6Q29sbGF0ZXJhbFhQcm90b2NvbE1hbmFnZXIucmVhZFZhdWx0W3JvdXRpbmddKCkgLT4gdm9pZDoKcmVhZFZhdWx0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzIxLTMyMgogICAgLy8gQHJlYWRvbmx5CiAgICAvLyBwdWJsaWMgcmVhZFZhdWx0KHZhdWx0SWQ6IHVpbnQ2NCk6IFZhdWx0UmVjb3JkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjMyMwogICAgLy8gYXNzZXJ0KHRoaXMudmF1bHRzKHZhdWx0SWQpLmV4aXN0cywgJ3ZhdWx0IG1pc3NpbmcnKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjIyCiAgICAvLyB2YXVsdHMgPSBCb3hNYXA8dWludDY0LCBWYXVsdFJlY29yZD4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMiAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzIzCiAgICAvLyBhc3NlcnQodGhpcy52YXVsdHModmF1bHRJZCkuZXhpc3RzLCAndmF1bHQgbWlzc2luZycpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHZhdWx0IG1pc3NpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjMyNAogICAgLy8gcmV0dXJuIGNsb25lKHRoaXMudmF1bHRzKHZhdWx0SWQpLnZhbHVlKQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozMjEtMzIyCiAgICAvLyBAcmVhZG9ubHkKICAgIC8vIHB1YmxpYyByZWFkVmF1bHQodmF1bHRJZDogdWludDY0KTogVmF1bHRSZWNvcmQgewogICAgYnl0ZWMgNyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjpDb2xsYXRlcmFsWFByb3RvY29sTWFuYWdlci52YXVsdEV4aXN0c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnZhdWx0RXhpc3RzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzI4LTMyOQogICAgLy8gQHJlYWRvbmx5CiAgICAvLyBwdWJsaWMgdmF1bHRFeGlzdHModmF1bHRJZDogdWludDY0KTogYm9vbGVhbiB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozMzAKICAgIC8vIHJldHVybiB0aGlzLnZhdWx0cyh2YXVsdElkKS5leGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIyMgogICAgLy8gdmF1bHRzID0gQm94TWFwPHVpbnQ2NCwgVmF1bHRSZWNvcmQ+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzIgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjMzMAogICAgLy8gcmV0dXJuIHRoaXMudmF1bHRzKHZhdWx0SWQpLmV4aXN0cwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozMjgtMzI5CiAgICAvLyBAcmVhZG9ubHkKICAgIC8vIHB1YmxpYyB2YXVsdEV4aXN0cyh2YXVsdElkOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDcgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo6Q29sbGF0ZXJhbFhQcm90b2NvbE1hbmFnZXIucmVhZE1heE1pbnRhYmxlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVhZE1heE1pbnRhYmxlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzM4LTMzOQogICAgLy8gQHJlYWRvbmx5CiAgICAvLyBwdWJsaWMgcmVhZE1heE1pbnRhYmxlKHZhdWx0SWQ6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNDAKICAgIC8vIHRoaXMuYXNzZXJ0UmVhZHkoKQogICAgY2FsbHN1YiBhc3NlcnRSZWFkeQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzQxCiAgICAvLyBhc3NlcnQodGhpcy52YXVsdHModmF1bHRJZCkuZXhpc3RzLCAndmF1bHQgbWlzc2luZycpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMjIKICAgIC8vIHZhdWx0cyA9IEJveE1hcDx1aW50NjQsIFZhdWx0UmVjb3JkPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18yIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNDEKICAgIC8vIGFzc2VydCh0aGlzLnZhdWx0cyh2YXVsdElkKS5leGlzdHMsICd2YXVsdCBtaXNzaW5nJykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdmF1bHQgbWlzc2luZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzQyCiAgICAvLyBjb25zdCB2YXVsdCA9IGNsb25lKHRoaXMudmF1bHRzKHZhdWx0SWQpLnZhbHVlKQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIGNvbnN0IG9yYWNsZSA9IHRoaXMucmVhZEZyZXNoT3JhY2xlKCkKICAgIGNhbGxzdWIgcmVhZEZyZXNoT3JhY2xlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNDQKICAgIC8vIGNvbnN0IHN0YWJsZWNvaW4gPSB0aGlzLnJlYWRTdGFibGVjb2luU25hcHNob3QoKQogICAgY2FsbHN1YiByZWFkU3RhYmxlY29pblNuYXBzaG90CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNDUKICAgIC8vIHJldHVybiB0aGlzLmNhbGN1bGF0ZUF2YWlsYWJsZVRvTWludCh2YXVsdCwgb3JhY2xlLnByaWNlUGVyQWxnb01pY3JvU3RhYmxlLCBzdGFibGVjb2luKQogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBjYWxsc3ViIGNhbGN1bGF0ZUF2YWlsYWJsZVRvTWludAogICAgcG9wbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozMzgtMzM5CiAgICAvLyBAcmVhZG9ubHkKICAgIC8vIHB1YmxpYyByZWFkTWF4TWludGFibGUodmF1bHRJZDogdWludDY0KTogdWludDY0IHsKICAgIGl0b2IKICAgIGJ5dGVjIDcgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo6Q29sbGF0ZXJhbFhQcm90b2NvbE1hbmFnZXIucmVhZFByb3RvY29sU3RhdHVzW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVhZFByb3RvY29sU3RhdHVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBhZG1pbjogdGhpcy5hZG1pbi52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMDIKICAgIC8vIGFkbWluID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6ICdhZG0nIH0pCiAgICBieXRlYyAxNyAvLyAiYWRtIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBhZG1pbjogdGhpcy5hZG1pbi52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNTMKICAgIC8vIGluaXRpYWxpemVkOiB0aGlzLmluaXRpYWxpemVkLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwMwogICAgLy8gaW5pdGlhbGl6ZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnaW5pdCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA4IC8vICJpbml0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzUzCiAgICAvLyBpbml0aWFsaXplZDogdGhpcy5pbml0aWFsaXplZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNTQKICAgIC8vIG5leHRWYXVsdElkOiB0aGlzLm5leHRWYXVsdElkLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwNAogICAgLy8gbmV4dFZhdWx0SWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnZpZCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDEpIH0pCiAgICBieXRlYyAxOCAvLyAibnZpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gbmV4dFZhdWx0SWQ6IHRoaXMubmV4dFZhdWx0SWQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzU1CiAgICAvLyB2YXVsdENvdW50OiB0aGlzLnZhdWx0Q291bnQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA1CiAgICAvLyB2YXVsdENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3ZjbnQnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMTkgLy8gInZjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNTUKICAgIC8vIHZhdWx0Q291bnQ6IHRoaXMudmF1bHRDb3VudC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNTYKICAgIC8vIHRvdGFsRGVidE1pY3JvU3RhYmxlOiB0aGlzLnRvdGFsRGVidE1pY3JvU3RhYmxlLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gdG90YWxEZWJ0TWljcm9TdGFibGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndGRidCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18wIC8vICJ0ZGJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzU2CiAgICAvLyB0b3RhbERlYnRNaWNyb1N0YWJsZTogdGhpcy50b3RhbERlYnRNaWNyb1N0YWJsZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNTcKICAgIC8vIHRvdGFsQ29sbGF0ZXJhbE1pY3JvQWxnbzogdGhpcy50b3RhbENvbGxhdGVyYWxNaWNyb0FsZ28udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA3CiAgICAvLyB0b3RhbENvbGxhdGVyYWxNaWNyb0FsZ28gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndGNvbCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18zIC8vICJ0Y29sIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzU3CiAgICAvLyB0b3RhbENvbGxhdGVyYWxNaWNyb0FsZ286IHRoaXMudG90YWxDb2xsYXRlcmFsTWljcm9BbGdvLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gcHJvdG9jb2xGZWVDb2xsYXRlcmFsTWljcm9BbGdvOiB0aGlzLnByb3RvY29sRmVlQ29sbGF0ZXJhbE1pY3JvQWxnby52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMDgKICAgIC8vIHByb3RvY29sRmVlQ29sbGF0ZXJhbE1pY3JvQWxnbyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwZmVlJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDIwIC8vICJwZmVlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzU4CiAgICAvLyBwcm90b2NvbEZlZUNvbGxhdGVyYWxNaWNyb0FsZ286IHRoaXMucHJvdG9jb2xGZWVDb2xsYXRlcmFsTWljcm9BbGdvLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjM1OQogICAgLy8gcGF1c2VGbGFnczogdGhpcy5wYXVzZUZsYWdzLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIxNwogICAgLy8gcGF1c2VGbGFncyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwZmxnJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDE1IC8vICJwZmxnIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzU5CiAgICAvLyBwYXVzZUZsYWdzOiB0aGlzLnBhdXNlRmxhZ3MudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzYwCiAgICAvLyBvcmFjbGVBcHBJZDogdGhpcy5vcmFjbGVBcHBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTgKICAgIC8vIG9yYWNsZUFwcElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ29hcHAnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMTYgLy8gIm9hcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNjAKICAgIC8vIG9yYWNsZUFwcElkOiB0aGlzLm9yYWNsZUFwcElkLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjM2MQogICAgLy8gc3RhYmxlY29pbkFwcElkOiB0aGlzLnN0YWJsZWNvaW5BcHBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTkKICAgIC8vIHN0YWJsZWNvaW5BcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzYXBwJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDQgLy8gInNhcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNjEKICAgIC8vIHN0YWJsZWNvaW5BcHBJZDogdGhpcy5zdGFibGVjb2luQXBwSWQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzYyCiAgICAvLyBsaXF1aWRhdGlvbkFwcElkOiB0aGlzLmxpcXVpZGF0aW9uQXBwSWQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjIwCiAgICAvLyBsaXF1aWRhdGlvbkFwcElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2xhcHAnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMjEgLy8gImxhcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNjIKICAgIC8vIGxpcXVpZGF0aW9uQXBwSWQ6IHRoaXMubGlxdWlkYXRpb25BcHBJZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNTEtMzYzCiAgICAvLyByZXR1cm4gewogICAgLy8gICBhZG1pbjogdGhpcy5hZG1pbi52YWx1ZSwKICAgIC8vICAgaW5pdGlhbGl6ZWQ6IHRoaXMuaW5pdGlhbGl6ZWQudmFsdWUsCiAgICAvLyAgIG5leHRWYXVsdElkOiB0aGlzLm5leHRWYXVsdElkLnZhbHVlLAogICAgLy8gICB2YXVsdENvdW50OiB0aGlzLnZhdWx0Q291bnQudmFsdWUsCiAgICAvLyAgIHRvdGFsRGVidE1pY3JvU3RhYmxlOiB0aGlzLnRvdGFsRGVidE1pY3JvU3RhYmxlLnZhbHVlLAogICAgLy8gICB0b3RhbENvbGxhdGVyYWxNaWNyb0FsZ286IHRoaXMudG90YWxDb2xsYXRlcmFsTWljcm9BbGdvLnZhbHVlLAogICAgLy8gICBwcm90b2NvbEZlZUNvbGxhdGVyYWxNaWNyb0FsZ286IHRoaXMucHJvdG9jb2xGZWVDb2xsYXRlcmFsTWljcm9BbGdvLnZhbHVlLAogICAgLy8gICBwYXVzZUZsYWdzOiB0aGlzLnBhdXNlRmxhZ3MudmFsdWUsCiAgICAvLyAgIG9yYWNsZUFwcElkOiB0aGlzLm9yYWNsZUFwcElkLnZhbHVlLAogICAgLy8gICBzdGFibGVjb2luQXBwSWQ6IHRoaXMuc3RhYmxlY29pbkFwcElkLnZhbHVlLAogICAgLy8gICBsaXF1aWRhdGlvbkFwcElkOiB0aGlzLmxpcXVpZGF0aW9uQXBwSWQudmFsdWUsCiAgICAvLyB9CiAgICB1bmNvdmVyIDkKICAgIGl0b2IKICAgIHVuY292ZXIgMTAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjM0OS0zNTAKICAgIC8vIEByZWFkb25seQogICAgLy8gcHVibGljIHJlYWRQcm90b2NvbFN0YXR1cygpOiBQcm90b2NvbFN0YXR1c1NuYXBzaG90IHsKICAgIGJ5dGVjIDcgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo6Q29sbGF0ZXJhbFhQcm90b2NvbE1hbmFnZXIucmVhZFByb3RvY29sUGFyYW1zW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVhZFByb3RvY29sUGFyYW1zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzcwCiAgICAvLyBtaW5Db2xsYXRlcmFsUmF0aW9CcHM6IHRoaXMubWluQ29sbGF0ZXJhbFJhdGlvQnBzLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwOQogICAgLy8gbWluQ29sbGF0ZXJhbFJhdGlvQnBzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ21jcicsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA1IC8vICJtY3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNzAKICAgIC8vIG1pbkNvbGxhdGVyYWxSYXRpb0JwczogdGhpcy5taW5Db2xsYXRlcmFsUmF0aW9CcHMudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzcxCiAgICAvLyBsaXF1aWRhdGlvblJhdGlvQnBzOiB0aGlzLmxpcXVpZGF0aW9uUmF0aW9CcHMudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjEwCiAgICAvLyBsaXF1aWRhdGlvblJhdGlvQnBzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2xxcicsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA5IC8vICJscXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNzEKICAgIC8vIGxpcXVpZGF0aW9uUmF0aW9CcHM6IHRoaXMubGlxdWlkYXRpb25SYXRpb0Jwcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNzIKICAgIC8vIGxpcXVpZGF0aW9uUGVuYWx0eUJwczogdGhpcy5saXF1aWRhdGlvblBlbmFsdHlCcHMudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjExCiAgICAvLyBsaXF1aWRhdGlvblBlbmFsdHlCcHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbHBuJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDEwIC8vICJscG4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNzIKICAgIC8vIGxpcXVpZGF0aW9uUGVuYWx0eUJwczogdGhpcy5saXF1aWRhdGlvblBlbmFsdHlCcHMudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzczCiAgICAvLyBsaXF1aWRhdGlvbkJvbnVzQnBzOiB0aGlzLmxpcXVpZGF0aW9uQm9udXNCcHMudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjEyCiAgICAvLyBsaXF1aWRhdGlvbkJvbnVzQnBzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2xibicsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxMSAvLyAibGJuIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzczCiAgICAvLyBsaXF1aWRhdGlvbkJvbnVzQnBzOiB0aGlzLmxpcXVpZGF0aW9uQm9udXNCcHMudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6Mzc0CiAgICAvLyBvcmFjbGVGcmVzaG5lc3NXaW5kb3dTZWNvbmRzOiB0aGlzLm9yYWNsZUZyZXNobmVzc1dpbmRvd1NlY29uZHMudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjEzCiAgICAvLyBvcmFjbGVGcmVzaG5lc3NXaW5kb3dTZWNvbmRzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ29mdycsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxMiAvLyAib2Z3IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6Mzc0CiAgICAvLyBvcmFjbGVGcmVzaG5lc3NXaW5kb3dTZWNvbmRzOiB0aGlzLm9yYWNsZUZyZXNobmVzc1dpbmRvd1NlY29uZHMudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6Mzc1CiAgICAvLyB2YXVsdE1pbnRDYXBNaWNyb1N0YWJsZTogdGhpcy52YXVsdE1pbnRDYXBNaWNyb1N0YWJsZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIHZhdWx0TWludENhcE1pY3JvU3RhYmxlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3ZtY3AnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMTMgLy8gInZtY3AiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNzUKICAgIC8vIHZhdWx0TWludENhcE1pY3JvU3RhYmxlOiB0aGlzLnZhdWx0TWludENhcE1pY3JvU3RhYmxlLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjM3NgogICAgLy8gcHJvdG9jb2xEZWJ0Q2VpbGluZ01pY3JvU3RhYmxlOiB0aGlzLnByb3RvY29sRGVidENlaWxpbmdNaWNyb1N0YWJsZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTUKICAgIC8vIHByb3RvY29sRGVidENlaWxpbmdNaWNyb1N0YWJsZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwZGMnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMTQgLy8gInBkYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjM3NgogICAgLy8gcHJvdG9jb2xEZWJ0Q2VpbGluZ01pY3JvU3RhYmxlOiB0aGlzLnByb3RvY29sRGVidENlaWxpbmdNaWNyb1N0YWJsZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNzcKICAgIC8vIG1pbkRlYnRGbG9vck1pY3JvU3RhYmxlOiB0aGlzLm1pbkRlYnRGbG9vck1pY3JvU3RhYmxlLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gbWluRGVidEZsb29yTWljcm9TdGFibGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZGZsbycsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA2IC8vICJkZmxvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6Mzc3CiAgICAvLyBtaW5EZWJ0Rmxvb3JNaWNyb1N0YWJsZTogdGhpcy5taW5EZWJ0Rmxvb3JNaWNyb1N0YWJsZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozNjktMzc4CiAgICAvLyByZXR1cm4gewogICAgLy8gICBtaW5Db2xsYXRlcmFsUmF0aW9CcHM6IHRoaXMubWluQ29sbGF0ZXJhbFJhdGlvQnBzLnZhbHVlLAogICAgLy8gICBsaXF1aWRhdGlvblJhdGlvQnBzOiB0aGlzLmxpcXVpZGF0aW9uUmF0aW9CcHMudmFsdWUsCiAgICAvLyAgIGxpcXVpZGF0aW9uUGVuYWx0eUJwczogdGhpcy5saXF1aWRhdGlvblBlbmFsdHlCcHMudmFsdWUsCiAgICAvLyAgIGxpcXVpZGF0aW9uQm9udXNCcHM6IHRoaXMubGlxdWlkYXRpb25Cb251c0Jwcy52YWx1ZSwKICAgIC8vICAgb3JhY2xlRnJlc2huZXNzV2luZG93U2Vjb25kczogdGhpcy5vcmFjbGVGcmVzaG5lc3NXaW5kb3dTZWNvbmRzLnZhbHVlLAogICAgLy8gICB2YXVsdE1pbnRDYXBNaWNyb1N0YWJsZTogdGhpcy52YXVsdE1pbnRDYXBNaWNyb1N0YWJsZS52YWx1ZSwKICAgIC8vICAgcHJvdG9jb2xEZWJ0Q2VpbGluZ01pY3JvU3RhYmxlOiB0aGlzLnByb3RvY29sRGVidENlaWxpbmdNaWNyb1N0YWJsZS52YWx1ZSwKICAgIC8vICAgbWluRGVidEZsb29yTWljcm9TdGFibGU6IHRoaXMubWluRGVidEZsb29yTWljcm9TdGFibGUudmFsdWUsCiAgICAvLyB9CiAgICB1bmNvdmVyIDcKICAgIGl0b2IKICAgIHVuY292ZXIgNwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzY3LTM2OAogICAgLy8gQHJlYWRvbmx5CiAgICAvLyBwdWJsaWMgcmVhZFByb3RvY29sUGFyYW1zKCk6IFByb3RvY29sUGFyYW1zU25hcHNob3QgewogICAgYnl0ZWMgNyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjpDb2xsYXRlcmFsWFByb3RvY29sTWFuYWdlci5hZG1pblNldFBhcmFtc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFkbWluU2V0UGFyYW1zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MzgyLTM5MQogICAgLy8gcHVibGljIGFkbWluU2V0UGFyYW1zKAogICAgLy8gICBtaW5Db2xsYXRlcmFsUmF0aW9CcHM6IHVpbnQ2NCwKICAgIC8vICAgbGlxdWlkYXRpb25SYXRpb0JwczogdWludDY0LAogICAgLy8gICBsaXF1aWRhdGlvblBlbmFsdHlCcHM6IHVpbnQ2NCwKICAgIC8vICAgbGlxdWlkYXRpb25Cb251c0JwczogdWludDY0LAogICAgLy8gICBvcmFjbGVGcmVzaG5lc3NXaW5kb3dTZWNvbmRzOiB1aW50NjQsCiAgICAvLyAgIHZhdWx0TWludENhcE1pY3JvU3RhYmxlOiB1aW50NjQsCiAgICAvLyAgIHByb3RvY29sRGVidENlaWxpbmdNaWNyb1N0YWJsZTogdWludDY0LAogICAgLy8gICBtaW5EZWJ0Rmxvb3JNaWNyb1N0YWJsZTogdWludDY0CiAgICAvLyApOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjM5MgogICAgLy8gdGhpcy5hc3NlcnRSZWFkeSgpCiAgICBjYWxsc3ViIGFzc2VydFJlYWR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozOTMKICAgIC8vIHRoaXMuYXNzZXJ0QWRtaW4oKQogICAgY2FsbHN1YiBhc3NlcnRBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6Mzk0LTQwMwogICAgLy8gdGhpcy52YWxpZGF0ZVBhcmFtcygKICAgIC8vICAgbWluQ29sbGF0ZXJhbFJhdGlvQnBzLAogICAgLy8gICBsaXF1aWRhdGlvblJhdGlvQnBzLAogICAgLy8gICBsaXF1aWRhdGlvblBlbmFsdHlCcHMsCiAgICAvLyAgIGxpcXVpZGF0aW9uQm9udXNCcHMsCiAgICAvLyAgIG9yYWNsZUZyZXNobmVzc1dpbmRvd1NlY29uZHMsCiAgICAvLyAgIHZhdWx0TWludENhcE1pY3JvU3RhYmxlLAogICAgLy8gICBwcm90b2NvbERlYnRDZWlsaW5nTWljcm9TdGFibGUsCiAgICAvLyAgIG1pbkRlYnRGbG9vck1pY3JvU3RhYmxlCiAgICAvLyApCiAgICBkaWcgNwogICAgZGlnIDcKICAgIGRpZyA3CiAgICBkaWcgNwogICAgZGlnIDcKICAgIGRpZyA3CiAgICBkaWcgNwogICAgZGlnIDcKICAgIGNhbGxzdWIgdmFsaWRhdGVQYXJhbXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjQwNAogICAgLy8gYXNzZXJ0KHRoaXMudG90YWxEZWJ0TWljcm9TdGFibGUudmFsdWUgPD0gcHJvdG9jb2xEZWJ0Q2VpbGluZ01pY3JvU3RhYmxlLCAnY2VpbGluZyBiZWxvdyBkZWJ0JykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMDYKICAgIC8vIHRvdGFsRGVidE1pY3JvU3RhYmxlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3RkYnQnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWNfMCAvLyAidGRidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjQwNAogICAgLy8gYXNzZXJ0KHRoaXMudG90YWxEZWJ0TWljcm9TdGFibGUudmFsdWUgPD0gcHJvdG9jb2xEZWJ0Q2VpbGluZ01pY3JvU3RhYmxlLCAnY2VpbGluZyBiZWxvdyBkZWJ0JykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMgogICAgPD0KICAgIGFzc2VydCAvLyBjZWlsaW5nIGJlbG93IGRlYnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwOQogICAgLy8gbWluQ29sbGF0ZXJhbFJhdGlvQnBzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ21jcicsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA1IC8vICJtY3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0MDYKICAgIC8vIHRoaXMubWluQ29sbGF0ZXJhbFJhdGlvQnBzLnZhbHVlID0gbWluQ29sbGF0ZXJhbFJhdGlvQnBzCiAgICBkaWcgOAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIxMAogICAgLy8gbGlxdWlkYXRpb25SYXRpb0JwcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdscXInLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgOSAvLyAibHFyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDA3CiAgICAvLyB0aGlzLmxpcXVpZGF0aW9uUmF0aW9CcHMudmFsdWUgPSBsaXF1aWRhdGlvblJhdGlvQnBzCiAgICBkaWcgNwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIxMQogICAgLy8gbGlxdWlkYXRpb25QZW5hbHR5QnBzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2xwbicsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxMCAvLyAibHBuIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDA4CiAgICAvLyB0aGlzLmxpcXVpZGF0aW9uUGVuYWx0eUJwcy52YWx1ZSA9IGxpcXVpZGF0aW9uUGVuYWx0eUJwcwogICAgdW5jb3ZlciA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjEyCiAgICAvLyBsaXF1aWRhdGlvbkJvbnVzQnBzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2xibicsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxMSAvLyAibGJuIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDA5CiAgICAvLyB0aGlzLmxpcXVpZGF0aW9uQm9udXNCcHMudmFsdWUgPSBsaXF1aWRhdGlvbkJvbnVzQnBzCiAgICB1bmNvdmVyIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTMKICAgIC8vIG9yYWNsZUZyZXNobmVzc1dpbmRvd1NlY29uZHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnb2Z3JywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDEyIC8vICJvZnciCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0MTAKICAgIC8vIHRoaXMub3JhY2xlRnJlc2huZXNzV2luZG93U2Vjb25kcy52YWx1ZSA9IG9yYWNsZUZyZXNobmVzc1dpbmRvd1NlY29uZHMKICAgIHVuY292ZXIgNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIxNAogICAgLy8gdmF1bHRNaW50Q2FwTWljcm9TdGFibGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndm1jcCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxMyAvLyAidm1jcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjQxMQogICAgLy8gdGhpcy52YXVsdE1pbnRDYXBNaWNyb1N0YWJsZS52YWx1ZSA9IHZhdWx0TWludENhcE1pY3JvU3RhYmxlCiAgICB1bmNvdmVyIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTUKICAgIC8vIHByb3RvY29sRGVidENlaWxpbmdNaWNyb1N0YWJsZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwZGMnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMTQgLy8gInBkYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjQxMgogICAgLy8gdGhpcy5wcm90b2NvbERlYnRDZWlsaW5nTWljcm9TdGFibGUudmFsdWUgPSBwcm90b2NvbERlYnRDZWlsaW5nTWljcm9TdGFibGUKICAgIGRpZyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjE2CiAgICAvLyBtaW5EZWJ0Rmxvb3JNaWNyb1N0YWJsZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdkZmxvJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDYgLy8gImRmbG8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0MTMKICAgIC8vIHRoaXMubWluRGVidEZsb29yTWljcm9TdGFibGUudmFsdWUgPSBtaW5EZWJ0Rmxvb3JNaWNyb1N0YWJsZQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjQxNgogICAgLy8gYWRtaW46IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0MTUtNDIwCiAgICAvLyBlbWl0PFByb3RvY29sUGFyYW1zVXBkYXRlZEV2ZW50Pih7CiAgICAvLyAgIGFkbWluOiBUeG4uc2VuZGVyLAogICAgLy8gICBtaW5Db2xsYXRlcmFsUmF0aW9CcHMsCiAgICAvLyAgIGxpcXVpZGF0aW9uUmF0aW9CcHMsCiAgICAvLyAgIHByb3RvY29sRGVidENlaWxpbmdNaWNyb1N0YWJsZSwKICAgIC8vIH0pCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4NGJjZDIyMmMgLy8gbWV0aG9kICJQcm90b2NvbFBhcmFtc1VwZGF0ZWRFdmVudChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czozODItMzkxCiAgICAvLyBwdWJsaWMgYWRtaW5TZXRQYXJhbXMoCiAgICAvLyAgIG1pbkNvbGxhdGVyYWxSYXRpb0JwczogdWludDY0LAogICAgLy8gICBsaXF1aWRhdGlvblJhdGlvQnBzOiB1aW50NjQsCiAgICAvLyAgIGxpcXVpZGF0aW9uUGVuYWx0eUJwczogdWludDY0LAogICAgLy8gICBsaXF1aWRhdGlvbkJvbnVzQnBzOiB1aW50NjQsCiAgICAvLyAgIG9yYWNsZUZyZXNobmVzc1dpbmRvd1NlY29uZHM6IHVpbnQ2NCwKICAgIC8vICAgdmF1bHRNaW50Q2FwTWljcm9TdGFibGU6IHVpbnQ2NCwKICAgIC8vICAgcHJvdG9jb2xEZWJ0Q2VpbGluZ01pY3JvU3RhYmxlOiB1aW50NjQsCiAgICAvLyAgIG1pbkRlYnRGbG9vck1pY3JvU3RhYmxlOiB1aW50NjQKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjpDb2xsYXRlcmFsWFByb3RvY29sTWFuYWdlci5hZG1pblNldEludGVncmF0aW9uc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFkbWluU2V0SW50ZWdyYXRpb25zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDI0LTQyOAogICAgLy8gcHVibGljIGFkbWluU2V0SW50ZWdyYXRpb25zKAogICAgLy8gICBvcmFjbGVBcHBJZDogdWludDY0LAogICAgLy8gICBzdGFibGVjb2luQXBwSWQ6IHVpbnQ2NCwKICAgIC8vICAgbGlxdWlkYXRpb25BcHBJZDogdWludDY0CiAgICAvLyApOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjQyOQogICAgLy8gdGhpcy5hc3NlcnRSZWFkeSgpCiAgICBjYWxsc3ViIGFzc2VydFJlYWR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0MzAKICAgIC8vIHRoaXMuYXNzZXJ0QWRtaW4oKQogICAgY2FsbHN1YiBhc3NlcnRBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjE4CiAgICAvLyBvcmFjbGVBcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdvYXBwJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDE2IC8vICJvYXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDMxCiAgICAvLyB0aGlzLm9yYWNsZUFwcElkLnZhbHVlID0gb3JhY2xlQXBwSWQKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjE5CiAgICAvLyBzdGFibGVjb2luQXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc2FwcCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA0IC8vICJzYXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDMyCiAgICAvLyB0aGlzLnN0YWJsZWNvaW5BcHBJZC52YWx1ZSA9IHN0YWJsZWNvaW5BcHBJZAogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMjAKICAgIC8vIGxpcXVpZGF0aW9uQXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbGFwcCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAyMSAvLyAibGFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjQzMwogICAgLy8gdGhpcy5saXF1aWRhdGlvbkFwcElkLnZhbHVlID0gbGlxdWlkYXRpb25BcHBJZAogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0MzUKICAgIC8vIGFkbWluOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDM0LTQzOQogICAgLy8gZW1pdDxQcm90b2NvbEludGVncmF0aW9uc1VwZGF0ZWRFdmVudD4oewogICAgLy8gICBhZG1pbjogVHhuLnNlbmRlciwKICAgIC8vICAgb3JhY2xlQXBwSWQsCiAgICAvLyAgIHN0YWJsZWNvaW5BcHBJZCwKICAgIC8vICAgbGlxdWlkYXRpb25BcHBJZCwKICAgIC8vIH0pCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4ZjE5YjA2MmQgLy8gbWV0aG9kICJQcm90b2NvbEludGVncmF0aW9uc1VwZGF0ZWRFdmVudChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0MjQtNDI4CiAgICAvLyBwdWJsaWMgYWRtaW5TZXRJbnRlZ3JhdGlvbnMoCiAgICAvLyAgIG9yYWNsZUFwcElkOiB1aW50NjQsCiAgICAvLyAgIHN0YWJsZWNvaW5BcHBJZDogdWludDY0LAogICAgLy8gICBsaXF1aWRhdGlvbkFwcElkOiB1aW50NjQKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjpDb2xsYXRlcmFsWFByb3RvY29sTWFuYWdlci5hZG1pblNldFBhdXNlRmxhZ3Nbcm91dGluZ10oKSAtPiB2b2lkOgphZG1pblNldFBhdXNlRmxhZ3M6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0NDMKICAgIC8vIHB1YmxpYyBhZG1pblNldFBhdXNlRmxhZ3MocGF1c2VGbGFnczogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0NDQKICAgIC8vIHRoaXMuYXNzZXJ0UmVhZHkoKQogICAgY2FsbHN1YiBhc3NlcnRSZWFkeQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDQ1CiAgICAvLyB0aGlzLmFzc2VydEFkbWluKCkKICAgIGNhbGxzdWIgYXNzZXJ0QWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIxNwogICAgLy8gcGF1c2VGbGFncyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwZmxnJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDE1IC8vICJwZmxnIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDQ2CiAgICAvLyB0aGlzLnBhdXNlRmxhZ3MudmFsdWUgPSBwYXVzZUZsYWdzCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjQ0NwogICAgLy8gZW1pdDxQcm90b2NvbFBhdXNlRmxhZ3NVcGRhdGVkRXZlbnQ+KHsgYWRtaW46IFR4bi5zZW5kZXIsIHBhdXNlRmxhZ3MgfSkKICAgIHR4biBTZW5kZXIKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4ZGQ1OWUyNjQgLy8gbWV0aG9kICJQcm90b2NvbFBhdXNlRmxhZ3NVcGRhdGVkRXZlbnQoYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjQ0MwogICAgLy8gcHVibGljIGFkbWluU2V0UGF1c2VGbGFncyhwYXVzZUZsYWdzOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo6Q29sbGF0ZXJhbFhQcm90b2NvbE1hbmFnZXIuYWRtaW5UcmFuc2Zlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFkbWluVHJhbnNmZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0NTEKICAgIC8vIHB1YmxpYyBhZG1pblRyYW5zZmVyKG5ld0FkbWluOiBBY2NvdW50KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0NTIKICAgIC8vIHRoaXMuYXNzZXJ0UmVhZHkoKQogICAgY2FsbHN1YiBhc3NlcnRSZWFkeQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDUzCiAgICAvLyB0aGlzLmFzc2VydEFkbWluKCkKICAgIGNhbGxzdWIgYXNzZXJ0QWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjQ1NAogICAgLy8gYXNzZXJ0KG5ld0FkbWluICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsICdhZG1pbiByZXF1aXJlZCcpCiAgICBkdXAKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBhZG1pbiByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjAyCiAgICAvLyBhZG1pbiA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsga2V5OiAnYWRtJyB9KQogICAgYnl0ZWMgMTcgLy8gImFkbSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjQ1NQogICAgLy8gdGhpcy5hZG1pbi52YWx1ZSA9IG5ld0FkbWluCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjQ1NgogICAgLy8gZW1pdCgnUHJvdG9jb2xBZG1pblRyYW5zZmVycmVkJywgVHhuLnNlbmRlciwgbmV3QWRtaW4pCiAgICB0eG4gU2VuZGVyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDcyYTc5MzhkIC8vIG1ldGhvZCAiUHJvdG9jb2xBZG1pblRyYW5zZmVycmVkKGFkZHJlc3MsYWRkcmVzcykiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDUxCiAgICAvLyBwdWJsaWMgYWRtaW5UcmFuc2ZlcihuZXdBZG1pbjogQWNjb3VudCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjpDb2xsYXRlcmFsWFByb3RvY29sTWFuYWdlci5kZXBvc2l0Q29sbGF0ZXJhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlcG9zaXRDb2xsYXRlcmFsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDY2CiAgICAvLyBwdWJsaWMgZGVwb3NpdENvbGxhdGVyYWwocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCB2YXVsdElkOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDY3CiAgICAvLyB0aGlzLmFzc2VydFJlYWR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0UmVhZHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjc2NwogICAgLy8gYXNzZXJ0KEdsb2JhbC5ncm91cFNpemUgPT09IFVpbnQ2NCgyKSwgJ2RlcG9zaXQgZ3JvdXAgc2l6ZScpCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBkZXBvc2l0IGdyb3VwIHNpemUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjc2OAogICAgLy8gYXNzZXJ0KHBheW1lbnQuZ3JvdXBJbmRleCA9PT0gVWludDY0KDApLCAnZGVwb3NpdCBwYXltZW50IGluZGV4JykKICAgIGRpZyAxCiAgICBndHhucyBHcm91cEluZGV4CiAgICAhCiAgICBhc3NlcnQgLy8gZGVwb3NpdCBwYXltZW50IGluZGV4CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo3NjkKICAgIC8vIGFzc2VydChUeG4uZ3JvdXBJbmRleCA9PT0gVWludDY0KDEpLCAnZGVwb3NpdCBhcHAgY2FsbCBpbmRleCcpCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gZGVwb3NpdCBhcHAgY2FsbCBpbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDY5CiAgICAvLyB0aGlzLmFzc2VydE5vdFBhdXNlZChQQVVTRV9ERVBPU0lUKQogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgYXNzZXJ0Tm90UGF1c2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0NzAKICAgIC8vIGFzc2VydCh0aGlzLnZhdWx0cyh2YXVsdElkKS5leGlzdHMsICd2YXVsdCBtaXNzaW5nJykKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIyMgogICAgLy8gdmF1bHRzID0gQm94TWFwPHVpbnQ2NCwgVmF1bHRSZWNvcmQ+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzIgLy8gInYiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0NzAKICAgIC8vIGFzc2VydCh0aGlzLnZhdWx0cyh2YXVsdElkKS5leGlzdHMsICd2YXVsdCBtaXNzaW5nJykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdmF1bHQgbWlzc2luZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDcxCiAgICAvLyBjb25zdCB2YXVsdCA9IGNsb25lKHRoaXMudmF1bHRzKHZhdWx0SWQpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjQ3MgogICAgLy8gYXNzZXJ0KHZhdWx0LnN0YXR1cyA9PT0gVkFVTFRfU1RBVFVTX0FDVElWRSwgJ3ZhdWx0IGluYWN0aXZlJykKICAgIGR1cAogICAgcHVzaGludCA3MiAvLyA3MgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIHZhdWx0IGluYWN0aXZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0NzMKICAgIC8vIGFzc2VydCh2YXVsdC5vd25lciA9PT0gVHhuLnNlbmRlciwgJ3ZhdWx0IG93bmVyIG9ubHknKQogICAgZHVwCiAgICBleHRyYWN0IDggMzIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gdmF1bHQgb3duZXIgb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDc0CiAgICAvLyBhc3NlcnQocGF5bWVudC5zZW5kZXIgPT09IFR4bi5zZW5kZXIsICdwYXltZW50IHNlbmRlciBtaXNtYXRjaCcpCiAgICBkaWcgMwogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHBheW1lbnQgc2VuZGVyIG1pc21hdGNoCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0NzUKICAgIC8vIGFzc2VydChwYXltZW50LnJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgJ3BheW1lbnQgcmVjZWl2ZXIgbWlzbWF0Y2gnKQogICAgZGlnIDMKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBwYXltZW50IHJlY2VpdmVyIG1pc21hdGNoCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0NzYKICAgIC8vIGFzc2VydChwYXltZW50LnJla2V5VG8gPT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ3BheW1lbnQgcmVrZXkgZm9yYmlkZGVuJykKICAgIGRpZyAzCiAgICBndHhucyBSZWtleVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gcGF5bWVudCByZWtleSBmb3JiaWRkZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjQ3NwogICAgLy8gYXNzZXJ0KHBheW1lbnQuY2xvc2VSZW1haW5kZXJUbyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLCAncGF5bWVudCBjbG9zZSBmb3JiaWRkZW4nKQogICAgZGlnIDMKICAgIGd0eG5zIENsb3NlUmVtYWluZGVyVG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBwYXltZW50IGNsb3NlIGZvcmJpZGRlbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDc4CiAgICAvLyBhc3NlcnQocGF5bWVudC5hbW91bnQgPiBVaW50NjQoMCksICd6ZXJvIGRlcG9zaXQnKQogICAgdW5jb3ZlciAzCiAgICBndHhucyBBbW91bnQKICAgIGR1cAogICAgYXNzZXJ0IC8vIHplcm8gZGVwb3NpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDgwCiAgICAvLyBjb25zdCBuZXdDb2xsYXRlcmFsID0gc2FmZUFkZCh2YXVsdC5jb2xsYXRlcmFsTWljcm9BbGdvLCBwYXltZW50LmFtb3VudCkKICAgIGRpZyAxCiAgICBleHRyYWN0IDQwIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjI5CiAgICAvLyByZXR1cm4gYmlnVG9VaW50NjQoQmlnVWludChsZWZ0KSArIEJpZ1VpbnQocmlnaHQpKQogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGIrCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxNQogICAgLy8gYXNzZXJ0KHZhbHVlIDw9IEJpZ1VpbnQoVWludDY0Lk1BWF9WQUxVRSksICd1aW50NjQgb3ZlcmZsb3cnKQogICAgZHVwCiAgICBieXRlY18xIC8vIDB4ZmZmZmZmZmZmZmZmZmZmZgogICAgYjw9CiAgICBhc3NlcnQgLy8gdWludDY0IG92ZXJmbG93CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxNgogICAgLy8gcmV0dXJuIG9wLmJ0b2koQnl0ZXModmFsdWUpKQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDgxCiAgICAvLyBjb25zdCBuZXdUb3RhbENvbGxhdGVyYWwgPSBzYWZlQWRkKHRoaXMudG90YWxDb2xsYXRlcmFsTWljcm9BbGdvLnZhbHVlLCBwYXltZW50LmFtb3VudCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMDcKICAgIC8vIHRvdGFsQ29sbGF0ZXJhbE1pY3JvQWxnbyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd0Y29sJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjXzMgLy8gInRjb2wiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0ODEKICAgIC8vIGNvbnN0IG5ld1RvdGFsQ29sbGF0ZXJhbCA9IHNhZmVBZGQodGhpcy50b3RhbENvbGxhdGVyYWxNaWNyb0FsZ28udmFsdWUsIHBheW1lbnQuYW1vdW50KQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjI5CiAgICAvLyByZXR1cm4gYmlnVG9VaW50NjQoQmlnVWludChsZWZ0KSArIEJpZ1VpbnQocmlnaHQpKQogICAgaXRvYgogICAgZGlnIDIKICAgIGIrCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxNQogICAgLy8gYXNzZXJ0KHZhbHVlIDw9IEJpZ1VpbnQoVWludDY0Lk1BWF9WQUxVRSksICd1aW50NjQgb3ZlcmZsb3cnKQogICAgZHVwCiAgICBieXRlY18xIC8vIDB4ZmZmZmZmZmZmZmZmZmZmZgogICAgYjw9CiAgICBhc3NlcnQgLy8gdWludDY0IG92ZXJmbG93CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxNgogICAgLy8gcmV0dXJuIG9wLmJ0b2koQnl0ZXModmFsdWUpKQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDgyCiAgICAvLyB2YXVsdC5jb2xsYXRlcmFsTWljcm9BbGdvID0gbmV3Q29sbGF0ZXJhbAogICAgc3dhcAogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBkaWcgMQogICAgcmVwbGFjZTIgNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjQ4MwogICAgLy8gdmF1bHQudXBkYXRlZEF0ID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmVwbGFjZTIgNjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjQ4NAogICAgLy8gdGhpcy52YXVsdHModmF1bHRJZCkudmFsdWUgPSBjbG9uZSh2YXVsdCkKICAgIHVuY292ZXIgNAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA3CiAgICAvLyB0b3RhbENvbGxhdGVyYWxNaWNyb0FsZ28gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndGNvbCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18zIC8vICJ0Y29sIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDg1CiAgICAvLyB0aGlzLnRvdGFsQ29sbGF0ZXJhbE1pY3JvQWxnby52YWx1ZSA9IG5ld1RvdGFsQ29sbGF0ZXJhbAogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0ODkKICAgIC8vIG93bmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NDg3LTQ5MwogICAgLy8gZW1pdDxDb2xsYXRlcmFsRGVwb3NpdGVkRXZlbnQ+KHsKICAgIC8vICAgdmF1bHRJZCwKICAgIC8vICAgb3duZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGFtb3VudE1pY3JvQWxnbzogcGF5bWVudC5hbW91bnQsCiAgICAvLyAgIG5ld0NvbGxhdGVyYWxNaWNyb0FsZ286IG5ld0NvbGxhdGVyYWwsCiAgICAvLyAgIHRvdGFsQ29sbGF0ZXJhbE1pY3JvQWxnbzogbmV3VG90YWxDb2xsYXRlcmFsLAogICAgLy8gfSkKICAgIHVuY292ZXIgNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDBkNTczZDUxIC8vIG1ldGhvZCAiQ29sbGF0ZXJhbERlcG9zaXRlZEV2ZW50KHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo0NjYKICAgIC8vIHB1YmxpYyBkZXBvc2l0Q29sbGF0ZXJhbChwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIHZhdWx0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjpDb2xsYXRlcmFsWFByb3RvY29sTWFuYWdlci5taW50U3RhYmxlY29pbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm1pbnRTdGFibGVjb2luOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTAzCiAgICAvLyBwdWJsaWMgbWludFN0YWJsZWNvaW4odmF1bHRJZDogdWludDY0LCBhbW91bnRNaWNyb1N0YWJsZTogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBkdXAKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjUwNAogICAgLy8gdGhpcy5hc3NlcnRSZWFkeSgpCiAgICBjYWxsc3ViIGFzc2VydFJlYWR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo3NzMKICAgIC8vIGFzc2VydChHbG9iYWwuZ3JvdXBTaXplID09PSBVaW50NjQoMSksICdtaW50IGdyb3VwIHNpemUnKQogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gbWludCBncm91cCBzaXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo3NzQKICAgIC8vIGFzc2VydChUeG4uZ3JvdXBJbmRleCA9PT0gVWludDY0KDApLCAnbWludCBhcHAgY2FsbCBpbmRleCcpCiAgICB0eG4gR3JvdXBJbmRleAogICAgIQogICAgYXNzZXJ0IC8vIG1pbnQgYXBwIGNhbGwgaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjUwNgogICAgLy8gdGhpcy5hc3NlcnROb3RQYXVzZWQoUEFVU0VfTUlOVCkKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBjYWxsc3ViIGFzc2VydE5vdFBhdXNlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTA3CiAgICAvLyBhc3NlcnQodGhpcy52YXVsdHModmF1bHRJZCkuZXhpc3RzLCAndmF1bHQgbWlzc2luZycpCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIyMgogICAgLy8gdmF1bHRzID0gQm94TWFwPHVpbnQ2NCwgVmF1bHRSZWNvcmQ+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzIgLy8gInYiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1MDcKICAgIC8vIGFzc2VydCh0aGlzLnZhdWx0cyh2YXVsdElkKS5leGlzdHMsICd2YXVsdCBtaXNzaW5nJykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdmF1bHQgbWlzc2luZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTA4CiAgICAvLyBhc3NlcnQoYW1vdW50TWljcm9TdGFibGUgPiBVaW50NjQoMCksICd6ZXJvIG1pbnQnKQogICAgZGlnIDIKICAgIGFzc2VydCAvLyB6ZXJvIG1pbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjUwOQogICAgLy8gY29uc3QgdmF1bHQgPSBjbG9uZSh0aGlzLnZhdWx0cyh2YXVsdElkKS52YWx1ZSkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1MTAKICAgIC8vIGFzc2VydCh2YXVsdC5zdGF0dXMgPT09IFZBVUxUX1NUQVRVU19BQ1RJVkUsICd2YXVsdCBpbmFjdGl2ZScpCiAgICBkdXAKICAgIHB1c2hpbnQgNzIgLy8gNzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyB2YXVsdCBpbmFjdGl2ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTExCiAgICAvLyBhc3NlcnQodmF1bHQub3duZXIgPT09IFR4bi5zZW5kZXIsICd2YXVsdCBvd25lciBvbmx5JykKICAgIGR1cAogICAgZXh0cmFjdCA4IDMyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHZhdWx0IG93bmVyIG9ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjUxMwogICAgLy8gY29uc3Qgb3JhY2xlID0gdGhpcy5yZWFkRnJlc2hPcmFjbGUoKQogICAgY2FsbHN1YiByZWFkRnJlc2hPcmFjbGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjUxNAogICAgLy8gY29uc3Qgc3RhYmxlY29pbiA9IHRoaXMucmVhZFN0YWJsZWNvaW5TbmFwc2hvdCgpCiAgICBjYWxsc3ViIHJlYWRTdGFibGVjb2luU25hcHNob3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjUxNQogICAgLy8gY29uc3QgYXZhaWxhYmxlVG9NaW50ID0gdGhpcy5jYWxjdWxhdGVBdmFpbGFibGVUb01pbnQodmF1bHQsIG9yYWNsZS5wcmljZVBlckFsZ29NaWNyb1N0YWJsZSwgc3RhYmxlY29pbikKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGNhbGN1bGF0ZUF2YWlsYWJsZVRvTWludAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTE2CiAgICAvLyBhc3NlcnQoYW1vdW50TWljcm9TdGFibGUgPD0gYXZhaWxhYmxlVG9NaW50LCAnbWludCBleGNlZWRzIHNhZmUgYW1vdW50JykKICAgIGRpZyA2CiAgICB1bmNvdmVyIDMKICAgIDw9CiAgICBhc3NlcnQgLy8gbWludCBleGNlZWRzIHNhZmUgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1MTgKICAgIC8vIGNvbnN0IG5ld1ZhdWx0RGVidCA9IHNhZmVBZGQodmF1bHQuZGVidE1pY3JvU3RhYmxlLCBhbW91bnRNaWNyb1N0YWJsZSkKICAgIGRpZyAxCiAgICBleHRyYWN0IDQ4IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjI5CiAgICAvLyByZXR1cm4gYmlnVG9VaW50NjQoQmlnVWludChsZWZ0KSArIEJpZ1VpbnQocmlnaHQpKQogICAgdW5jb3ZlciA2CiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgYisKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjE1CiAgICAvLyBhc3NlcnQodmFsdWUgPD0gQmlnVWludChVaW50NjQuTUFYX1ZBTFVFKSwgJ3VpbnQ2NCBvdmVyZmxvdycpCiAgICBkdXAKICAgIGJ5dGVjXzEgLy8gMHhmZmZmZmZmZmZmZmZmZmZmCiAgICBiPD0KICAgIGFzc2VydCAvLyB1aW50NjQgb3ZlcmZsb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjE2CiAgICAvLyByZXR1cm4gb3AuYnRvaShCeXRlcyh2YWx1ZSkpCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1MTkKICAgIC8vIGNvbnN0IG5ld1RvdGFsRGVidCA9IHNhZmVBZGQodGhpcy50b3RhbERlYnRNaWNyb1N0YWJsZS52YWx1ZSwgYW1vdW50TWljcm9TdGFibGUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA2CiAgICAvLyB0b3RhbERlYnRNaWNyb1N0YWJsZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd0ZGJ0JywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjXzAgLy8gInRkYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1MTkKICAgIC8vIGNvbnN0IG5ld1RvdGFsRGVidCA9IHNhZmVBZGQodGhpcy50b3RhbERlYnRNaWNyb1N0YWJsZS52YWx1ZSwgYW1vdW50TWljcm9TdGFibGUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MjkKICAgIC8vIHJldHVybiBiaWdUb1VpbnQ2NChCaWdVaW50KGxlZnQpICsgQmlnVWludChyaWdodCkpCiAgICBpdG9iCiAgICBkaWcgMgogICAgYisKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjE1CiAgICAvLyBhc3NlcnQodmFsdWUgPD0gQmlnVWludChVaW50NjQuTUFYX1ZBTFVFKSwgJ3VpbnQ2NCBvdmVyZmxvdycpCiAgICBkdXAKICAgIGJ5dGVjXzEgLy8gMHhmZmZmZmZmZmZmZmZmZmZmCiAgICBiPD0KICAgIGFzc2VydCAvLyB1aW50NjQgb3ZlcmZsb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjE2CiAgICAvLyByZXR1cm4gb3AuYnRvaShCeXRlcyh2YWx1ZSkpCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1MjAKICAgIC8vIGFzc2VydChuZXdWYXVsdERlYnQgPj0gdGhpcy5taW5EZWJ0Rmxvb3JNaWNyb1N0YWJsZS52YWx1ZSwgJ2RlYnQgYmVsb3cgZmxvb3InKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gbWluRGVidEZsb29yTWljcm9TdGFibGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZGZsbycsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA2IC8vICJkZmxvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTIwCiAgICAvLyBhc3NlcnQobmV3VmF1bHREZWJ0ID49IHRoaXMubWluRGVidEZsb29yTWljcm9TdGFibGUudmFsdWUsICdkZWJ0IGJlbG93IGZsb29yJykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMgogICAgPD0KICAgIGFzc2VydCAvLyBkZWJ0IGJlbG93IGZsb29yCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1MjEKICAgIC8vIGFzc2VydChpc0hlYWx0aHlEZWJ0KHZhdWx0LmNvbGxhdGVyYWxNaWNyb0FsZ28sIG5ld1ZhdWx0RGVidCwgb3JhY2xlLnByaWNlUGVyQWxnb01pY3JvU3RhYmxlLCB0aGlzLm1pbkNvbGxhdGVyYWxSYXRpb0Jwcy52YWx1ZSksICd2YXVsdCB1bmhlYWx0aHknKQogICAgZGlnIDQKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA5CiAgICAvLyBtaW5Db2xsYXRlcmFsUmF0aW9CcHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbWNyJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDUgLy8gIm1jciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjUyMQogICAgLy8gYXNzZXJ0KGlzSGVhbHRoeURlYnQodmF1bHQuY29sbGF0ZXJhbE1pY3JvQWxnbywgbmV3VmF1bHREZWJ0LCBvcmFjbGUucHJpY2VQZXJBbGdvTWljcm9TdGFibGUsIHRoaXMubWluQ29sbGF0ZXJhbFJhdGlvQnBzLnZhbHVlKSwgJ3ZhdWx0IHVuaGVhbHRoeScpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgc3dhcAogICAgZGlnIDMKICAgIHVuY292ZXIgOAogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGlzSGVhbHRoeURlYnQKICAgIGFzc2VydCAvLyB2YXVsdCB1bmhlYWx0aHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjUyMwogICAgLy8gdGhpcy5jYWxsU3RhYmxlY29pbk1pbnQodmF1bHQsIGFtb3VudE1pY3JvU3RhYmxlLCBzdGFibGVjb2luLnN0YWJsZUFzc2V0SWQpCiAgICB1bmNvdmVyIDMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODc4CiAgICAvLyBjb25zdCBzdGFibGVjb2luQXBwID0gQXBwbGljYXRpb24odGhpcy5zdGFibGVjb2luQXBwSWQudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjE5CiAgICAvLyBzdGFibGVjb2luQXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc2FwcCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA0IC8vICJzYXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODc4CiAgICAvLyBjb25zdCBzdGFibGVjb2luQXBwID0gQXBwbGljYXRpb24odGhpcy5zdGFibGVjb2luQXBwSWQudmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODgwLTg5MwogICAgLy8gaXR4bgogICAgLy8gICAuYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICBhcHBJZDogc3RhYmxlY29pbkFwcCwKICAgIC8vICAgICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vICAgICBhcHBBcmdzOiBbCiAgICAvLyAgICAgICBtZXRob2RTZWxlY3RvcignbWludEZvclZhdWx0KHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCl2b2lkJyksCiAgICAvLyAgICAgICBuZXcgQXJjNFVpbnQ8NjQ+KHZhdWx0LmlkKS5ieXRlcywKICAgIC8vICAgICAgIG5ldyBBcmM0QWRkcmVzcyh2YXVsdC5vd25lcikuYnl0ZXMsCiAgICAvLyAgICAgICBuZXcgQXJjNFVpbnQ8NjQ+KGFtb3VudE1pY3JvU3RhYmxlKS5ieXRlcywKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFjY291bnRzOiBbdmF1bHQub3duZXIsIHN0YWJsZWNvaW5BcHAuYWRkcmVzc10sCiAgICAvLyAgICAgYXNzZXRzOiBbc3RhYmxlQXNzZXRdLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg4NgogICAgLy8gbmV3IEFyYzRVaW50PDY0Pih2YXVsdC5pZCkuYnl0ZXMsCiAgICBkaWcgNQogICAgZXh0cmFjdCAwIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg4NwogICAgLy8gbmV3IEFyYzRBZGRyZXNzKHZhdWx0Lm93bmVyKS5ieXRlcywKICAgIGRpZyA2CiAgICBleHRyYWN0IDggMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg5MAogICAgLy8gYWNjb3VudHM6IFt2YXVsdC5vd25lciwgc3RhYmxlY29pbkFwcC5hZGRyZXNzXSwKICAgIGRpZyAyCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICB1bmNvdmVyIDQKICAgIGl0eG5fZmllbGQgQXNzZXRzCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBBY2NvdW50cwogICAgaXR4bl9maWVsZCBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODg1CiAgICAvLyBtZXRob2RTZWxlY3RvcignbWludEZvclZhdWx0KHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCl2b2lkJyksCiAgICBwdXNoYnl0ZXMgMHgxMGY3NjQ3NiAvLyBtZXRob2QgIm1pbnRGb3JWYXVsdCh1aW50NjQsYWRkcmVzcyx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHVuY292ZXIgNwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODgwLTg5MgogICAgLy8gaXR4bgogICAgLy8gICAuYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICBhcHBJZDogc3RhYmxlY29pbkFwcCwKICAgIC8vICAgICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vICAgICBhcHBBcmdzOiBbCiAgICAvLyAgICAgICBtZXRob2RTZWxlY3RvcignbWludEZvclZhdWx0KHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCl2b2lkJyksCiAgICAvLyAgICAgICBuZXcgQXJjNFVpbnQ8NjQ+KHZhdWx0LmlkKS5ieXRlcywKICAgIC8vICAgICAgIG5ldyBBcmM0QWRkcmVzcyh2YXVsdC5vd25lcikuYnl0ZXMsCiAgICAvLyAgICAgICBuZXcgQXJjNFVpbnQ8NjQ+KGFtb3VudE1pY3JvU3RhYmxlKS5ieXRlcywKICAgIC8vICAgICBdLAogICAgLy8gICAgIGFjY291bnRzOiBbdmF1bHQub3duZXIsIHN0YWJsZWNvaW5BcHAuYWRkcmVzc10sCiAgICAvLyAgICAgYXNzZXRzOiBbc3RhYmxlQXNzZXRdLAogICAgLy8gICB9KQogICAgcHVzaGludCA2IC8vIDYKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg4MwogICAgLy8gZmVlOiBVaW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg4MC04OTMKICAgIC8vIGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwSWQ6IHN0YWJsZWNvaW5BcHAsCiAgICAvLyAgICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyAgICAgYXBwQXJnczogWwogICAgLy8gICAgICAgbWV0aG9kU2VsZWN0b3IoJ21pbnRGb3JWYXVsdCh1aW50NjQsYWRkcmVzcyx1aW50NjQpdm9pZCcpLAogICAgLy8gICAgICAgbmV3IEFyYzRVaW50PDY0Pih2YXVsdC5pZCkuYnl0ZXMsCiAgICAvLyAgICAgICBuZXcgQXJjNEFkZHJlc3ModmF1bHQub3duZXIpLmJ5dGVzLAogICAgLy8gICAgICAgbmV3IEFyYzRVaW50PDY0PihhbW91bnRNaWNyb1N0YWJsZSkuYnl0ZXMsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBhY2NvdW50czogW3ZhdWx0Lm93bmVyLCBzdGFibGVjb2luQXBwLmFkZHJlc3NdLAogICAgLy8gICAgIGFzc2V0czogW3N0YWJsZUFzc2V0XSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTI1CiAgICAvLyB2YXVsdC5kZWJ0TWljcm9TdGFibGUgPSBuZXdWYXVsdERlYnQKICAgIHN3YXAKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgZGlnIDEKICAgIHJlcGxhY2UyIDQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1MjYKICAgIC8vIHZhdWx0LnVwZGF0ZWRBdCA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1MjcKICAgIC8vIHRoaXMudmF1bHRzKHZhdWx0SWQpLnZhbHVlID0gY2xvbmUodmF1bHQpCiAgICB1bmNvdmVyIDQKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gdG90YWxEZWJ0TWljcm9TdGFibGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndGRidCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18wIC8vICJ0ZGJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTI4CiAgICAvLyB0aGlzLnRvdGFsRGVidE1pY3JvU3RhYmxlLnZhbHVlID0gbmV3VG90YWxEZWJ0CiAgICBkaWcgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjUzMgogICAgLy8gb3duZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1MzAtNTM2CiAgICAvLyBlbWl0PFN0YWJsZWNvaW5NaW50ZWRFdmVudD4oewogICAgLy8gICB2YXVsdElkLAogICAgLy8gICBvd25lcjogVHhuLnNlbmRlciwKICAgIC8vICAgYW1vdW50TWljcm9TdGFibGUsCiAgICAvLyAgIG5ld0RlYnRNaWNyb1N0YWJsZTogbmV3VmF1bHREZWJ0LAogICAgLy8gICB0b3RhbERlYnRNaWNyb1N0YWJsZTogbmV3VG90YWxEZWJ0LAogICAgLy8gfSkKICAgIHVuY292ZXIgNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGI2YjAwOGEwIC8vIG1ldGhvZCAiU3RhYmxlY29pbk1pbnRlZEV2ZW50KHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1MDMKICAgIC8vIHB1YmxpYyBtaW50U3RhYmxlY29pbih2YXVsdElkOiB1aW50NjQsIGFtb3VudE1pY3JvU3RhYmxlOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo6Q29sbGF0ZXJhbFhQcm90b2NvbE1hbmFnZXIucmVwYXlbcm91dGluZ10oKSAtPiB2b2lkOgpyZXBheToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjU0NgogICAgLy8gcHVibGljIHJlcGF5KHJlcGF5bWVudDogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLCB2YXVsdElkOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTQ3CiAgICAvLyB0aGlzLmFzc2VydFJlYWR5KCkKICAgIGNhbGxzdWIgYXNzZXJ0UmVhZHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjc4OAogICAgLy8gYXNzZXJ0KEdsb2JhbC5ncm91cFNpemUgPT09IFVpbnQ2NCgyKSwgJ3JlcGF5IGdyb3VwIHNpemUnKQogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgcHVzaGludCAyIC8vIDIKICAgID09CiAgICBhc3NlcnQgLy8gcmVwYXkgZ3JvdXAgc2l6ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6Nzg5CiAgICAvLyBhc3NlcnQocmVwYXltZW50Lmdyb3VwSW5kZXggPT09IFVpbnQ2NCgwKSwgJ3JlcGF5IHRyYW5zZmVyIGluZGV4JykKICAgIGRpZyAxCiAgICBndHhucyBHcm91cEluZGV4CiAgICAhCiAgICBhc3NlcnQgLy8gcmVwYXkgdHJhbnNmZXIgaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjc5MAogICAgLy8gYXNzZXJ0KFR4bi5ncm91cEluZGV4ID09PSBVaW50NjQoMSksICdyZXBheSBhcHAgY2FsbCBpbmRleCcpCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gcmVwYXkgYXBwIGNhbGwgaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjU0OQogICAgLy8gdGhpcy5hc3NlcnROb3RQYXVzZWQoUEFVU0VfUkVQQVkpCiAgICBwdXNoaW50IDQgLy8gNAogICAgY2FsbHN1YiBhc3NlcnROb3RQYXVzZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjU1MAogICAgLy8gYXNzZXJ0KHRoaXMudmF1bHRzKHZhdWx0SWQpLmV4aXN0cywgJ3ZhdWx0IG1pc3NpbmcnKQogICAgaXRvYgogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMjIKICAgIC8vIHZhdWx0cyA9IEJveE1hcDx1aW50NjQsIFZhdWx0UmVjb3JkPih7IGtleVByZWZpeDogJ3YnIH0pCiAgICBieXRlY18yIC8vICJ2IgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjU1MAogICAgLy8gYXNzZXJ0KHRoaXMudmF1bHRzKHZhdWx0SWQpLmV4aXN0cywgJ3ZhdWx0IG1pc3NpbmcnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB2YXVsdCBtaXNzaW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1NTEKICAgIC8vIGNvbnN0IHN0YWJsZWNvaW4gPSB0aGlzLnJlYWRTdGFibGVjb2luU25hcHNob3QoKQogICAgY2FsbHN1YiByZWFkU3RhYmxlY29pblNuYXBzaG90CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4MDAKICAgIC8vIGNvbnN0IHN0YWJsZWNvaW5BcHAgPSBBcHBsaWNhdGlvbih0aGlzLnN0YWJsZWNvaW5BcHBJZC52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTkKICAgIC8vIHN0YWJsZWNvaW5BcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzYXBwJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDQgLy8gInNhcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4MDAKICAgIC8vIGNvbnN0IHN0YWJsZWNvaW5BcHAgPSBBcHBsaWNhdGlvbih0aGlzLnN0YWJsZWNvaW5BcHBJZC52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4MDEKICAgIC8vIGNvbnN0IHN0YWJsZUFzc2V0ID0gQXNzZXQoc3RhYmxlY29pbi5zdGFibGVBc3NldElkKQogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4MDIKICAgIC8vIGFzc2VydChyZXBheW1lbnQuc2VuZGVyID09PSBUeG4uc2VuZGVyLCAncmVwYXkgc2VuZGVyIG1pc21hdGNoJykKICAgIGRpZyAzCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gcmVwYXkgc2VuZGVyIG1pc21hdGNoCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4MDMKICAgIC8vIGFzc2VydChyZXBheW1lbnQuYXNzZXRSZWNlaXZlciA9PT0gc3RhYmxlY29pbkFwcC5hZGRyZXNzLCAncmVwYXkgcmVjZWl2ZXIgbWlzbWF0Y2gnKQogICAgZGlnIDMKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIHVuY292ZXIgMgogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyByZXBheSByZWNlaXZlciBtaXNtYXRjaAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODA0CiAgICAvLyBhc3NlcnQocmVwYXltZW50LnhmZXJBc3NldCA9PT0gc3RhYmxlQXNzZXQsICdyZXBheSBhc3NldCBtaXNtYXRjaCcpCiAgICBkaWcgMgogICAgZ3R4bnMgWGZlckFzc2V0CiAgICA9PQogICAgYXNzZXJ0IC8vIHJlcGF5IGFzc2V0IG1pc21hdGNoCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4MDUKICAgIC8vIGFzc2VydChyZXBheW1lbnQucmVrZXlUbyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLCAncmVwYXkgcmVrZXkgZm9yYmlkZGVuJykKICAgIGRpZyAxCiAgICBndHhucyBSZWtleVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gcmVwYXkgcmVrZXkgZm9yYmlkZGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4MDYKICAgIC8vIGFzc2VydChyZXBheW1lbnQuYXNzZXRDbG9zZVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsICdyZXBheSBjbG9zZSBmb3JiaWRkZW4nKQogICAgZGlnIDEKICAgIGd0eG5zIEFzc2V0Q2xvc2VUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHJlcGF5IGNsb3NlIGZvcmJpZGRlbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODA3CiAgICAvLyBhc3NlcnQocmVwYXltZW50LmFzc2V0QW1vdW50ID4gVWludDY0KDApLCAnemVybyByZXBheScpCiAgICBzd2FwCiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGFzc2VydCAvLyB6ZXJvIHJlcGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1NTQKICAgIC8vIGNvbnN0IHZhdWx0ID0gY2xvbmUodGhpcy52YXVsdHModmF1bHRJZCkudmFsdWUpCiAgICBzd2FwCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1NTUKICAgIC8vIGFzc2VydCh2YXVsdC5zdGF0dXMgPT09IFZBVUxUX1NUQVRVU19BQ1RJVkUsICd2YXVsdCBpbmFjdGl2ZScpCiAgICBkdXAKICAgIHB1c2hpbnQgNzIgLy8gNzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyB2YXVsdCBpbmFjdGl2ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTU2CiAgICAvLyBhc3NlcnQodmF1bHQub3duZXIgPT09IFR4bi5zZW5kZXIsICd2YXVsdCBvd25lciBvbmx5JykKICAgIGR1cAogICAgZXh0cmFjdCA4IDMyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHZhdWx0IG93bmVyIG9ubHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjU1NwogICAgLy8gYXNzZXJ0KHJlcGF5bWVudC5hc3NldEFtb3VudCA8PSB2YXVsdC5kZWJ0TWljcm9TdGFibGUsICdyZXBheSBleGNlZWRzIGRlYnQnKQogICAgcHVzaGludCA0OCAvLyA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cDIKICAgIDw9CiAgICBhc3NlcnQgLy8gcmVwYXkgZXhjZWVkcyBkZWJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czozMwogICAgLy8gYXNzZXJ0KGxlZnQgPj0gcmlnaHQsICd1aW50NjQgdW5kZXJmbG93JykKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gdWludDY0IHVuZGVyZmxvdwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MzQKICAgIC8vIHJldHVybiBsZWZ0IC0gcmlnaHQKICAgIHN3YXAKICAgIC0KICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTYwCiAgICAvLyBhc3NlcnQoIWlzRHVzdERlYnQobmV3VmF1bHREZWJ0LCB0aGlzLm1pbkRlYnRGbG9vck1pY3JvU3RhYmxlLnZhbHVlKSwgJ2RlYnQgYmVsb3cgZmxvb3InKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gbWluRGVidEZsb29yTWljcm9TdGFibGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZGZsbycsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA2IC8vICJkZmxvIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTYwCiAgICAvLyBhc3NlcnQoIWlzRHVzdERlYnQobmV3VmF1bHREZWJ0LCB0aGlzLm1pbkRlYnRGbG9vck1pY3JvU3RhYmxlLnZhbHVlKSwgJ2RlYnQgYmVsb3cgZmxvb3InKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjM4CiAgICAvLyByZXR1cm4gZGVidE1pY3JvU3RhYmxlID4gVWludDY0KDApICYmIGRlYnRNaWNyb1N0YWJsZSA8IG1pbkRlYnRGbG9vck1pY3JvU3RhYmxlCiAgICBieiByZXBheV9ib29sX2ZhbHNlQDgKICAgIGR1cDIKICAgIDwKICAgIGJ6IHJlcGF5X2Jvb2xfZmFsc2VAOAogICAgaW50Y18xIC8vIDEKCnJlcGF5X2Jvb2xfbWVyZ2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjU2MAogICAgLy8gYXNzZXJ0KCFpc0R1c3REZWJ0KG5ld1ZhdWx0RGVidCwgdGhpcy5taW5EZWJ0Rmxvb3JNaWNyb1N0YWJsZS52YWx1ZSksICdkZWJ0IGJlbG93IGZsb29yJykKICAgICEKICAgIGFzc2VydCAvLyBkZWJ0IGJlbG93IGZsb29yCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1NjEKICAgIC8vIGNvbnN0IG5ld1RvdGFsRGVidCA9IHNhZmVTdWIodGhpcy50b3RhbERlYnRNaWNyb1N0YWJsZS52YWx1ZSwgcmVwYXltZW50LmFzc2V0QW1vdW50KQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwNgogICAgLy8gdG90YWxEZWJ0TWljcm9TdGFibGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndGRidCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18wIC8vICJ0ZGJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTYxCiAgICAvLyBjb25zdCBuZXdUb3RhbERlYnQgPSBzYWZlU3ViKHRoaXMudG90YWxEZWJ0TWljcm9TdGFibGUudmFsdWUsIHJlcGF5bWVudC5hc3NldEFtb3VudCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czozMwogICAgLy8gYXNzZXJ0KGxlZnQgPj0gcmlnaHQsICd1aW50NjQgdW5kZXJmbG93JykKICAgIGR1cAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMwogICAgPj0KICAgIGFzc2VydCAvLyB1aW50NjQgdW5kZXJmbG93CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czozNAogICAgLy8gcmV0dXJuIGxlZnQgLSByaWdodAogICAgZGlnIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjU2MwogICAgLy8gdGhpcy5jYWxsU3RhYmxlY29pbkJ1cm4odmF1bHRJZCwgcmVwYXltZW50LmFzc2V0QW1vdW50KQogICAgZGlnIDgKICAgIGRpZyAyCiAgICBjYWxsc3ViIGNhbGxTdGFibGVjb2luQnVybgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTY1CiAgICAvLyB2YXVsdC5kZWJ0TWljcm9TdGFibGUgPSBuZXdWYXVsdERlYnQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkaWcgNQogICAgZGlnIDEKICAgIHJlcGxhY2UyIDQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1NjYKICAgIC8vIHZhdWx0LnVwZGF0ZWRBdCA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1NjcKICAgIC8vIHRoaXMudmF1bHRzKHZhdWx0SWQpLnZhbHVlID0gY2xvbmUodmF1bHQpCiAgICBkaWcgOAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA2CiAgICAvLyB0b3RhbERlYnRNaWNyb1N0YWJsZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd0ZGJ0JywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjXzAgLy8gInRkYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1NjgKICAgIC8vIHRoaXMudG90YWxEZWJ0TWljcm9TdGFibGUudmFsdWUgPSBuZXdUb3RhbERlYnQKICAgIGRpZyAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTcwLTU3NgogICAgLy8gZW1pdDxTdGFibGVjb2luUmVwYWlkRXZlbnQ+KHsKICAgIC8vICAgdmF1bHRJZCwKICAgIC8vICAgb3duZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGFtb3VudE1pY3JvU3RhYmxlOiByZXBheW1lbnQuYXNzZXRBbW91bnQsCiAgICAvLyAgIG5ld0RlYnRNaWNyb1N0YWJsZTogbmV3VmF1bHREZWJ0LAogICAgLy8gICB0b3RhbERlYnRNaWNyb1N0YWJsZTogbmV3VG90YWxEZWJ0LAogICAgLy8gfSkKICAgIGRpZyA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1NzIKICAgIC8vIG93bmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTcwLTU3NgogICAgLy8gZW1pdDxTdGFibGVjb2luUmVwYWlkRXZlbnQ+KHsKICAgIC8vICAgdmF1bHRJZCwKICAgIC8vICAgb3duZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGFtb3VudE1pY3JvU3RhYmxlOiByZXBheW1lbnQuYXNzZXRBbW91bnQsCiAgICAvLyAgIG5ld0RlYnRNaWNyb1N0YWJsZTogbmV3VmF1bHREZWJ0LAogICAgLy8gICB0b3RhbERlYnRNaWNyb1N0YWJsZTogbmV3VG90YWxEZWJ0LAogICAgLy8gfSkKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgzZTdhYzBlNSAvLyBtZXRob2QgIlN0YWJsZWNvaW5SZXBhaWRFdmVudCh1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTQ2CiAgICAvLyBwdWJsaWMgcmVwYXkocmVwYXltZW50OiBndHhuLkFzc2V0VHJhbnNmZXJUeG4sIHZhdWx0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcmVwYXlfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgcmVwYXlfYm9vbF9tZXJnZUA5CgoKLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6OkNvbGxhdGVyYWxYUHJvdG9jb2xNYW5hZ2VyLndpdGhkcmF3Q29sbGF0ZXJhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhkcmF3Q29sbGF0ZXJhbDoKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1ODMKICAgIC8vIHB1YmxpYyB3aXRoZHJhd0NvbGxhdGVyYWwodmF1bHRJZDogdWludDY0LCBhbW91bnRNaWNyb0FsZ286IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1ODQKICAgIC8vIHRoaXMuYXNzZXJ0UmVhZHkoKQogICAgY2FsbHN1YiBhc3NlcnRSZWFkeQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6Nzc4CiAgICAvLyBhc3NlcnQoR2xvYmFsLmdyb3VwU2l6ZSA9PT0gVWludDY0KDEpLCAnd2l0aGRyYXcgZ3JvdXAgc2l6ZScpCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyB3aXRoZHJhdyBncm91cCBzaXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo3NzkKICAgIC8vIGFzc2VydChUeG4uZ3JvdXBJbmRleCA9PT0gVWludDY0KDApLCAnd2l0aGRyYXcgYXBwIGNhbGwgaW5kZXgnKQogICAgdHhuIEdyb3VwSW5kZXgKICAgICEKICAgIGFzc2VydCAvLyB3aXRoZHJhdyBhcHAgY2FsbCBpbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTg2CiAgICAvLyB0aGlzLmFzc2VydE5vdFBhdXNlZChQQVVTRV9XSVRIRFJBVykKICAgIGludGNfMiAvLyA4CiAgICBjYWxsc3ViIGFzc2VydE5vdFBhdXNlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTg3CiAgICAvLyBhc3NlcnQodGhpcy52YXVsdHModmF1bHRJZCkuZXhpc3RzLCAndmF1bHQgbWlzc2luZycpCiAgICBzd2FwCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIyMgogICAgLy8gdmF1bHRzID0gQm94TWFwPHVpbnQ2NCwgVmF1bHRSZWNvcmQ+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzIgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTg3CiAgICAvLyBhc3NlcnQodGhpcy52YXVsdHModmF1bHRJZCkuZXhpc3RzLCAndmF1bHQgbWlzc2luZycpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHZhdWx0IG1pc3NpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjU4OAogICAgLy8gYXNzZXJ0KGFtb3VudE1pY3JvQWxnbyA+IFVpbnQ2NCgwKSwgJ3plcm8gd2l0aGRyYXcnKQogICAgZGlnIDEKICAgIGFzc2VydCAvLyB6ZXJvIHdpdGhkcmF3CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1ODkKICAgIC8vIGNvbnN0IHZhdWx0ID0gY2xvbmUodGhpcy52YXVsdHModmF1bHRJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTkwCiAgICAvLyBhc3NlcnQodmF1bHQuc3RhdHVzID09PSBWQVVMVF9TVEFUVVNfQUNUSVZFLCAndmF1bHQgaW5hY3RpdmUnKQogICAgZHVwCiAgICBwdXNoaW50IDcyIC8vIDcyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gdmF1bHQgaW5hY3RpdmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjU5MQogICAgLy8gYXNzZXJ0KHZhdWx0Lm93bmVyID09PSBUeG4uc2VuZGVyLCAndmF1bHQgb3duZXIgb25seScpCiAgICBkdXAKICAgIGV4dHJhY3QgOCAzMgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyB2YXVsdCBvd25lciBvbmx5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1OTIKICAgIC8vIGFzc2VydChhbW91bnRNaWNyb0FsZ28gPD0gdmF1bHQuY29sbGF0ZXJhbE1pY3JvQWxnbywgJ3dpdGhkcmF3IGV4Y2VlZHMgY29sbGF0ZXJhbCcpCiAgICBkdXAKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMgogICAgZGlnIDEKICAgIDw9CiAgICBhc3NlcnQgLy8gd2l0aGRyYXcgZXhjZWVkcyBjb2xsYXRlcmFsCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czozMwogICAgLy8gYXNzZXJ0KGxlZnQgPj0gcmlnaHQsICd1aW50NjQgdW5kZXJmbG93JykKICAgIGR1cAogICAgZGlnIDMKICAgID49CiAgICBhc3NlcnQgLy8gdWludDY0IHVuZGVyZmxvdwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MzQKICAgIC8vIHJldHVybiBsZWZ0IC0gcmlnaHQKICAgIHVuY292ZXIgMgogICAgLQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTk1CiAgICAvLyBpZiAodmF1bHQuZGVidE1pY3JvU3RhYmxlID4gVWludDY0KDApKSB7CiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBieiB3aXRoZHJhd0NvbGxhdGVyYWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1OTYKICAgIC8vIGNvbnN0IG9yYWNsZSA9IHRoaXMucmVhZEZyZXNoT3JhY2xlKCkKICAgIGNhbGxzdWIgcmVhZEZyZXNoT3JhY2xlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1OTgKICAgIC8vIGlzSGVhbHRoeURlYnQobmV3Q29sbGF0ZXJhbCwgdmF1bHQuZGVidE1pY3JvU3RhYmxlLCBvcmFjbGUucHJpY2VQZXJBbGdvTWljcm9TdGFibGUsIHRoaXMubWluQ29sbGF0ZXJhbFJhdGlvQnBzLnZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwOQogICAgLy8gbWluQ29sbGF0ZXJhbFJhdGlvQnBzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ21jcicsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA1IC8vICJtY3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo1OTgKICAgIC8vIGlzSGVhbHRoeURlYnQobmV3Q29sbGF0ZXJhbCwgdmF1bHQuZGVidE1pY3JvU3RhYmxlLCBvcmFjbGUucHJpY2VQZXJBbGdvTWljcm9TdGFibGUsIHRoaXMubWluQ29sbGF0ZXJhbFJhdGlvQnBzLnZhbHVlKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkaWcgMwogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGlzSGVhbHRoeURlYnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjU5Ny02MDAKICAgIC8vIGFzc2VydCgKICAgIC8vICAgaXNIZWFsdGh5RGVidChuZXdDb2xsYXRlcmFsLCB2YXVsdC5kZWJ0TWljcm9TdGFibGUsIG9yYWNsZS5wcmljZVBlckFsZ29NaWNyb1N0YWJsZSwgdGhpcy5taW5Db2xsYXRlcmFsUmF0aW9CcHMudmFsdWUpLAogICAgLy8gICAnd2l0aGRyYXcgdW5oZWFsdGh5JwogICAgLy8gKQogICAgYXNzZXJ0IC8vIHdpdGhkcmF3IHVuaGVhbHRoeQoKd2l0aGRyYXdDb2xsYXRlcmFsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjYwMwogICAgLy8gY29uc3QgbmV3VG90YWxDb2xsYXRlcmFsID0gc2FmZVN1Yih0aGlzLnRvdGFsQ29sbGF0ZXJhbE1pY3JvQWxnby52YWx1ZSwgYW1vdW50TWljcm9BbGdvKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIwNwogICAgLy8gdG90YWxDb2xsYXRlcmFsTWljcm9BbGdvID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3Rjb2wnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWNfMyAvLyAidGNvbCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjYwMwogICAgLy8gY29uc3QgbmV3VG90YWxDb2xsYXRlcmFsID0gc2FmZVN1Yih0aGlzLnRvdGFsQ29sbGF0ZXJhbE1pY3JvQWxnby52YWx1ZSwgYW1vdW50TWljcm9BbGdvKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjMzCiAgICAvLyBhc3NlcnQobGVmdCA+PSByaWdodCwgJ3VpbnQ2NCB1bmRlcmZsb3cnKQogICAgZHVwCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciAzCiAgICA+PQogICAgYXNzZXJ0IC8vIHVpbnQ2NCB1bmRlcmZsb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjM0CiAgICAvLyByZXR1cm4gbGVmdCAtIHJpZ2h0CiAgICBzd2FwCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NjA0CiAgICAvLyB2YXVsdC5jb2xsYXRlcmFsTWljcm9BbGdvID0gbmV3Q29sbGF0ZXJhbAogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDEzCiAgICBkaWcgNQogICAgc3dhcAogICAgcmVwbGFjZTIgNDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjYwNQogICAgLy8gdmF1bHQudXBkYXRlZEF0ID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgcmVwbGFjZTIgNjQKICAgIGJ1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA3CiAgICAvLyB0b3RhbENvbGxhdGVyYWxNaWNyb0FsZ28gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndGNvbCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18zIC8vICJ0Y29sIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NjA2CiAgICAvLyB0aGlzLnRvdGFsQ29sbGF0ZXJhbE1pY3JvQWxnby52YWx1ZSA9IG5ld1RvdGFsQ29sbGF0ZXJhbAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjYwOAogICAgLy8gY29uc3Qgc2hvdWxkQ2xvc2UgPSBuZXdDb2xsYXRlcmFsID09PSBVaW50NjQoMCkgJiYgdmF1bHQuZGVidE1pY3JvU3RhYmxlID09PSBVaW50NjQoMCkKICAgIGJueiB3aXRoZHJhd0NvbGxhdGVyYWxfYm9vbF9mYWxzZUA2CiAgICBkaWcgMgogICAgcHVzaGludCA0OCAvLyA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGJueiB3aXRoZHJhd0NvbGxhdGVyYWxfYm9vbF9mYWxzZUA2CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSA3Cgp3aXRoZHJhd0NvbGxhdGVyYWxfYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NjA5CiAgICAvLyBpZiAoc2hvdWxkQ2xvc2UpIHsKICAgIGRpZyA2CiAgICBieiB3aXRoZHJhd0NvbGxhdGVyYWxfZWxzZV9ib2R5QDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjYxMAogICAgLy8gdGhpcy5kZWxldGVWYXVsdEJveGVzKHZhdWx0KQogICAgZGlnIDIKICAgIGNhbGxzdWIgZGVsZXRlVmF1bHRCb3hlcwogICAgYnVyeSAzCgp3aXRoZHJhd0NvbGxhdGVyYWxfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjYxNQogICAgLy8gdGhpcy5wYXlDb2xsYXRlcmFsKHZhdWx0Lm93bmVyLCBhbW91bnRNaWNyb0FsZ28pCiAgICBkaWcgMgogICAgZXh0cmFjdCA4IDMyCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIHBheUNvbGxhdGVyYWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjYxNy02MjMKICAgIC8vIGVtaXQ8Q29sbGF0ZXJhbFdpdGhkcmF3bkV2ZW50Pih7CiAgICAvLyAgIHZhdWx0SWQsCiAgICAvLyAgIG93bmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICBhbW91bnRNaWNyb0FsZ28sCiAgICAvLyAgIHJlbWFpbmluZ0NvbGxhdGVyYWxNaWNyb0FsZ286IG5ld0NvbGxhdGVyYWwsCiAgICAvLyAgIHRvdGFsQ29sbGF0ZXJhbE1pY3JvQWxnbzogbmV3VG90YWxDb2xsYXRlcmFsLAogICAgLy8gfSkKICAgIGRpZyA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo2MTkKICAgIC8vIG93bmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NjE3LTYyMwogICAgLy8gZW1pdDxDb2xsYXRlcmFsV2l0aGRyYXduRXZlbnQ+KHsKICAgIC8vICAgdmF1bHRJZCwKICAgIC8vICAgb3duZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIGFtb3VudE1pY3JvQWxnbywKICAgIC8vICAgcmVtYWluaW5nQ29sbGF0ZXJhbE1pY3JvQWxnbzogbmV3Q29sbGF0ZXJhbCwKICAgIC8vICAgdG90YWxDb2xsYXRlcmFsTWljcm9BbGdvOiBuZXdUb3RhbENvbGxhdGVyYWwsCiAgICAvLyB9KQogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGNvbmNhdAogICAgZGlnIDEwCiAgICBjb25jYXQKICAgIGRpZyA4CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDc1YmNkOTc0IC8vIG1ldGhvZCAiQ29sbGF0ZXJhbFdpdGhkcmF3bkV2ZW50KHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo2MjUKICAgIC8vIGlmIChzaG91bGRDbG9zZSkgewogICAgZGlnIDYKICAgIGJ6IHdpdGhkcmF3Q29sbGF0ZXJhbF9hZnRlcl9pZl9lbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo2MjgKICAgIC8vIG93bmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NjMwCiAgICAvLyBjbG9zZWRBdDogR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjYyNi02MzEKICAgIC8vIGVtaXQ8VmF1bHRDbG9zZWRFdmVudD4oewogICAgLy8gICB2YXVsdElkLAogICAgLy8gICBvd25lcjogVHhuLnNlbmRlciwKICAgIC8vICAgcmV0dXJuZWRDb2xsYXRlcmFsTWljcm9BbGdvOiBhbW91bnRNaWNyb0FsZ28sCiAgICAvLyAgIGNsb3NlZEF0OiBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLAogICAgLy8gfSkKICAgIGRpZyA2CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDEwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWMgMjQgLy8gbWV0aG9kICJWYXVsdENsb3NlZEV2ZW50KHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKCndpdGhkcmF3Q29sbGF0ZXJhbF9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NTgzCiAgICAvLyBwdWJsaWMgd2l0aGRyYXdDb2xsYXRlcmFsKHZhdWx0SWQ6IHVpbnQ2NCwgYW1vdW50TWljcm9BbGdvOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCndpdGhkcmF3Q29sbGF0ZXJhbF9lbHNlX2JvZHlAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjYxMgogICAgLy8gdGhpcy52YXVsdHModmF1bHRJZCkudmFsdWUgPSBjbG9uZSh2YXVsdCkKICAgIGRpZyAzCiAgICBkaWcgMwogICAgYm94X3B1dAogICAgYiB3aXRoZHJhd0NvbGxhdGVyYWxfYWZ0ZXJfaWZfZWxzZUAxMAoKd2l0aGRyYXdDb2xsYXRlcmFsX2Jvb2xfZmFsc2VANjoKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDcKICAgIGIgd2l0aGRyYXdDb2xsYXRlcmFsX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjpDb2xsYXRlcmFsWFByb3RvY29sTWFuYWdlci5jbG9zZVZhdWx0W3JvdXRpbmddKCkgLT4gdm9pZDoKY2xvc2VWYXVsdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjYzOQogICAgLy8gcHVibGljIGNsb3NlVmF1bHQodmF1bHRJZDogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo2NDAKICAgIC8vIHRoaXMuYXNzZXJ0UmVhZHkoKQogICAgY2FsbHN1YiBhc3NlcnRSZWFkeQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NzgzCiAgICAvLyBhc3NlcnQoR2xvYmFsLmdyb3VwU2l6ZSA9PT0gVWludDY0KDEpLCAnY2xvc2UgZ3JvdXAgc2l6ZScpCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBjbG9zZSBncm91cCBzaXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo3ODQKICAgIC8vIGFzc2VydChUeG4uZ3JvdXBJbmRleCA9PT0gVWludDY0KDApLCAnY2xvc2UgYXBwIGNhbGwgaW5kZXgnKQogICAgdHhuIEdyb3VwSW5kZXgKICAgICEKICAgIGFzc2VydCAvLyBjbG9zZSBhcHAgY2FsbCBpbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NjQyCiAgICAvLyB0aGlzLmFzc2VydE5vdFBhdXNlZChQQVVTRV9XSVRIRFJBVykKICAgIGludGNfMiAvLyA4CiAgICBjYWxsc3ViIGFzc2VydE5vdFBhdXNlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NjQzCiAgICAvLyBhc3NlcnQodGhpcy52YXVsdHModmF1bHRJZCkuZXhpc3RzLCAndmF1bHQgbWlzc2luZycpCiAgICBpdG9iCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIyMgogICAgLy8gdmF1bHRzID0gQm94TWFwPHVpbnQ2NCwgVmF1bHRSZWNvcmQ+KHsga2V5UHJlZml4OiAndicgfSkKICAgIGJ5dGVjXzIgLy8gInYiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjY0MwogICAgLy8gYXNzZXJ0KHRoaXMudmF1bHRzKHZhdWx0SWQpLmV4aXN0cywgJ3ZhdWx0IG1pc3NpbmcnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB2YXVsdCBtaXNzaW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo2NDQKICAgIC8vIGNvbnN0IHZhdWx0ID0gY2xvbmUodGhpcy52YXVsdHModmF1bHRJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjY0NQogICAgLy8gYXNzZXJ0KHZhdWx0LnN0YXR1cyA9PT0gVkFVTFRfU1RBVFVTX0FDVElWRSwgJ3ZhdWx0IGluYWN0aXZlJykKICAgIGR1cAogICAgcHVzaGludCA3MiAvLyA3MgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIHZhdWx0IGluYWN0aXZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo2NDYKICAgIC8vIGFzc2VydCh2YXVsdC5vd25lciA9PT0gVHhuLnNlbmRlciwgJ3ZhdWx0IG93bmVyIG9ubHknKQogICAgZHVwCiAgICBleHRyYWN0IDggMzIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gdmF1bHQgb3duZXIgb25seQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NjQ3CiAgICAvLyBhc3NlcnQodmF1bHQuZGVidE1pY3JvU3RhYmxlID09PSBVaW50NjQoMCksICdkZWJ0IG5vdCB6ZXJvJykKICAgIGR1cAogICAgcHVzaGludCA0OCAvLyA0OAogICAgZXh0cmFjdF91aW50NjQKICAgICEKICAgIGFzc2VydCAvLyBkZWJ0IG5vdCB6ZXJvCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo2NDkKICAgIC8vIGNvbnN0IHJldHVybmVkQ29sbGF0ZXJhbCA9IHZhdWx0LmNvbGxhdGVyYWxNaWNyb0FsZ28KICAgIGR1cAogICAgcHVzaGludCA0MCAvLyA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NjUwCiAgICAvLyBjb25zdCBuZXdUb3RhbENvbGxhdGVyYWwgPSBzYWZlU3ViKHRoaXMudG90YWxDb2xsYXRlcmFsTWljcm9BbGdvLnZhbHVlLCByZXR1cm5lZENvbGxhdGVyYWwpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA3CiAgICAvLyB0b3RhbENvbGxhdGVyYWxNaWNyb0FsZ28gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndGNvbCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18zIC8vICJ0Y29sIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NjUwCiAgICAvLyBjb25zdCBuZXdUb3RhbENvbGxhdGVyYWwgPSBzYWZlU3ViKHRoaXMudG90YWxDb2xsYXRlcmFsTWljcm9BbGdvLnZhbHVlLCByZXR1cm5lZENvbGxhdGVyYWwpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MzMKICAgIC8vIGFzc2VydChsZWZ0ID49IHJpZ2h0LCAndWludDY0IHVuZGVyZmxvdycpCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIHVpbnQ2NCB1bmRlcmZsb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjM0CiAgICAvLyByZXR1cm4gbGVmdCAtIHJpZ2h0CiAgICBkaWcgMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA3CiAgICAvLyB0b3RhbENvbGxhdGVyYWxNaWNyb0FsZ28gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndGNvbCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18zIC8vICJ0Y29sIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NjUxCiAgICAvLyB0aGlzLnRvdGFsQ29sbGF0ZXJhbE1pY3JvQWxnby52YWx1ZSA9IG5ld1RvdGFsQ29sbGF0ZXJhbAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjY1MgogICAgLy8gdGhpcy5kZWxldGVWYXVsdEJveGVzKHZhdWx0KQogICAgc3dhcAogICAgY2FsbHN1YiBkZWxldGVWYXVsdEJveGVzCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo2NTQKICAgIC8vIGlmIChyZXR1cm5lZENvbGxhdGVyYWwgPiBVaW50NjQoMCkpIHsKICAgIGJ6IGNsb3NlVmF1bHRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo2NTUKICAgIC8vIHRoaXMucGF5Q29sbGF0ZXJhbCh2YXVsdC5vd25lciwgcmV0dXJuZWRDb2xsYXRlcmFsKQogICAgZHVwCiAgICBleHRyYWN0IDggMzIKICAgIGRpZyAyCiAgICBjYWxsc3ViIHBheUNvbGxhdGVyYWwKCmNsb3NlVmF1bHRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NjYwCiAgICAvLyBvd25lcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjY2MgogICAgLy8gY2xvc2VkQXQ6IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo2NTgtNjYzCiAgICAvLyBlbWl0PFZhdWx0Q2xvc2VkRXZlbnQ+KHsKICAgIC8vICAgdmF1bHRJZCwKICAgIC8vICAgb3duZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIHJldHVybmVkQ29sbGF0ZXJhbE1pY3JvQWxnbzogcmV0dXJuZWRDb2xsYXRlcmFsLAogICAgLy8gICBjbG9zZWRBdDogR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCwKICAgIC8vIH0pCiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgYnl0ZWMgMjQgLy8gbWV0aG9kICJWYXVsdENsb3NlZEV2ZW50KHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjYzOQogICAgLy8gcHVibGljIGNsb3NlVmF1bHQodmF1bHRJZDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6OkNvbGxhdGVyYWxYUHJvdG9jb2xNYW5hZ2VyLmxpcXVpZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmxpcXVpZGF0ZToKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDMKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6Njc4CiAgICAvLyBwdWJsaWMgbGlxdWlkYXRlKHJlcGF5bWVudDogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLCB2YXVsdElkOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwbiAyCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjY3OQogICAgLy8gdGhpcy5hc3NlcnRSZWFkeSgpCiAgICBjYWxsc3ViIGFzc2VydFJlYWR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo3OTQKICAgIC8vIGFzc2VydChHbG9iYWwuZ3JvdXBTaXplID09PSBVaW50NjQoMiksICdsaXF1aWRhdGlvbiBncm91cCBzaXplJykKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIHB1c2hpbnQgMiAvLyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGxpcXVpZGF0aW9uIGdyb3VwIHNpemUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjc5NQogICAgLy8gYXNzZXJ0KHJlcGF5bWVudC5ncm91cEluZGV4ID09PSBVaW50NjQoMCksICdsaXF1aWRhdGlvbiB0cmFuc2ZlciBpbmRleCcpCiAgICBndHhucyBHcm91cEluZGV4CiAgICAhCiAgICBhc3NlcnQgLy8gbGlxdWlkYXRpb24gdHJhbnNmZXIgaW5kZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjc5NgogICAgLy8gYXNzZXJ0KFR4bi5ncm91cEluZGV4ID09PSBVaW50NjQoMSksICdsaXF1aWRhdGlvbiBhcHAgY2FsbCBpbmRleCcpCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gbGlxdWlkYXRpb24gYXBwIGNhbGwgaW5kZXgKCmxpcXVpZGF0ZV93aGlsZV90b3BAOToKICAgIHB1c2hpbnQgMjAxMCAvLyAyMDEwCiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiBsaXF1aWRhdGVfYWZ0ZXJfd2hpbGVAMTQKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyAyNSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjIDI1IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIGxpcXVpZGF0ZV93aGlsZV90b3BAOQoKbGlxdWlkYXRlX2FmdGVyX3doaWxlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NjgyCiAgICAvLyB0aGlzLmFzc2VydE5vdFBhdXNlZChQQVVTRV9MSVFVSURBVEUpCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBjYWxsc3ViIGFzc2VydE5vdFBhdXNlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NjgzCiAgICAvLyBhc3NlcnQodGhpcy52YXVsdHModmF1bHRJZCkuZXhpc3RzLCAndmF1bHQgbWlzc2luZycpCiAgICBkdXAKICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjIyCiAgICAvLyB2YXVsdHMgPSBCb3hNYXA8dWludDY0LCBWYXVsdFJlY29yZD4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMiAvLyAidiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NjgzCiAgICAvLyBhc3NlcnQodGhpcy52YXVsdHModmF1bHRJZCkuZXhpc3RzLCAndmF1bHQgbWlzc2luZycpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHZhdWx0IG1pc3NpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjY4NAogICAgLy8gY29uc3Qgc3RhYmxlY29pbiA9IHRoaXMucmVhZFN0YWJsZWNvaW5TbmFwc2hvdCgpCiAgICBjYWxsc3ViIHJlYWRTdGFibGVjb2luU25hcHNob3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjY4NQogICAgLy8gY29uc3QgdmF1bHQgPSBjbG9uZSh0aGlzLnZhdWx0cyh2YXVsdElkKS52YWx1ZSkKICAgIHN3YXAKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNwogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjY4NgogICAgLy8gYXNzZXJ0KHZhdWx0LnN0YXR1cyA9PT0gVkFVTFRfU1RBVFVTX0FDVElWRSwgJ3ZhdWx0IGluYWN0aXZlJykKICAgIGR1cAogICAgcHVzaGludCA3MiAvLyA3MgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIHZhdWx0IGluYWN0aXZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo2ODcKICAgIC8vIGFzc2VydCh2YXVsdC5kZWJ0TWljcm9TdGFibGUgPiBVaW50NjQoMCksICdubyBkZWJ0JykKICAgIGR1cAogICAgcHVzaGludCA0OCAvLyA0OAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA2CiAgICBkdXAKICAgIGFzc2VydCAvLyBubyBkZWJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4MTUKICAgIC8vIGNvbnN0IHN0YWJsZWNvaW5BcHAgPSBBcHBsaWNhdGlvbih0aGlzLnN0YWJsZWNvaW5BcHBJZC52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTkKICAgIC8vIHN0YWJsZWNvaW5BcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzYXBwJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDQgLy8gInNhcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4MTUKICAgIC8vIGNvbnN0IHN0YWJsZWNvaW5BcHAgPSBBcHBsaWNhdGlvbih0aGlzLnN0YWJsZWNvaW5BcHBJZC52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4MTYKICAgIC8vIGNvbnN0IHN0YWJsZUFzc2V0ID0gQXNzZXQoc3RhYmxlY29pbi5zdGFibGVBc3NldElkKQogICAgdW5jb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjgxNwogICAgLy8gYXNzZXJ0KHJlcGF5bWVudC5zZW5kZXIgPT09IFR4bi5zZW5kZXIsICdsaXF1aWRhdGlvbiBzZW5kZXIgbWlzbWF0Y2gnKQogICAgZGlnIDUKICAgIGR1cAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIGxpcXVpZGF0aW9uIHNlbmRlciBtaXNtYXRjaAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODE4CiAgICAvLyBhc3NlcnQocmVwYXltZW50LmFzc2V0UmVjZWl2ZXIgPT09IHN0YWJsZWNvaW5BcHAuYWRkcmVzcywgJ2xpcXVpZGF0aW9uIHJlY2VpdmVyIG1pc21hdGNoJykKICAgIGR1cAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgdW5jb3ZlciAzCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIGxpcXVpZGF0aW9uIHJlY2VpdmVyIG1pc21hdGNoCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4MTkKICAgIC8vIGFzc2VydChyZXBheW1lbnQueGZlckFzc2V0ID09PSBzdGFibGVBc3NldCwgJ2xpcXVpZGF0aW9uIGFzc2V0IG1pc21hdGNoJykKICAgIGR1cAogICAgZ3R4bnMgWGZlckFzc2V0CiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gbGlxdWlkYXRpb24gYXNzZXQgbWlzbWF0Y2gKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjgyMAogICAgLy8gYXNzZXJ0KHJlcGF5bWVudC5yZWtleVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsICdsaXF1aWRhdGlvbiByZWtleSBmb3JiaWRkZW4nKQogICAgZHVwCiAgICBndHhucyBSZWtleVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gbGlxdWlkYXRpb24gcmVrZXkgZm9yYmlkZGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4MjEKICAgIC8vIGFzc2VydChyZXBheW1lbnQuYXNzZXRDbG9zZVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsICdsaXF1aWRhdGlvbiBjbG9zZSBmb3JiaWRkZW4nKQogICAgZHVwCiAgICBndHhucyBBc3NldENsb3NlVG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBsaXF1aWRhdGlvbiBjbG9zZSBmb3JiaWRkZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjgyMgogICAgLy8gYXNzZXJ0KHJlcGF5bWVudC5hc3NldEFtb3VudCA9PT0gdmF1bHREZWJ0TWljcm9TdGFibGUsICdsaXF1aWRhdGlvbiByZXBheSBhbW91bnQnKQogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGxpcXVpZGF0aW9uIHJlcGF5IGFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NjkwCiAgICAvLyBjb25zdCBvcmFjbGUgPSB0aGlzLnJlYWRGcmVzaE9yYWNsZSgpCiAgICBjYWxsc3ViIHJlYWRGcmVzaE9yYWNsZQogICAgZHVwCiAgICBidXJ5IDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo2OTMKICAgIC8vIHZhdWx0LmNvbGxhdGVyYWxNaWNyb0FsZ28sCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo2OTUKICAgIC8vIG9yYWNsZS5wcmljZVBlckFsZ29NaWNyb1N0YWJsZSwKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjY5NgogICAgLy8gdGhpcy5saXF1aWRhdGlvblJhdGlvQnBzLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjEwCiAgICAvLyBsaXF1aWRhdGlvblJhdGlvQnBzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2xxcicsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA5IC8vICJscXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo2OTYKICAgIC8vIHRoaXMubGlxdWlkYXRpb25SYXRpb0Jwcy52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6NzUKICAgIC8vIGFzc2VydChwcmljZVBlckFsZ29NaWNyb1N0YWJsZSA+IFVpbnQ2NCgwKSwgJ29yYWNsZSBwcmljZSByZXF1aXJlZCcpCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gb3JhY2xlIHByaWNlIHJlcXVpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo3NgogICAgLy8gYXNzZXJ0KGxpcXVpZGF0aW9uUmF0aW9CcHMgPj0gQlBTX0RFTk9NSU5BVE9SLCAnbGlxdWlkYXRpb24gcmF0aW8gdG9vIGxvdycpCiAgICBpbnRjXzMgLy8gMTAwMDAKICAgID49CiAgICBhc3NlcnQgLy8gbGlxdWlkYXRpb24gcmF0aW8gdG9vIGxvdwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6NzcKICAgIC8vIGlmIChkZWJ0TWljcm9TdGFibGUgPT09IFVpbnQ2NCgwKSkgewogICAgYm56IGxpcXVpZGF0ZV9hZnRlcl9pZl9lbHNlQDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo3OAogICAgLy8gcmV0dXJuIGZhbHNlCiAgICBpbnRjXzAgLy8gMAoKbGlxdWlkYXRlX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6OmlzTGlxdWlkYXRhYmxlRGVidEAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjY5MS02OTkKICAgIC8vIGFzc2VydCgKICAgIC8vICAgaXNMaXF1aWRhdGFibGVEZWJ0KAogICAgLy8gICAgIHZhdWx0LmNvbGxhdGVyYWxNaWNyb0FsZ28sCiAgICAvLyAgICAgdmF1bHQuZGVidE1pY3JvU3RhYmxlLAogICAgLy8gICAgIG9yYWNsZS5wcmljZVBlckFsZ29NaWNyb1N0YWJsZSwKICAgIC8vICAgICB0aGlzLmxpcXVpZGF0aW9uUmF0aW9CcHMudmFsdWUKICAgIC8vICAgKSwKICAgIC8vICAgJ3ZhdWx0IGhlYWx0aHknCiAgICAvLyApCiAgICBhc3NlcnQgLy8gdmF1bHQgaGVhbHRoeQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NzAxCiAgICAvLyBjb25zdCBsaXF1aWRhdG9yUHJlbWl1bUJwcyA9IHNhZmVBZGQoQlBTX0RFTk9NSU5BVE9SLCB0aGlzLmxpcXVpZGF0aW9uQm9udXNCcHMudmFsdWUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjEyCiAgICAvLyBsaXF1aWRhdGlvbkJvbnVzQnBzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2xibicsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxMSAvLyAibGJuIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NzAxCiAgICAvLyBjb25zdCBsaXF1aWRhdG9yUHJlbWl1bUJwcyA9IHNhZmVBZGQoQlBTX0RFTk9NSU5BVE9SLCB0aGlzLmxpcXVpZGF0aW9uQm9udXNCcHMudmFsdWUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18zIC8vIDEwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoyOQogICAgLy8gcmV0dXJuIGJpZ1RvVWludDY0KEJpZ1VpbnQobGVmdCkgKyBCaWdVaW50KHJpZ2h0KSkKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGIrCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxNQogICAgLy8gYXNzZXJ0KHZhbHVlIDw9IEJpZ1VpbnQoVWludDY0Lk1BWF9WQUxVRSksICd1aW50NjQgb3ZlcmZsb3cnKQogICAgZHVwCiAgICBieXRlY18xIC8vIDB4ZmZmZmZmZmZmZmZmZmZmZgogICAgYjw9CiAgICBhc3NlcnQgLy8gdWludDY0IG92ZXJmbG93CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxNgogICAgLy8gcmV0dXJuIG9wLmJ0b2koQnl0ZXModmFsdWUpKQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MTE0CiAgICAvLyByZXR1cm4gZGVidFRvQ29sbGF0ZXJhbE1pY3JvQWxnbyhkZWJ0TWljcm9TdGFibGUsIHByaWNlUGVyQWxnb01pY3JvU3RhYmxlLCBwcmVtaXVtT3JGZWVCcHMsIHRydWUpCiAgICBkaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgOQogICAgZHVwCiAgICBjb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGRlYnRUb0NvbGxhdGVyYWxNaWNyb0FsZ28KICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo3MTAKICAgIC8vIHRoaXMubGlxdWlkYXRpb25QZW5hbHR5QnBzLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjExCiAgICAvLyBsaXF1aWRhdGlvblBlbmFsdHlCcHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbHBuJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDEwIC8vICJscG4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo3MTAKICAgIC8vIHRoaXMubGlxdWlkYXRpb25QZW5hbHR5QnBzLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MTA2CiAgICAvLyByZXR1cm4gZGVidFRvQ29sbGF0ZXJhbE1pY3JvQWxnbyhkZWJ0TWljcm9TdGFibGUsIHByaWNlUGVyQWxnb01pY3JvU3RhYmxlLCBwcmVtaXVtT3JGZWVCcHMsIGZhbHNlKQogICAgc3dhcAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZGVidFRvQ29sbGF0ZXJhbE1pY3JvQWxnbwogICAgYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxMjUKICAgIC8vIGlmIChsZWZ0IDw9IHJpZ2h0KSB7CiAgICBkaWcgMTMKICAgID49CiAgICBieiBsaXF1aWRhdGVfYWZ0ZXJfaWZfZWxzZUAyNgogICAgZGlnIDEyCiAgICBidXJ5IDExCgpsaXF1aWRhdGVfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo6bWluVWludDY0QDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MzMKICAgIC8vIGFzc2VydChsZWZ0ID49IHJpZ2h0LCAndWludDY0IHVuZGVyZmxvdycpCiAgICBkaWcgMTIKICAgIGR1cAogICAgZGlnIDEyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgID49CiAgICBhc3NlcnQgLy8gdWludDY0IHVuZGVyZmxvdwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MzQKICAgIC8vIHJldHVybiBsZWZ0IC0gcmlnaHQKICAgIHN3YXAKICAgIC0KICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxMjUKICAgIC8vIGlmIChsZWZ0IDw9IHJpZ2h0KSB7CiAgICBkaWcgNAogICAgPD0KICAgIGJ6IGxpcXVpZGF0ZV9hZnRlcl9pZl9lbHNlQDMyCiAgICBkaWcgNQoKbGlxdWlkYXRlX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6Om1pblVpbnQ2NEAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjMzCiAgICAvLyBhc3NlcnQobGVmdCA+PSByaWdodCwgJ3VpbnQ2NCB1bmRlcmZsb3cnKQogICAgZGlnIDYKICAgIGR1cAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQgLy8gdWludDY0IHVuZGVyZmxvdwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MzQKICAgIC8vIHJldHVybiBsZWZ0IC0gcmlnaHQKICAgIGRpZyAxCiAgICAtCiAgICBidXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjcxOAogICAgLy8gY29uc3QgbmV3VG90YWxEZWJ0ID0gc2FmZVN1Yih0aGlzLnRvdGFsRGVidE1pY3JvU3RhYmxlLnZhbHVlLCB2YXVsdC5kZWJ0TWljcm9TdGFibGUpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA2CiAgICAvLyB0b3RhbERlYnRNaWNyb1N0YWJsZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd0ZGJ0JywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjXzAgLy8gInRkYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo3MTgKICAgIC8vIGNvbnN0IG5ld1RvdGFsRGVidCA9IHNhZmVTdWIodGhpcy50b3RhbERlYnRNaWNyb1N0YWJsZS52YWx1ZSwgdmF1bHQuZGVidE1pY3JvU3RhYmxlKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjMzCiAgICAvLyBhc3NlcnQobGVmdCA+PSByaWdodCwgJ3VpbnQ2NCB1bmRlcmZsb3cnKQogICAgZHVwCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICA+PQogICAgYXNzZXJ0IC8vIHVpbnQ2NCB1bmRlcmZsb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjM0CiAgICAvLyByZXR1cm4gbGVmdCAtIHJpZ2h0CiAgICBkaWcgMQogICAgLQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo3MTkKICAgIC8vIGNvbnN0IG5ld1RvdGFsQ29sbGF0ZXJhbCA9IHNhZmVTdWIodGhpcy50b3RhbENvbGxhdGVyYWxNaWNyb0FsZ28udmFsdWUsIHZhdWx0LmNvbGxhdGVyYWxNaWNyb0FsZ28pCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA3CiAgICAvLyB0b3RhbENvbGxhdGVyYWxNaWNyb0FsZ28gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndGNvbCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18zIC8vICJ0Y29sIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NzE5CiAgICAvLyBjb25zdCBuZXdUb3RhbENvbGxhdGVyYWwgPSBzYWZlU3ViKHRoaXMudG90YWxDb2xsYXRlcmFsTWljcm9BbGdvLnZhbHVlLCB2YXVsdC5jb2xsYXRlcmFsTWljcm9BbGdvKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjMzCiAgICAvLyBhc3NlcnQobGVmdCA+PSByaWdodCwgJ3VpbnQ2NCB1bmRlcmZsb3cnKQogICAgZHVwCiAgICBkaWcgMTcKICAgIGR1cAogICAgY292ZXIgMwogICAgPj0KICAgIGFzc2VydCAvLyB1aW50NjQgdW5kZXJmbG93CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czozNAogICAgLy8gcmV0dXJuIGxlZnQgLSByaWdodAogICAgc3dhcAogICAgLQogICAgZHVwCiAgICBidXJ5IDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo3MjAKICAgIC8vIGNvbnN0IG5ld1Byb3RvY29sRmVlcyA9IHNhZmVBZGQodGhpcy5wcm90b2NvbEZlZUNvbGxhdGVyYWxNaWNyb0FsZ28udmFsdWUsIHByb3RvY29sRmVlQ29sbGF0ZXJhbCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMDgKICAgIC8vIHByb3RvY29sRmVlQ29sbGF0ZXJhbE1pY3JvQWxnbyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwZmVlJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDIwIC8vICJwZmVlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NzIwCiAgICAvLyBjb25zdCBuZXdQcm90b2NvbEZlZXMgPSBzYWZlQWRkKHRoaXMucHJvdG9jb2xGZWVDb2xsYXRlcmFsTWljcm9BbGdvLnZhbHVlLCBwcm90b2NvbEZlZUNvbGxhdGVyYWwpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MjkKICAgIC8vIHJldHVybiBiaWdUb1VpbnQ2NChCaWdVaW50KGxlZnQpICsgQmlnVWludChyaWdodCkpCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSAyMAogICAgYisKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjE1CiAgICAvLyBhc3NlcnQodmFsdWUgPD0gQmlnVWludChVaW50NjQuTUFYX1ZBTFVFKSwgJ3VpbnQ2NCBvdmVyZmxvdycpCiAgICBkdXAKICAgIGJ5dGVjXzEgLy8gMHhmZmZmZmZmZmZmZmZmZmZmCiAgICBiPD0KICAgIGFzc2VydCAvLyB1aW50NjQgb3ZlcmZsb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjE2CiAgICAvLyByZXR1cm4gb3AuYnRvaShCeXRlcyh2YWx1ZSkpCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo3MjIKICAgIC8vIHRoaXMuY2FsbFN0YWJsZWNvaW5CdXJuKHZhdWx0LmlkLCB2YXVsdC5kZWJ0TWljcm9TdGFibGUpCiAgICBkaWcgMTcKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDQKICAgIGNhbGxzdWIgY2FsbFN0YWJsZWNvaW5CdXJuCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMDYKICAgIC8vIHRvdGFsRGVidE1pY3JvU3RhYmxlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3RkYnQnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWNfMCAvLyAidGRidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjcyNAogICAgLy8gdGhpcy50b3RhbERlYnRNaWNyb1N0YWJsZS52YWx1ZSA9IG5ld1RvdGFsRGVidAogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA3CiAgICAvLyB0b3RhbENvbGxhdGVyYWxNaWNyb0FsZ28gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndGNvbCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlY18zIC8vICJ0Y29sIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NzI1CiAgICAvLyB0aGlzLnRvdGFsQ29sbGF0ZXJhbE1pY3JvQWxnby52YWx1ZSA9IG5ld1RvdGFsQ29sbGF0ZXJhbAogICAgdW5jb3ZlciAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA4CiAgICAvLyBwcm90b2NvbEZlZUNvbGxhdGVyYWxNaWNyb0FsZ28gPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncGZlZScsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAyMCAvLyAicGZlZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjcyNgogICAgLy8gdGhpcy5wcm90b2NvbEZlZUNvbGxhdGVyYWxNaWNyb0FsZ28udmFsdWUgPSBuZXdQcm90b2NvbEZlZXMKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo3MjcKICAgIC8vIHRoaXMuZGVsZXRlVmF1bHRCb3hlcyh2YXVsdCkKICAgIGNhbGxzdWIgZGVsZXRlVmF1bHRCb3hlcwogICAgYnVyeSAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NzI5CiAgICAvLyBpZiAobGlxdWlkYXRvckNvbGxhdGVyYWwgPiBVaW50NjQoMCkpIHsKICAgIGRpZyAxMAogICAgYnogbGlxdWlkYXRlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NzMwCiAgICAvLyB0aGlzLnBheUNvbGxhdGVyYWwoVHhuLnNlbmRlciwgbGlxdWlkYXRvckNvbGxhdGVyYWwpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMTEKICAgIGNhbGxzdWIgcGF5Q29sbGF0ZXJhbAoKbGlxdWlkYXRlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjczMgogICAgLy8gaWYgKG93bmVyUmVmdW5kQ29sbGF0ZXJhbCA+IFVpbnQ2NCgwKSkgewogICAgZGlnIDcKICAgIGJ6IGxpcXVpZGF0ZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjczMwogICAgLy8gdGhpcy5wYXlDb2xsYXRlcmFsKHZhdWx0Lm93bmVyLCBvd25lclJlZnVuZENvbGxhdGVyYWwpCiAgICBkaWcgMTMKICAgIGV4dHJhY3QgOCAzMgogICAgZGlnIDgKICAgIGNhbGxzdWIgcGF5Q29sbGF0ZXJhbAoKbGlxdWlkYXRlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjczOAogICAgLy8gb3duZXI6IHZhdWx0Lm93bmVyLAogICAgZGlnIDEzCiAgICBkdXAKICAgIGV4dHJhY3QgOCAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NzM5CiAgICAvLyBsaXF1aWRhdG9yOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NzQwCiAgICAvLyByZXBhaWREZWJ0TWljcm9TdGFibGU6IHZhdWx0LmRlYnRNaWNyb1N0YWJsZSwKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA0OCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo3NDUKICAgIC8vIG9yYWNsZVVwZGF0ZWRSb3VuZDogb3JhY2xlLnVwZGF0ZWRSb3VuZCwKICAgIGRpZyAxOAogICAgZXh0cmFjdCAxNiA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo3MzYtNzQ4CiAgICAvLyBlbWl0PFZhdWx0TGlxdWlkYXRlZEV2ZW50Pih7CiAgICAvLyAgIHZhdWx0SWQsCiAgICAvLyAgIG93bmVyOiB2YXVsdC5vd25lciwKICAgIC8vICAgbGlxdWlkYXRvcjogVHhuLnNlbmRlciwKICAgIC8vICAgcmVwYWlkRGVidE1pY3JvU3RhYmxlOiB2YXVsdC5kZWJ0TWljcm9TdGFibGUsCiAgICAvLyAgIGxpcXVpZGF0b3JDb2xsYXRlcmFsTWljcm9BbGdvOiBsaXF1aWRhdG9yQ29sbGF0ZXJhbCwKICAgIC8vICAgcHJvdG9jb2xGZWVDb2xsYXRlcmFsTWljcm9BbGdvOiBwcm90b2NvbEZlZUNvbGxhdGVyYWwsCiAgICAvLyAgIG93bmVyUmVmdW5kQ29sbGF0ZXJhbE1pY3JvQWxnbzogb3duZXJSZWZ1bmRDb2xsYXRlcmFsLAogICAgLy8gICBwcmljZVBlckFsZ29NaWNyb1N0YWJsZTogb3JhY2xlLnByaWNlUGVyQWxnb01pY3JvU3RhYmxlLAogICAgLy8gICBvcmFjbGVVcGRhdGVkUm91bmQ6IG9yYWNsZS51cGRhdGVkUm91bmQsCiAgICAvLyAgIHRvdGFsRGVidE1pY3JvU3RhYmxlOiBuZXdUb3RhbERlYnQsCiAgICAvLyAgIHRvdGFsQ29sbGF0ZXJhbE1pY3JvQWxnbzogbmV3VG90YWxDb2xsYXRlcmFsLAogICAgLy8gfSkKICAgIGRpZyAyMAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDEyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxNgogICAgY29uY2F0CiAgICBkaWcgOQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgOAogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA5CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxMAogICAgaXRvYgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg1MDMyZDJkYiAvLyBtZXRob2QgIlZhdWx0TGlxdWlkYXRlZEV2ZW50KHVpbnQ2NCxhZGRyZXNzLGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6Njc4CiAgICAvLyBwdWJsaWMgbGlxdWlkYXRlKHJlcGF5bWVudDogZ3R4bi5Bc3NldFRyYW5zZmVyVHhuLCB2YXVsdElkOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmxpcXVpZGF0ZV9hZnRlcl9pZl9lbHNlQDMyOgogICAgZGlnIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjcxNQogICAgLy8gY29uc3QgcHJvdG9jb2xGZWVDb2xsYXRlcmFsID0gbWluVWludDY0KHJlbWFpbmluZ0FmdGVyTGlxdWlkYXRvciwgdGFyZ2V0UHJvdG9jb2xGZWVDb2xsYXRlcmFsKQogICAgYiBsaXF1aWRhdGVfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo6bWluVWludDY0QDMzCgpsaXF1aWRhdGVfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIGRpZyA0CiAgICBidXJ5IDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo3MTMKICAgIC8vIGNvbnN0IGxpcXVpZGF0b3JDb2xsYXRlcmFsID0gbWluVWludDY0KHZhdWx0LmNvbGxhdGVyYWxNaWNyb0FsZ28sIHRhcmdldExpcXVpZGF0b3JDb2xsYXRlcmFsKQogICAgYiBsaXF1aWRhdGVfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo6bWluVWludDY0QDI3CgpsaXF1aWRhdGVfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjgxCiAgICAvLyBjb25zdCBjb2xsYXRlcmFsU2lkZTogYmlndWludCA9IEJpZ1VpbnQoY29sbGF0ZXJhbE1pY3JvQWxnbykgKiBCaWdVaW50KHByaWNlUGVyQWxnb01pY3JvU3RhYmxlKSAqIEJpZ1VpbnQoQlBTX0RFTk9NSU5BVE9SKQogICAgZGlnIDEyCiAgICBpdG9iCiAgICBkaWcgNwogICAgaXRvYgogICAgYioKICAgIGJ5dGVjIDIyIC8vIDB4MjcxMAogICAgYioKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjgyCiAgICAvLyBjb25zdCBkZWJ0U2lkZTogYmlndWludCA9IEJpZ1VpbnQoZGVidE1pY3JvU3RhYmxlKSAqIEJpZ1VpbnQoTUlDUk9fVU5JVCkgKiBCaWdVaW50KGxpcXVpZGF0aW9uUmF0aW9CcHMpCiAgICBkaWcgMwogICAgaXRvYgogICAgYnl0ZWMgMjMgLy8gMHgwZjQyNDAKICAgIGIqCiAgICBkaWcgMTMKICAgIGl0b2IKICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo4MwogICAgLy8gcmV0dXJuIGNvbGxhdGVyYWxTaWRlIDw9IGRlYnRTaWRlCiAgICBiPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjY5Mi02OTcKICAgIC8vIGlzTGlxdWlkYXRhYmxlRGVidCgKICAgIC8vICAgdmF1bHQuY29sbGF0ZXJhbE1pY3JvQWxnbywKICAgIC8vICAgdmF1bHQuZGVidE1pY3JvU3RhYmxlLAogICAgLy8gICBvcmFjbGUucHJpY2VQZXJBbGdvTWljcm9TdGFibGUsCiAgICAvLyAgIHRoaXMubGlxdWlkYXRpb25SYXRpb0Jwcy52YWx1ZQogICAgLy8gKSwKICAgIGIgbGlxdWlkYXRlX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6OmlzTGlxdWlkYXRhYmxlRGVidEAyMQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjpDb2xsYXRlcmFsWFByb3RvY29sTWFuYWdlci5hc3NlcnRSZWFkeSgpIC0+IHZvaWQ6CmFzc2VydFJlYWR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NzUyCiAgICAvLyBhc3NlcnQodGhpcy5pbml0aWFsaXplZC52YWx1ZSA9PT0gVWludDY0KDEpLCAncHJvdG9jb2wgbm90IGluaXRpYWxpemVkJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMDMKICAgIC8vIGluaXRpYWxpemVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2luaXQnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgOCAvLyAiaW5pdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjc1MgogICAgLy8gYXNzZXJ0KHRoaXMuaW5pdGlhbGl6ZWQudmFsdWUgPT09IFVpbnQ2NCgxKSwgJ3Byb3RvY29sIG5vdCBpbml0aWFsaXplZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gcHJvdG9jb2wgbm90IGluaXRpYWxpemVkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo6Q29sbGF0ZXJhbFhQcm90b2NvbE1hbmFnZXIuYXNzZXJ0QWRtaW4oKSAtPiB2b2lkOgphc3NlcnRBZG1pbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjc1NgogICAgLy8gYXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuYWRtaW4udmFsdWUsICdhZG1pbiBvbmx5JykKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMDIKICAgIC8vIGFkbWluID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6ICdhZG0nIH0pCiAgICBieXRlYyAxNyAvLyAiYWRtIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NzU2CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSwgJ2FkbWluIG9ubHknKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gYWRtaW4gb25seQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6OkNvbGxhdGVyYWxYUHJvdG9jb2xNYW5hZ2VyLmFzc2VydE5vdFBhdXNlZChhY3Rpb25GbGFnOiB1aW50NjQpIC0+IHZvaWQ6CmFzc2VydE5vdFBhdXNlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjc1OQogICAgLy8gcHJpdmF0ZSBhc3NlcnROb3RQYXVzZWQoYWN0aW9uRmxhZzogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjc2MAogICAgLy8gY29uc3QgZW1lcmdlbmN5QWN0aXZlOiB1aW50NjQgPSB0aGlzLnBhdXNlRmxhZ3MudmFsdWUgJiBQQVVTRV9FTUVSR0VOQ1kKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTcKICAgIC8vIHBhdXNlRmxhZ3MgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAncGZsZycsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxNSAvLyAicGZsZyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjc2MAogICAgLy8gY29uc3QgZW1lcmdlbmN5QWN0aXZlOiB1aW50NjQgPSB0aGlzLnBhdXNlRmxhZ3MudmFsdWUgJiBQQVVTRV9FTUVSR0VOQ1kKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkdXAKICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgICYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjc2MQogICAgLy8gY29uc3QgYWN0aW9uQWN0aXZlOiB1aW50NjQgPSB0aGlzLnBhdXNlRmxhZ3MudmFsdWUgJiBhY3Rpb25GbGFnCiAgICBzd2FwCiAgICBmcmFtZV9kaWcgLTEKICAgICYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjc2MgogICAgLy8gYXNzZXJ0KGVtZXJnZW5jeUFjdGl2ZSA9PT0gVWludDY0KDApLCAnZW1lcmdlbmN5IHBhdXNlZCcpCiAgICBzd2FwCiAgICAhCiAgICBhc3NlcnQgLy8gZW1lcmdlbmN5IHBhdXNlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6NzYzCiAgICAvLyBhc3NlcnQoYWN0aW9uQWN0aXZlID09PSBVaW50NjQoMCksICdhY3Rpb24gcGF1c2VkJykKICAgICEKICAgIGFzc2VydCAvLyBhY3Rpb24gcGF1c2VkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo6Q29sbGF0ZXJhbFhQcm90b2NvbE1hbmFnZXIucmVhZEZyZXNoT3JhY2xlKCkgLT4gYnl0ZXM6CnJlYWRGcmVzaE9yYWNsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjgyNgogICAgLy8gYXNzZXJ0KHRoaXMub3JhY2xlQXBwSWQudmFsdWUgPiBVaW50NjQoMCksICdvcmFjbGUgYXBwIHJlcXVpcmVkJykKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTgKICAgIC8vIG9yYWNsZUFwcElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ29hcHAnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMTYgLy8gIm9hcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4MjYKICAgIC8vIGFzc2VydCh0aGlzLm9yYWNsZUFwcElkLnZhbHVlID4gVWludDY0KDApLCAnb3JhY2xlIGFwcCByZXF1aXJlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gb3JhY2xlIGFwcCByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODI4CiAgICAvLyBjb25zdCBvcmFjbGUgPSByZWFkRnJlc2hPcmFjbGVBZGFwdGVyKG9yYWNsZUFwcCwgdGhpcy5vcmFjbGVGcmVzaG5lc3NXaW5kb3dTZWNvbmRzLnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIxMwogICAgLy8gb3JhY2xlRnJlc2huZXNzV2luZG93U2Vjb25kcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdvZncnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMTIgLy8gIm9mdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjgyOAogICAgLy8gY29uc3Qgb3JhY2xlID0gcmVhZEZyZXNoT3JhY2xlQWRhcHRlcihvcmFjbGVBcHAsIHRoaXMub3JhY2xlRnJlc2huZXNzV2luZG93U2Vjb25kcy52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL29yYWNsZV9hZGFwdGVyLmFsZ28udHM6NDAKICAgIC8vIGNvbnN0IFtwcmljZSwgcHJpY2VFeGlzdHNdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KG9yYWNsZUFwcCwgQnl0ZXMoT1JBQ0xFX1BSSUNFX0tFWSkpCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzICJweCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL29yYWNsZV9hZGFwdGVyLmFsZ28udHM6NDEKICAgIC8vIGNvbnN0IFt1cGRhdGVkQXQsIHVwZGF0ZWRBdEV4aXN0c10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQob3JhY2xlQXBwLCBCeXRlcyhPUkFDTEVfVVBEQVRFRF9BVF9LRVkpKQogICAgZGlnIDMKICAgIHB1c2hieXRlcyAidXBkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvb3JhY2xlX2FkYXB0ZXIuYWxnby50czo0MgogICAgLy8gY29uc3QgW3VwZGF0ZWRSb3VuZCwgdXBkYXRlZFJvdW5kRXhpc3RzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NChvcmFjbGVBcHAsIEJ5dGVzKE9SQUNMRV9VUERBVEVEX1JPVU5EX0tFWSkpCiAgICBkaWcgNQogICAgcHVzaGJ5dGVzICJ1cm5kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvb3JhY2xlX2FkYXB0ZXIuYWxnby50czo0MwogICAgLy8gY29uc3QgW21heEFnZVNlY29uZHMsIG1heEFnZUV4aXN0c10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQob3JhY2xlQXBwLCBCeXRlcyhPUkFDTEVfTUFYX0FHRV9LRVkpKQogICAgZGlnIDcKICAgIHB1c2hieXRlcyAibWF4YSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL29yYWNsZV9hZGFwdGVyLmFsZ28udHM6NDQKICAgIC8vIGNvbnN0IFtwYXVzZUZsYWdzLCBwYXVzZUZsYWdzRXhpc3RdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KG9yYWNsZUFwcCwgQnl0ZXMoT1JBQ0xFX1BBVVNFX0ZMQUdTX0tFWSkpCiAgICB1bmNvdmVyIDkKICAgIGJ5dGVjIDE1IC8vICJwZmxnIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvb3JhY2xlX2FkYXB0ZXIuYWxnby50czo0NgogICAgLy8gYXNzZXJ0KHByaWNlRXhpc3RzLCAnb3JhY2xlIHByaWNlIG1pc3NpbmcnKQogICAgdW5jb3ZlciA4CiAgICBhc3NlcnQgLy8gb3JhY2xlIHByaWNlIG1pc3NpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvb3JhY2xlX2FkYXB0ZXIuYWxnby50czo0NwogICAgLy8gYXNzZXJ0KHVwZGF0ZWRBdEV4aXN0cywgJ29yYWNsZSB0aW1lc3RhbXAgbWlzc2luZycpCiAgICB1bmNvdmVyIDYKICAgIGFzc2VydCAvLyBvcmFjbGUgdGltZXN0YW1wIG1pc3NpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvb3JhY2xlX2FkYXB0ZXIuYWxnby50czo0OAogICAgLy8gYXNzZXJ0KHVwZGF0ZWRSb3VuZEV4aXN0cywgJ29yYWNsZSByb3VuZCBtaXNzaW5nJykKICAgIHVuY292ZXIgNAogICAgYXNzZXJ0IC8vIG9yYWNsZSByb3VuZCBtaXNzaW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL29yYWNsZV9hZGFwdGVyLmFsZ28udHM6NDkKICAgIC8vIGFzc2VydChtYXhBZ2VFeGlzdHMsICdvcmFjbGUgbWF4IGFnZSBtaXNzaW5nJykKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIG9yYWNsZSBtYXggYWdlIG1pc3NpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvb3JhY2xlX2FkYXB0ZXIuYWxnby50czo1MAogICAgLy8gYXNzZXJ0KHBhdXNlRmxhZ3NFeGlzdCwgJ29yYWNsZSBwYXVzZSBtaXNzaW5nJykKICAgIGFzc2VydCAvLyBvcmFjbGUgcGF1c2UgbWlzc2luZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9vcmFjbGVfYWRhcHRlci5hbGdvLnRzOjcwCiAgICAvLyBhc3NlcnQocHJpY2VQZXJBbGdvTWljcm9TdGFibGUgPiBVaW50NjQoMCksICdvcmFjbGUgcHJpY2UgcmVxdWlyZWQnKQogICAgZGlnIDQKICAgIGFzc2VydCAvLyBvcmFjbGUgcHJpY2UgcmVxdWlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvb3JhY2xlX2FkYXB0ZXIuYWxnby50czo3MQogICAgLy8gYXNzZXJ0KHVwZGF0ZWRBdCA+IFVpbnQ2NCgwKSwgJ29yYWNsZSB0aW1lc3RhbXAgcmVxdWlyZWQnKQogICAgZGlnIDMKICAgIGFzc2VydCAvLyBvcmFjbGUgdGltZXN0YW1wIHJlcXVpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL29yYWNsZV9hZGFwdGVyLmFsZ28udHM6NzIKICAgIC8vIGFzc2VydCh1cGRhdGVkUm91bmQgPiBVaW50NjQoMCksICdvcmFjbGUgcm91bmQgcmVxdWlyZWQnKQogICAgZGlnIDIKICAgIGFzc2VydCAvLyBvcmFjbGUgcm91bmQgcmVxdWlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvb3JhY2xlX2FkYXB0ZXIuYWxnby50czo3MwogICAgLy8gYXNzZXJ0KG1heEFnZVNlY29uZHMgPiBVaW50NjQoMCksICdvcmFjbGUgbWF4IGFnZSByZXF1aXJlZCcpCiAgICBkaWcgMQogICAgYXNzZXJ0IC8vIG9yYWNsZSBtYXggYWdlIHJlcXVpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL29yYWNsZV9hZGFwdGVyLmFsZ28udHM6NzQKICAgIC8vIGFzc2VydCgocGF1c2VGbGFncyAmIE9SQUNMRV9QQVVTRV9SRUFEUykgPT09IFVpbnQ2NCgwKSwgJ29yYWNsZSByZWFkcyBwYXVzZWQnKQogICAgZHVwCiAgICBwdXNoaW50IDIgLy8gMgogICAgJgogICAgIQogICAgYXNzZXJ0IC8vIG9yYWNsZSByZWFkcyBwYXVzZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvb3JhY2xlX2FkYXB0ZXIuYWxnby50czo3NQogICAgLy8gYXNzZXJ0KHVwZGF0ZWRBdCA8PSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wLCAnb3JhY2xlIHRpbWVzdGFtcCBmdXR1cmUnKQogICAgZGlnIDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQgLy8gb3JhY2xlIHRpbWVzdGFtcCBmdXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvb3JhY2xlX2FkYXB0ZXIuYWxnby50czo3NgogICAgLy8gYXNzZXJ0KHVwZGF0ZWRSb3VuZCA8PSBHbG9iYWwucm91bmQsICdvcmFjbGUgcm91bmQgZnV0dXJlJykKICAgIGRpZyAyCiAgICBnbG9iYWwgUm91bmQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3JhY2xlIHJvdW5kIGZ1dHVyZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9vcmFjbGVfYWRhcHRlci5hbGdvLnRzOjc4CiAgICAvLyBjb25zdCBvcmFjbGVBZ2U6IHVpbnQ2NCA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgLSB1cGRhdGVkQXQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGRpZyA0CiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL29yYWNsZV9hZGFwdGVyLmFsZ28udHM6NzkKICAgIC8vIGFzc2VydChvcmFjbGVBZ2UgPD0gcHJvdG9jb2xGcmVzaG5lc3NXaW5kb3dTZWNvbmRzLCAnb3JhY2xlIHN0YWxlJykKICAgIGR1cAogICAgdW5jb3ZlciA3CiAgICA8PQogICAgYXNzZXJ0IC8vIG9yYWNsZSBzdGFsZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9vcmFjbGVfYWRhcHRlci5hbGdvLnRzOjgwCiAgICAvLyBhc3NlcnQob3JhY2xlQWdlIDw9IG1heEFnZVNlY29uZHMsICdvcmFjbGUgc3RhbGUnKQogICAgZGlnIDIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3JhY2xlIHN0YWxlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL29yYWNsZV9hZGFwdGVyLmFsZ28udHM6NTMtNTkKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIHByaWNlUGVyQWxnb01pY3JvU3RhYmxlOiBwcmljZSwKICAgIC8vICAgdXBkYXRlZEF0LAogICAgLy8gICB1cGRhdGVkUm91bmQsCiAgICAvLyAgIG1heEFnZVNlY29uZHMsCiAgICAvLyAgIHBhdXNlRmxhZ3MsCiAgICAvLyB9CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODMxCiAgICAvLyBwcmljZVBlckFsZ29NaWNyb1N0YWJsZTogb3JhY2xlLnByaWNlUGVyQWxnb01pY3JvU3RhYmxlLAogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODMyCiAgICAvLyB1cGRhdGVkQXQ6IG9yYWNsZS51cGRhdGVkQXQsCiAgICBkaWcgMQogICAgZXh0cmFjdCA4IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjgzMwogICAgLy8gdXBkYXRlZFJvdW5kOiBvcmFjbGUudXBkYXRlZFJvdW5kLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMTYgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODM0CiAgICAvLyBtYXhBZ2VTZWNvbmRzOiBvcmFjbGUubWF4QWdlU2Vjb25kcywKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdCAyNCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4MzAtODM1CiAgICAvLyByZXR1cm4gewogICAgLy8gICBwcmljZVBlckFsZ29NaWNyb1N0YWJsZTogb3JhY2xlLnByaWNlUGVyQWxnb01pY3JvU3RhYmxlLAogICAgLy8gICB1cGRhdGVkQXQ6IG9yYWNsZS51cGRhdGVkQXQsCiAgICAvLyAgIHVwZGF0ZWRSb3VuZDogb3JhY2xlLnVwZGF0ZWRSb3VuZCwKICAgIC8vICAgbWF4QWdlU2Vjb25kczogb3JhY2xlLm1heEFnZVNlY29uZHMsCiAgICAvLyB9CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo6Q29sbGF0ZXJhbFhQcm90b2NvbE1hbmFnZXIucmVhZFN0YWJsZWNvaW5TbmFwc2hvdCgpIC0+IGJ5dGVzOgpyZWFkU3RhYmxlY29pblNuYXBzaG90OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODM5CiAgICAvLyBhc3NlcnQodGhpcy5zdGFibGVjb2luQXBwSWQudmFsdWUgPiBVaW50NjQoMCksICdzdGFibGVjb2luIGFwcCByZXF1aXJlZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjE5CiAgICAvLyBzdGFibGVjb2luQXBwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnc2FwcCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyA0IC8vICJzYXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODM5CiAgICAvLyBhc3NlcnQodGhpcy5zdGFibGVjb2luQXBwSWQudmFsdWUgPiBVaW50NjQoMCksICdzdGFibGVjb2luIGFwcCByZXF1aXJlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gc3RhYmxlY29pbiBhcHAgcmVxdWlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg0MgogICAgLy8gY29uc3QgW3N0YWJsZUFzc2V0SWQsIHN0YWJsZUFzc2V0RXhpc3RzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NChzdGFibGVjb2luQXBwLCBCeXRlcygnYXNhJykpCiAgICBkdXAKICAgIHB1c2hieXRlcyAiYXNhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg0MwogICAgLy8gY29uc3QgW2lzc3VlZFN1cHBseSwgaXNzdWVkU3VwcGx5RXhpc3RzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NChzdGFibGVjb2luQXBwLCBCeXRlcygnc3VwcGx5JykpCiAgICBkaWcgMgogICAgcHVzaGJ5dGVzICJzdXBwbHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODQ0CiAgICAvLyBjb25zdCBbc3VwcGx5Q2VpbGluZywgc3VwcGx5Q2VpbGluZ0V4aXN0c10gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQoc3RhYmxlY29pbkFwcCwgQnl0ZXMoJ2NlaWwnKSkKICAgIHVuY292ZXIgNAogICAgcHVzaGJ5dGVzICJjZWlsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg0NgogICAgLy8gYXNzZXJ0KHN0YWJsZUFzc2V0RXhpc3RzLCAnc3RhYmxlIGFzc2V0IG1pc3NpbmcnKQogICAgdW5jb3ZlciA0CiAgICBhc3NlcnQgLy8gc3RhYmxlIGFzc2V0IG1pc3NpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg0NwogICAgLy8gYXNzZXJ0KGlzc3VlZFN1cHBseUV4aXN0cywgJ3N0YWJsZSBzdXBwbHkgbWlzc2luZycpCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBzdGFibGUgc3VwcGx5IG1pc3NpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg0OAogICAgLy8gYXNzZXJ0KHN1cHBseUNlaWxpbmdFeGlzdHMsICdzdGFibGUgY2VpbGluZyBtaXNzaW5nJykKICAgIGFzc2VydCAvLyBzdGFibGUgY2VpbGluZyBtaXNzaW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4NDkKICAgIC8vIGFzc2VydChzdGFibGVBc3NldElkID4gVWludDY0KDApLCAnc3RhYmxlIGFzc2V0IHJlcXVpcmVkJykKICAgIGRpZyAyCiAgICBhc3NlcnQgLy8gc3RhYmxlIGFzc2V0IHJlcXVpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4NTAKICAgIC8vIGFzc2VydChzdXBwbHlDZWlsaW5nID4gVWludDY0KDApLCAnc3RhYmxlIGNlaWxpbmcgcmVxdWlyZWQnKQogICAgZHVwCiAgICBhc3NlcnQgLy8gc3RhYmxlIGNlaWxpbmcgcmVxdWlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg1Mi04NTYKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIHN0YWJsZUFzc2V0SWQsCiAgICAvLyAgIGlzc3VlZFN1cHBseU1pY3JvU3RhYmxlOiBpc3N1ZWRTdXBwbHksCiAgICAvLyAgIHN1cHBseUNlaWxpbmdNaWNyb1N0YWJsZTogc3VwcGx5Q2VpbGluZywKICAgIC8vIH0KICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6OkNvbGxhdGVyYWxYUHJvdG9jb2xNYW5hZ2VyLmNhbGN1bGF0ZUF2YWlsYWJsZVRvTWludCh2YXVsdDogYnl0ZXMsIHByaWNlUGVyQWxnb01pY3JvU3RhYmxlOiB1aW50NjQsIHN0YWJsZWNvaW46IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzLCBieXRlczoKY2FsY3VsYXRlQXZhaWxhYmxlVG9NaW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODU5LTg2MwogICAgLy8gcHJpdmF0ZSBjYWxjdWxhdGVBdmFpbGFibGVUb01pbnQoCiAgICAvLyAgIHZhdWx0OiBWYXVsdFJlY29yZCwKICAgIC8vICAgcHJpY2VQZXJBbGdvTWljcm9TdGFibGU6IHVpbnQ2NCwKICAgIC8vICAgc3RhYmxlY29pbjogU3RhYmxlY29pblNuYXBzaG90CiAgICAvLyApOiB1aW50NjQgewogICAgcHJvdG8gMyAzCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gNQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODY1CiAgICAvLyB2YXVsdC5jb2xsYXRlcmFsTWljcm9BbGdvLAogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDQwIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg2NgogICAgLy8gdmF1bHQuZGVidE1pY3JvU3RhYmxlLAogICAgZnJhbWVfZGlnIC0zCiAgICBwdXNoaW50IDQ4IC8vIDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg2OAogICAgLy8gdGhpcy5taW5Db2xsYXRlcmFsUmF0aW9CcHMudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA5CiAgICAvLyBtaW5Db2xsYXRlcmFsUmF0aW9CcHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbWNyJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDUgLy8gIm1jciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg2OAogICAgLy8gdGhpcy5taW5Db2xsYXRlcmFsUmF0aW9CcHMudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODY5CiAgICAvLyB0aGlzLnZhdWx0TWludENhcE1pY3JvU3RhYmxlLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjIxNAogICAgLy8gdmF1bHRNaW50Q2FwTWljcm9TdGFibGUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndm1jcCcsIGluaXRpYWxWYWx1ZTogVWludDY0KDApIH0pCiAgICBieXRlYyAxMyAvLyAidm1jcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg2OQogICAgLy8gdGhpcy52YXVsdE1pbnRDYXBNaWNyb1N0YWJsZS52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciA0CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4NzAKICAgIC8vIHRoaXMudG90YWxEZWJ0TWljcm9TdGFibGUudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjA2CiAgICAvLyB0b3RhbERlYnRNaWNyb1N0YWJsZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd0ZGJ0JywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjXzAgLy8gInRkYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4NzAKICAgIC8vIHRoaXMudG90YWxEZWJ0TWljcm9TdGFibGUudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgNAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODcxCiAgICAvLyB0aGlzLnByb3RvY29sRGVidENlaWxpbmdNaWNyb1N0YWJsZS52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTUKICAgIC8vIHByb3RvY29sRGVidENlaWxpbmdNaWNyb1N0YWJsZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwZGMnLCBpbml0aWFsVmFsdWU6IFVpbnQ2NCgwKSB9KQogICAgYnl0ZWMgMTQgLy8gInBkYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg3MQogICAgLy8gdGhpcy5wcm90b2NvbERlYnRDZWlsaW5nTWljcm9TdGFibGUudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgNAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODcyCiAgICAvLyBzdGFibGVjb2luLmlzc3VlZFN1cHBseU1pY3JvU3RhYmxlLAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjg3MwogICAgLy8gc3RhYmxlY29pbi5zdXBwbHlDZWlsaW5nTWljcm9TdGFibGUKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjUxCiAgICAvLyBhc3NlcnQobWluQ29sbGF0ZXJhbFJhdGlvQnBzID49IEJQU19ERU5PTUlOQVRPUiwgJ21pbiByYXRpbyB0b28gbG93JykKICAgIGR1cAogICAgaW50Y18zIC8vIDEwMDAwCiAgICA+PQogICAgYXNzZXJ0IC8vIG1pbiByYXRpbyB0b28gbG93CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo0MgogICAgLy8gYXNzZXJ0KHByaWNlUGVyQWxnb01pY3JvU3RhYmxlID4gVWludDY0KDApLCAnb3JhY2xlIHByaWNlIHJlcXVpcmVkJykKICAgIGZyYW1lX2RpZyAtMgogICAgYXNzZXJ0IC8vIG9yYWNsZSBwcmljZSByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6NDMKICAgIC8vIHJldHVybiBiaWdUb1VpbnQ2NCgoQmlnVWludChjb2xsYXRlcmFsTWljcm9BbGdvKSAqIEJpZ1VpbnQocHJpY2VQZXJBbGdvTWljcm9TdGFibGUpKSAvIEJpZ1VpbnQoTUlDUk9fVU5JVCkpCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgYioKICAgIGJ5dGVjIDIzIC8vIDB4MGY0MjQwCiAgICBiLwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MTUKICAgIC8vIGFzc2VydCh2YWx1ZSA8PSBCaWdVaW50KFVpbnQ2NC5NQVhfVkFMVUUpLCAndWludDY0IG92ZXJmbG93JykKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAweGZmZmZmZmZmZmZmZmZmZmYKICAgIGI8PQogICAgYXNzZXJ0IC8vIHVpbnQ2NCBvdmVyZmxvdwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MTYKICAgIC8vIHJldHVybiBvcC5idG9pKEJ5dGVzKHZhbHVlKSkKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjUyCiAgICAvLyBjb25zdCBjb2xsYXRlcmFsVmFsdWUgPSBCaWdVaW50KGNvbGxhdGVyYWxWYWx1ZU1pY3JvU3RhYmxlKGNvbGxhdGVyYWxNaWNyb0FsZ28sIHByaWNlUGVyQWxnb01pY3JvU3RhYmxlKSkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjUzCiAgICAvLyByZXR1cm4gYmlnVG9VaW50NjQoKGNvbGxhdGVyYWxWYWx1ZSAqIEJpZ1VpbnQoQlBTX0RFTk9NSU5BVE9SKSkgLyBCaWdVaW50KG1pbkNvbGxhdGVyYWxSYXRpb0JwcykpCiAgICBieXRlYyAyMiAvLyAweDI3MTAKICAgIGIqCiAgICBzd2FwCiAgICBpdG9iCiAgICBiLwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MTUKICAgIC8vIGFzc2VydCh2YWx1ZSA8PSBCaWdVaW50KFVpbnQ2NC5NQVhfVkFMVUUpLCAndWludDY0IG92ZXJmbG93JykKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAweGZmZmZmZmZmZmZmZmZmZmYKICAgIGI8PQogICAgYXNzZXJ0IC8vIHVpbnQ2NCBvdmVyZmxvdwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MTYKICAgIC8vIHJldHVybiBvcC5idG9pKEJ5dGVzKHZhbHVlKSkKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MTE4CiAgICAvLyBpZiAodXNlZCA+PSBjYXApIHsKICAgID49CiAgICBieiBjYWxjdWxhdGVBdmFpbGFibGVUb01pbnRfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxMTkKICAgIC8vIHJldHVybiBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKCmNhbGN1bGF0ZUF2YWlsYWJsZVRvTWludF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjpyZW1haW5pbmdDYXBhY2l0eUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MTE4CiAgICAvLyBpZiAodXNlZCA+PSBjYXApIHsKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNwogICAgPj0KICAgIGJ6IGNhbGN1bGF0ZUF2YWlsYWJsZVRvTWludF9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxMTkKICAgIC8vIHJldHVybiBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUKCmNhbGN1bGF0ZUF2YWlsYWJsZVRvTWludF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjpyZW1haW5pbmdDYXBhY2l0eUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjExOAogICAgLy8gaWYgKHVzZWQgPj0gY2FwKSB7CiAgICBmcmFtZV9kaWcgOAogICAgZnJhbWVfZGlnIDkKICAgID49CiAgICBieiBjYWxjdWxhdGVBdmFpbGFibGVUb01pbnRfYWZ0ZXJfaWZfZWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MTE5CiAgICAvLyByZXR1cm4gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAyCgpjYWxjdWxhdGVBdmFpbGFibGVUb01pbnRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo6cmVtYWluaW5nQ2FwYWNpdHlAMTY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxMTgKICAgIC8vIGlmICh1c2VkID49IGNhcCkgewogICAgZnJhbWVfZGlnIDEwCiAgICBmcmFtZV9kaWcgMTEKICAgID49CiAgICBieiBjYWxjdWxhdGVBdmFpbGFibGVUb01pbnRfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MTE5CiAgICAvLyByZXR1cm4gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpjYWxjdWxhdGVBdmFpbGFibGVUb01pbnRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo6cmVtYWluaW5nQ2FwYWNpdHlAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxMjUKICAgIC8vIGlmIChsZWZ0IDw9IHJpZ2h0KSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDUKICAgIDw9CiAgICBieiBjYWxjdWxhdGVBdmFpbGFibGVUb01pbnRfYWZ0ZXJfaWZfZWxzZUAyMwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMQoKY2FsY3VsYXRlQXZhaWxhYmxlVG9NaW50X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6Om1pblVpbnQ2NEAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjEyNQogICAgLy8gaWYgKGxlZnQgPD0gcmlnaHQpIHsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgNAogICAgPD0KICAgIGJ6IGNhbGN1bGF0ZUF2YWlsYWJsZVRvTWludF9hZnRlcl9pZl9lbHNlQDI3CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAzCgpjYWxjdWxhdGVBdmFpbGFibGVUb01pbnRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo6bWluVWludDY0QDI4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MTI1CiAgICAvLyBpZiAobGVmdCA8PSByaWdodCkgewogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAzCiAgICA8PQogICAgYnogY2FsY3VsYXRlQXZhaWxhYmxlVG9NaW50X2FmdGVyX2lmX2Vsc2VAMzEKICAgIGZyYW1lX2RpZyAxCgpjYWxjdWxhdGVBdmFpbGFibGVUb01pbnRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo6bWluVWludDY0QDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODY0LTg3NAogICAgLy8gcmV0dXJuIGF2YWlsYWJsZVRvTWludE1pY3JvU3RhYmxlKAogICAgLy8gICB2YXVsdC5jb2xsYXRlcmFsTWljcm9BbGdvLAogICAgLy8gICB2YXVsdC5kZWJ0TWljcm9TdGFibGUsCiAgICAvLyAgIHByaWNlUGVyQWxnb01pY3JvU3RhYmxlLAogICAgLy8gICB0aGlzLm1pbkNvbGxhdGVyYWxSYXRpb0Jwcy52YWx1ZSwKICAgIC8vICAgdGhpcy52YXVsdE1pbnRDYXBNaWNyb1N0YWJsZS52YWx1ZSwKICAgIC8vICAgdGhpcy50b3RhbERlYnRNaWNyb1N0YWJsZS52YWx1ZSwKICAgIC8vICAgdGhpcy5wcm90b2NvbERlYnRDZWlsaW5nTWljcm9TdGFibGUudmFsdWUsCiAgICAvLyAgIHN0YWJsZWNvaW4uaXNzdWVkU3VwcGx5TWljcm9TdGFibGUsCiAgICAvLyAgIHN0YWJsZWNvaW4uc3VwcGx5Q2VpbGluZ01pY3JvU3RhYmxlCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpjYWxjdWxhdGVBdmFpbGFibGVUb01pbnRfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIGZyYW1lX2RpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxNTAKICAgIC8vIHJldHVybiBtaW5VaW50NjQobWluVWludDY0KGNvbGxhdGVyYWxDYXBhY2l0eSwgdmF1bHRDYXBhY2l0eSksIG1pblVpbnQ2NChwcm90b2NvbENhcGFjaXR5LCBzdGFibGVjb2luQ2FwYWNpdHkpKQogICAgYiBjYWxjdWxhdGVBdmFpbGFibGVUb01pbnRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo6bWluVWludDY0QDMyCgpjYWxjdWxhdGVBdmFpbGFibGVUb01pbnRfYWZ0ZXJfaWZfZWxzZUAyNzoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjE1MAogICAgLy8gcmV0dXJuIG1pblVpbnQ2NChtaW5VaW50NjQoY29sbGF0ZXJhbENhcGFjaXR5LCB2YXVsdENhcGFjaXR5KSwgbWluVWludDY0KHByb3RvY29sQ2FwYWNpdHksIHN0YWJsZWNvaW5DYXBhY2l0eSkpCiAgICBiIGNhbGN1bGF0ZUF2YWlsYWJsZVRvTWludF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjptaW5VaW50NjRAMjgKCmNhbGN1bGF0ZUF2YWlsYWJsZVRvTWludF9hZnRlcl9pZl9lbHNlQDIzOgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MTUwCiAgICAvLyByZXR1cm4gbWluVWludDY0KG1pblVpbnQ2NChjb2xsYXRlcmFsQ2FwYWNpdHksIHZhdWx0Q2FwYWNpdHkpLCBtaW5VaW50NjQocHJvdG9jb2xDYXBhY2l0eSwgc3RhYmxlY29pbkNhcGFjaXR5KSkKICAgIGIgY2FsY3VsYXRlQXZhaWxhYmxlVG9NaW50X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6Om1pblVpbnQ2NEAyNAoKY2FsY3VsYXRlQXZhaWxhYmxlVG9NaW50X2FmdGVyX2lmX2Vsc2VAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxMjEKICAgIC8vIHJldHVybiBjYXAgLSB1c2VkCiAgICBmcmFtZV9kaWcgMTEKICAgIGZyYW1lX2RpZyAxMAogICAgLQogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxNDgKICAgIC8vIGNvbnN0IHN0YWJsZWNvaW5DYXBhY2l0eSA9IHJlbWFpbmluZ0NhcGFjaXR5KHN1cHBseUNlaWxpbmdNaWNyb1N0YWJsZSwgaXNzdWVkU3VwcGx5TWljcm9TdGFibGUpCiAgICBiIGNhbGN1bGF0ZUF2YWlsYWJsZVRvTWludF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjpyZW1haW5pbmdDYXBhY2l0eUAyMAoKY2FsY3VsYXRlQXZhaWxhYmxlVG9NaW50X2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxMjEKICAgIC8vIHJldHVybiBjYXAgLSB1c2VkCiAgICBmcmFtZV9kaWcgOQogICAgZnJhbWVfZGlnIDgKICAgIC0KICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBwcm90b2NvbENhcGFjaXR5ID0gcmVtYWluaW5nQ2FwYWNpdHkocHJvdG9jb2xEZWJ0Q2VpbGluZ01pY3JvU3RhYmxlLCB0b3RhbERlYnRNaWNyb1N0YWJsZSkKICAgIGIgY2FsY3VsYXRlQXZhaWxhYmxlVG9NaW50X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6OnJlbWFpbmluZ0NhcGFjaXR5QDE2CgpjYWxjdWxhdGVBdmFpbGFibGVUb01pbnRfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjEyMQogICAgLy8gcmV0dXJuIGNhcCAtIHVzZWQKICAgIGZyYW1lX2RpZyA3CiAgICBmcmFtZV9kaWcgNgogICAgLQogICAgZnJhbWVfYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czoxNDYKICAgIC8vIGNvbnN0IHZhdWx0Q2FwYWNpdHkgPSByZW1haW5pbmdDYXBhY2l0eSh2YXVsdE1pbnRDYXBNaWNyb1N0YWJsZSwgZXhpc3RpbmdEZWJ0TWljcm9TdGFibGUpCiAgICBiIGNhbGN1bGF0ZUF2YWlsYWJsZVRvTWludF9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjpyZW1haW5pbmdDYXBhY2l0eUAxMgoKY2FsY3VsYXRlQXZhaWxhYmxlVG9NaW50X2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9zaGFyZWQvcmlzay5hbGdvLnRzOjEyMQogICAgLy8gcmV0dXJuIGNhcCAtIHVzZWQKICAgIGZyYW1lX2RpZyAxMgogICAgZnJhbWVfZGlnIDYKICAgIC0KICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3NoYXJlZC9yaXNrLmFsZ28udHM6MTQyLTE0NQogICAgLy8gY29uc3QgY29sbGF0ZXJhbENhcGFjaXR5ID0gcmVtYWluaW5nQ2FwYWNpdHkoCiAgICAvLyAgIG1heERlYnRGb3JDb2xsYXRlcmFsKGNvbGxhdGVyYWxNaWNyb0FsZ28sIHByaWNlUGVyQWxnb01pY3JvU3RhYmxlLCBtaW5Db2xsYXRlcmFsUmF0aW9CcHMpLAogICAgLy8gICBleGlzdGluZ0RlYnRNaWNyb1N0YWJsZQogICAgLy8gKQogICAgYiBjYWxjdWxhdGVBdmFpbGFibGVUb01pbnRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfc2hhcmVkL3Jpc2suYWxnby50czo6cmVtYWluaW5nQ2FwYWNpdHlAOAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjpDb2xsYXRlcmFsWFByb3RvY29sTWFuYWdlci5jYWxsU3RhYmxlY29pbkJ1cm4odmF1bHRJZDogdWludDY0LCBhbW91bnRNaWNyb1N0YWJsZTogdWludDY0KSAtPiB2b2lkOgpjYWxsU3RhYmxlY29pbkJ1cm46CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4OTYKICAgIC8vIHByaXZhdGUgY2FsbFN0YWJsZWNvaW5CdXJuKHZhdWx0SWQ6IHVpbnQ2NCwgYW1vdW50TWljcm9TdGFibGU6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4OTcKICAgIC8vIGNvbnN0IHN0YWJsZWNvaW5BcHAgPSBBcHBsaWNhdGlvbih0aGlzLnN0YWJsZWNvaW5BcHBJZC52YWx1ZSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMTkKICAgIC8vIHN0YWJsZWNvaW5BcHBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdzYXBwJywgaW5pdGlhbFZhbHVlOiBVaW50NjQoMCkgfSkKICAgIGJ5dGVjIDQgLy8gInNhcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4OTcKICAgIC8vIGNvbnN0IHN0YWJsZWNvaW5BcHAgPSBBcHBsaWNhdGlvbih0aGlzLnN0YWJsZWNvaW5BcHBJZC52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo4OTgtOTA4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcElkOiBzdGFibGVjb2luQXBwLAogICAgLy8gICAgIGZlZTogVWludDY0KDApLAogICAgLy8gICAgIGFwcEFyZ3M6IFsKICAgIC8vICAgICAgIG1ldGhvZFNlbGVjdG9yKCdidXJuRm9yVmF1bHQodWludDY0LHVpbnQ2NCl2b2lkJyksCiAgICAvLyAgICAgICBuZXcgQXJjNFVpbnQ8NjQ+KHZhdWx0SWQpLmJ5dGVzLAogICAgLy8gICAgICAgbmV3IEFyYzRVaW50PDY0PihhbW91bnRNaWNyb1N0YWJsZSkuYnl0ZXMsCiAgICAvLyAgICAgXSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo5MDQKICAgIC8vIG5ldyBBcmM0VWludDw2ND4odmF1bHRJZCkuYnl0ZXMsCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjkwNQogICAgLy8gbmV3IEFyYzRVaW50PDY0PihhbW91bnRNaWNyb1N0YWJsZSkuYnl0ZXMsCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjkwMwogICAgLy8gbWV0aG9kU2VsZWN0b3IoJ2J1cm5Gb3JWYXVsdCh1aW50NjQsdWludDY0KXZvaWQnKSwKICAgIHB1c2hieXRlcyAweDRkMDZjMDQ5IC8vIG1ldGhvZCAiYnVybkZvclZhdWx0KHVpbnQ2NCx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODk4LTkwNwogICAgLy8gaXR4bgogICAgLy8gICAuYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICBhcHBJZDogc3RhYmxlY29pbkFwcCwKICAgIC8vICAgICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vICAgICBhcHBBcmdzOiBbCiAgICAvLyAgICAgICBtZXRob2RTZWxlY3RvcignYnVybkZvclZhdWx0KHVpbnQ2NCx1aW50NjQpdm9pZCcpLAogICAgLy8gICAgICAgbmV3IEFyYzRVaW50PDY0Pih2YXVsdElkKS5ieXRlcywKICAgIC8vICAgICAgIG5ldyBBcmM0VWludDw2ND4oYW1vdW50TWljcm9TdGFibGUpLmJ5dGVzLAogICAgLy8gICAgIF0sCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDYgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6OTAxCiAgICAvLyBmZWU6IFVpbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6ODk4LTkwOAogICAgLy8gaXR4bgogICAgLy8gICAuYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICBhcHBJZDogc3RhYmxlY29pbkFwcCwKICAgIC8vICAgICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vICAgICBhcHBBcmdzOiBbCiAgICAvLyAgICAgICBtZXRob2RTZWxlY3RvcignYnVybkZvclZhdWx0KHVpbnQ2NCx1aW50NjQpdm9pZCcpLAogICAgLy8gICAgICAgbmV3IEFyYzRVaW50PDY0Pih2YXVsdElkKS5ieXRlcywKICAgIC8vICAgICAgIG5ldyBBcmM0VWludDw2ND4oYW1vdW50TWljcm9TdGFibGUpLmJ5dGVzLAogICAgLy8gICAgIF0sCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjpDb2xsYXRlcmFsWFByb3RvY29sTWFuYWdlci5wYXlDb2xsYXRlcmFsKHJlY2VpdmVyOiBieXRlcywgYW1vdW50TWljcm9BbGdvOiB1aW50NjQpIC0+IHZvaWQ6CnBheUNvbGxhdGVyYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo5MTEKICAgIC8vIHByaXZhdGUgcGF5Q29sbGF0ZXJhbChyZWNlaXZlcjogQWNjb3VudCwgYW1vdW50TWljcm9BbGdvOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6OTEyLTkxOAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXIsCiAgICAvLyAgICAgYW1vdW50OiBhbW91bnRNaWNyb0FsZ28sCiAgICAvLyAgICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo5MTItOTE3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlciwKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudE1pY3JvQWxnbywKICAgIC8vICAgICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo5MTYKICAgIC8vIGZlZTogVWludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo5MTItOTE4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlciwKICAgIC8vICAgICBhbW91bnQ6IGFtb3VudE1pY3JvQWxnbywKICAgIC8vICAgICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6OkNvbGxhdGVyYWxYUHJvdG9jb2xNYW5hZ2VyLmRlbGV0ZVZhdWx0Qm94ZXModmF1bHQ6IGJ5dGVzKSAtPiBieXRlczoKZGVsZXRlVmF1bHRCb3hlczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjkyMQogICAgLy8gcHJpdmF0ZSBkZWxldGVWYXVsdEJveGVzKHZhdWx0OiBWYXVsdFJlY29yZCk6IHZvaWQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo5MjIKICAgIC8vIGFzc2VydCh0aGlzLnZhdWx0cyh2YXVsdC5pZCkuZGVsZXRlKCksICd2YXVsdCBjbGVhbnVwIG1pc3NpbmcnKQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDAgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6MjIyCiAgICAvLyB2YXVsdHMgPSBCb3hNYXA8dWludDY0LCBWYXVsdFJlY29yZD4oeyBrZXlQcmVmaXg6ICd2JyB9KQogICAgYnl0ZWNfMiAvLyAidiIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjkyMgogICAgLy8gYXNzZXJ0KHRoaXMudmF1bHRzKHZhdWx0LmlkKS5kZWxldGUoKSwgJ3ZhdWx0IGNsZWFudXAgbWlzc2luZycpCiAgICBib3hfZGVsCiAgICBhc3NlcnQgLy8gdmF1bHQgY2xlYW51cCBtaXNzaW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo5MjMKICAgIC8vIGFzc2VydCh0aGlzLm93bmVyVmF1bHRzKHsgb3duZXI6IHZhdWx0Lm93bmVyLCB2YXVsdElkOiB2YXVsdC5pZCB9KS5kZWxldGUoKSwgJ293bmVyIGluZGV4IGNsZWFudXAgbWlzc2luZycpCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgOCAzMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czoyMjMKICAgIC8vIG93bmVyVmF1bHRzID0gQm94TWFwPE93bmVyVmF1bHRJbmRleEtleSwgdWludDY0Pih7IGtleVByZWZpeDogJ28nIH0pCiAgICBwdXNoYnl0ZXMgIm8iCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjkyMwogICAgLy8gYXNzZXJ0KHRoaXMub3duZXJWYXVsdHMoeyBvd25lcjogdmF1bHQub3duZXIsIHZhdWx0SWQ6IHZhdWx0LmlkIH0pLmRlbGV0ZSgpLCAnb3duZXIgaW5kZXggY2xlYW51cCBtaXNzaW5nJykKICAgIGJveF9kZWwKICAgIGFzc2VydCAvLyBvd25lciBpbmRleCBjbGVhbnVwIG1pc3NpbmcKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6OkNvbGxhdGVyYWxYUHJvdG9jb2xNYW5hZ2VyLnZhbGlkYXRlUGFyYW1zKG1pbkNvbGxhdGVyYWxSYXRpb0JwczogdWludDY0LCBsaXF1aWRhdGlvblJhdGlvQnBzOiB1aW50NjQsIGxpcXVpZGF0aW9uUGVuYWx0eUJwczogdWludDY0LCBsaXF1aWRhdGlvbkJvbnVzQnBzOiB1aW50NjQsIG9yYWNsZUZyZXNobmVzc1dpbmRvd1NlY29uZHM6IHVpbnQ2NCwgdmF1bHRNaW50Q2FwTWljcm9TdGFibGU6IHVpbnQ2NCwgcHJvdG9jb2xEZWJ0Q2VpbGluZ01pY3JvU3RhYmxlOiB1aW50NjQsIG1pbkRlYnRGbG9vck1pY3JvU3RhYmxlOiB1aW50NjQpIC0+IHZvaWQ6CnZhbGlkYXRlUGFyYW1zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6OTI2LTkzNQogICAgLy8gcHJpdmF0ZSB2YWxpZGF0ZVBhcmFtcygKICAgIC8vICAgbWluQ29sbGF0ZXJhbFJhdGlvQnBzOiB1aW50NjQsCiAgICAvLyAgIGxpcXVpZGF0aW9uUmF0aW9CcHM6IHVpbnQ2NCwKICAgIC8vICAgbGlxdWlkYXRpb25QZW5hbHR5QnBzOiB1aW50NjQsCiAgICAvLyAgIGxpcXVpZGF0aW9uQm9udXNCcHM6IHVpbnQ2NCwKICAgIC8vICAgb3JhY2xlRnJlc2huZXNzV2luZG93U2Vjb25kczogdWludDY0LAogICAgLy8gICB2YXVsdE1pbnRDYXBNaWNyb1N0YWJsZTogdWludDY0LAogICAgLy8gICBwcm90b2NvbERlYnRDZWlsaW5nTWljcm9TdGFibGU6IHVpbnQ2NCwKICAgIC8vICAgbWluRGVidEZsb29yTWljcm9TdGFibGU6IHVpbnQ2NAogICAgLy8gKTogdm9pZCB7CiAgICBwcm90byA4IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjkzNgogICAgLy8gYXNzZXJ0KG1pbkNvbGxhdGVyYWxSYXRpb0JwcyA+PSBCUFNfREVOT01JTkFUT1IsICdtaW4gcmF0aW8gdG9vIGxvdycpCiAgICBmcmFtZV9kaWcgLTgKICAgIGludGNfMyAvLyAxMDAwMAogICAgPj0KICAgIGFzc2VydCAvLyBtaW4gcmF0aW8gdG9vIGxvdwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6OTM3CiAgICAvLyBhc3NlcnQobGlxdWlkYXRpb25SYXRpb0JwcyA+PSBCUFNfREVOT01JTkFUT1IsICdsaXF1aWRhdGlvbiByYXRpbyB0b28gbG93JykKICAgIGZyYW1lX2RpZyAtNwogICAgaW50Y18zIC8vIDEwMDAwCiAgICA+PQogICAgYXNzZXJ0IC8vIGxpcXVpZGF0aW9uIHJhdGlvIHRvbyBsb3cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjkzOAogICAgLy8gYXNzZXJ0KGxpcXVpZGF0aW9uUmF0aW9CcHMgPD0gbWluQ29sbGF0ZXJhbFJhdGlvQnBzLCAnbGlxdWlkYXRpb24gcmF0aW8gYWJvdmUgbWluJykKICAgIGZyYW1lX2RpZyAtNwogICAgZnJhbWVfZGlnIC04CiAgICA8PQogICAgYXNzZXJ0IC8vIGxpcXVpZGF0aW9uIHJhdGlvIGFib3ZlIG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6OTM5CiAgICAvLyBhc3NlcnQobGlxdWlkYXRpb25QZW5hbHR5QnBzIDw9IE1BWF9CUFMsICdwZW5hbHR5IHRvbyBoaWdoJykKICAgIGZyYW1lX2RpZyAtNgogICAgaW50YyA0IC8vIDEwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBwZW5hbHR5IHRvbyBoaWdoCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29sbGF0ZXJhbHhfcHJvdG9jb2wvY29udHJhY3QuYWxnby50czo5NDAKICAgIC8vIGFzc2VydChsaXF1aWRhdGlvbkJvbnVzQnBzIDw9IE1BWF9CUFMsICdib251cyB0b28gaGlnaCcpCiAgICBmcmFtZV9kaWcgLTUKICAgIGludGMgNCAvLyAxMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gYm9udXMgdG9vIGhpZ2gKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjk0MQogICAgLy8gYXNzZXJ0KG9yYWNsZUZyZXNobmVzc1dpbmRvd1NlY29uZHMgPiBVaW50NjQoMCksICdvcmFjbGUgd2luZG93IHJlcXVpcmVkJykKICAgIGZyYW1lX2RpZyAtNAogICAgYXNzZXJ0IC8vIG9yYWNsZSB3aW5kb3cgcmVxdWlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjk0MgogICAgLy8gYXNzZXJ0KHZhdWx0TWludENhcE1pY3JvU3RhYmxlID4gVWludDY0KDApLCAndmF1bHQgY2FwIHJlcXVpcmVkJykKICAgIGZyYW1lX2RpZyAtMwogICAgYXNzZXJ0IC8vIHZhdWx0IGNhcCByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbGxhdGVyYWx4X3Byb3RvY29sL2NvbnRyYWN0LmFsZ28udHM6OTQzCiAgICAvLyBhc3NlcnQocHJvdG9jb2xEZWJ0Q2VpbGluZ01pY3JvU3RhYmxlID49IHZhdWx0TWludENhcE1pY3JvU3RhYmxlLCAnY2VpbGluZyBiZWxvdyB2YXVsdCBjYXAnKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTMKICAgID49CiAgICBhc3NlcnQgLy8gY2VpbGluZyBiZWxvdyB2YXVsdCBjYXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb2xsYXRlcmFseF9wcm90b2NvbC9jb250cmFjdC5hbGdvLnRzOjk0NAogICAgLy8gYXNzZXJ0KG1pbkRlYnRGbG9vck1pY3JvU3RhYmxlIDw9IHZhdWx0TWludENhcE1pY3JvU3RhYmxlLCAnZGVidCBmbG9vciB0b28gaGlnaCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAtMwogICAgPD0KICAgIGFzc2VydCAvLyBkZWJ0IGZsb29yIHRvbyBoaWdoCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAFAAEIkE6gjQYmGgR0ZGJ0CP//////////AXYEdGNvbARzYXBwA21jcgRkZmxvBBUffHUEaW5pdANscXIDbHBuA2xibgNvZncEdm1jcANwZGMEcGZsZwRvYXBwA2FkbQRudmlkBHZjbnQEcGZlZQRsYXBwAicQAw9CQASL7E2nAwaBATEYQABGJwgiZycSI2cnEyJnKCJnKyJnJxQiZycFImcnCSJnJwoiZycLImcnDCJnJw0iZycOImcnBiJnJw8iZycQImcnBCJnJxUiZzEZFEQxGEEAf4IRBGAUHysEaaGKTASYp11HBI+xXeMEsr23xgRcl5WKBEW6FbQEfrx+UQQIRzo7BPfNiYAEmexKBQRxKDstBLG45jEExZnWZgQXO0o0BAC7iOkEB7JxrTYaAI4RAJ0BewHvAgoCKAJWArwDCQOxA/kEHQRFBP0GAgb/CBQIjACABNMkvqQ2GgCOAQBxAIoEAYv+RIv/JQ9Ei/wWi/4WoycWo4v9FicXo4v/FqOniYoEAYv9RIv8FicXo4v+FqOL/RYnFqNMi/9BACmLAEmAAKVETElLAqJOAkyqgACoQQAHSSmmRBdMiYABAaBJKaZEF0L/8osAokkppkQXTIk2GgFJFYEgEkRJMgMTRCcRSwFngAQ9jHo6TFCwI0M2GgFJFSQSRBc2GgJJFSQSRBc2GgNJFSQSRBc2GgRJFSQSRBc2GgVJFSQSRBc2GgZJFSQSRBc2GgdJFSQSRBc2GghJFSQSRBc2GglJFSQSRBc2GgpJFSQSRBc2GgtJFSQSRBeICaEiJwhlRBRESwpLCksKSwpLCksKSwpLCogLxiIoZURLBQ5EJwVPC2cnCU8KZycKTwlnJwtPCGcnDE8HZycNTwZnJw5PBWcnBk8EZycQSwNnJwRLAmcnFUsBZycII2ciJxFlRE8DFlBPAhZQTBZQgARCAeF2TFCwI0OICR2BIIgJKyInEmVESRYqSwFQSb1FARREMgdLAjEAUCIWTEsBUExQTBZMSwFQSwFQIxZMSwFQSwFQTwNMvzEASwNQgAFvTFBMv08CIwgnEkxnIicTZUQjCCcTTGdLATEAUExQgATPjwVzTFCwJwdMULAjQzYaAUkVJBJEFxYqTFBJvUUBRL5IJwdMULAjQzYaAUkVJBJEFxYqTFC9RQGAAQAiTwJUJwdMULAjQzYaAUkVJBJEF4gIZxYqTFBJvUUBRL5IiAiCiAkaTCJbTIgJTEYCFicHTFCwI0MiJxFlRCInCGVEIicSZUQiJxNlRCIoZUQiK2VEIicUZUQiJw9lRCInEGVEIicEZUQiJxVlRE8JFk8KTFBPCRZQTwgWUE8HFlBPBhZQTwUWUE8EFlBPAxZQTwIWUEwWUCcHTFCwI0MiJwVlRCInCWVEIicKZUQiJwtlRCInDGVEIicNZUQiJw5lRCInBmVETwcWTwcWUE8GFlBPBRZQTwQWUE8DFlBPAhZQTBZQJwdMULAjQzYaAUkVJBJEFzYaAkkVJBJEFzYaA0kVJBJEFzYaBEkVJBJEFzYaBUkVJBJEFzYaBkkVJBJEFzYaB0kVJBJEFzYaCEkVJBJEF4gHR4gHTUsHSwdLB0sHSwdLB0sHSweICXkiKGVESwIORCcFSwhnJwlLB2cnCk8GZycLTwVnJwxPBGcnDU8DZycOSwJnJwZMZzEATwMWUE8CFlBMFlCABEvNIixMULAjQzYaAUkVJBJEFzYaAkkVJBJEFzYaA0kVJBJEF4gGzIgG0icQSwNnJwRLAmcnFUsBZzEATwMWUE8CFlBMFlCABPGbBi1MULAjQzYaAUkVJBJEF4gGlogGnCcPSwFnMQBMFlCABN1Z4mRMULAjQzYaAUkVgSASRIgGcogGeEkyAxNEJxFLAWcxAExQgARyp5ONTFCwI0MxFiMJSTgQIxJENhoBSRUkEkQXiAZAMgSBAhJESwE4FhREMRYjEkQjiAY+FipLAVBJvUUBREm+SEmBSFsjEkRJVwggMQASREsDOAAxABJESwM4BzIKEkRLAzggMgMSREsDOAkyAxJETwM4CElESwFXKAhMFkxLAaBJKaZEFyIrZUQWSwKgSSmmRBdMFk8DSwFcKDIHFlxATwRMvytLAmcxAE8ETFBPA1BMUEwWUIAEDVc9UUxQsCNDNhoBSRUkEkQXNhoCSRUkEkRJF4gFiDIEIxJEMRYURIECiAWNTwIWKksBUEm9RQFESwJESb5ISYFIWyMSRElXCCAxABJEiAV/iAYXTCJbTwJLAU8DiAZESwZPAw5ESwFXMAhPBhZMSwGgSSmmRBciKGVEFksCoEkppkQXIicGZURLAg5ESwSBKFsiJwVlRExLA08ITwOI+npETwMiWyInBGVEsUsFVwAISwZXCCBLAnIIRE8EsjBLAbIcshyABBD3ZHayGkyyGrIaTweyGrIYgQayECKyAbNMFk8DSwFcMDIHFlxATwRMvyhLAmcxAE8ETFBPA1BMUEwWUIAEtrAIoExQsCNDMRYjCUk4EIEEEkQ2GgFJFSQSRBdJTgKIBH8yBIECEkRLATgWFEQxFiMSRIEEiAR8FklOAipMUElOAkm9RQFEiAUbIicEZURMIltLAzgAMQASREsDOBRPAnIIRBJESwI4ERJESwE4IDIDEkRLATgVMgMSREw4EklOAklETL5MSU4CTgNESYFIWyMSRElXCCAxABJEgTBbSg5ESUsCD0RMCUkiJwZlTE4CREEATUoMQQBIIxREIihlRElLBUlOAw9ESwEJSwhLAogFvUsDFksFSwFcMDIHFlxASwhMvyhLAmdLCDEAUE8DFlBMUEwWUIAEPnrA5UxQsCNDIkL/tSJJgABJNhoBSRUkEkQXNhoCSRUkEkQXSU4CiAN/MgQjEkQxFhREJIgDhUwWSU4CKkxQSU4CSb1FAURLAUS+SElOAkmBSFsjEkRJVwggMQASREmBKFtLAksBDkRJSwMPRE8CCUyBMFtJQQAWiANXIlsiJwVlREsDSwNPA08DiPiQRCIrZURJSwdJTgMPREwJSUUJSwJJTgIWSUUNSwVMXCgyBxZcQEUFK0xnQABiSwKBMFtAAFojRQdLBkEASksCiAUDRQNLAlcIIEsGSU4CiATgSwUxAFBMFklFC1BLClBLCBZQgAR1vNl0TFCwSwZBABQxADIHSwZPAlBLClBMFlAnGExQsCNDSwNLA79C/7UiRQdC/6M2GgFJFSQSRBeIAnsyBCMSRDEWFEQkiAKBFkkqTFBJvUUBRL5ISYFIWyMSRElXCCAxABJESYEwWxRESYEoW0lOAiIrZURJSwIPREsBCStMZ0yIBFxMQQAJSVcIIEsCiAQ7MQAyB0sETwJQSwMWUEwWUCcYTFCwI0MiRwOAAEcKMRYjCUcCOBCBBBJENhoBSRUkEkQXTIgB7zIEgQISRDgWFEQxFiMSRIHaDzIMDUEAGLGBBrIQgQWyGScZsh4nGbIfIrIBs0L/34EQiAHNSRZJRRIqTFBJvUUBRIgCbky+TElOAkURREmBSFsjEkRJgTBbSUUGSUQiJwRlRE8DIltLBUk4ADEAEkRJOBRPA3IIRBJESTgRTwISREk4IDIDEkRJOBUyAxJEOBJLARJEiAGASUUTTwKBKFtFDyJbSUUJIicJZUxJTgJFEERMRCUPREABHSJEIicLZUQlFkwWoEkppkQXSwNJTgJLCUlOBE8CI4j2qUlOA0UIIicKZURMTgIiiPaYRQVLDQ9BANxLDEULSwxJSwxJTgMPREwJSUUHSwQOQQC+SwVLBklLAg9ESwEJRQkiKGVESUsFSU4DD0RLAQlJTgNFDCIrZURJSxFJTgMPREwJSUUOIicUZUQWTwMWSUUUoEkppkQXSxFJTgIiW08EiAJ/KE8EZytPA2cnFExniAKrRQ5LCkEABzEASwuIAolLB0EACksNVwggSwiIAnpLDUlXCCAxAE8CVzAISxJXEAhLFE8EUE8DUE8CUEsMFlBLEFBLCRZQSwgWUExQSwkWUEsKFlCABFAy0ttMULAjQ0sDQv8/SwRFC0L/IUsMFksHFqMnFqNLAxYnF6NLDRajpkL+zCInCGVEIxJEiTEAIicRZUQSRImKAQAiJw9lREmBQBpMi/8aTBREFESJIicQZURJRCInDGVESwGAAnB4ZUsDgAN1cGRlSwWABHVybmRlSweABG1heGFlTwknD2VPCERPBkRPBERPAkRESwRESwNESwJESwFESYECGhRESwMyBw5ESwIyBg5EMgdLBAlJTwcOREsCDkRPBBZPBBZQTwMWUE8CFlBMFlBJVwAISwFXCAhLAlcQCE8DVxgITwNPA1BPAlBMUIkiJwRlRElESYADYXNhZUsCgAZzdXBwbHllTwSABGNlaWxlTwRETwJEREsCRElETwIWTwIWUEwWUImKAwOAAEcFi/1XKAiL/YEwW0lPAiInBWVEIicNZUxOBEQiKGVMTgREIicOZUxOBESL/yRbTgOL/4EQW04DSSUPRIv+RIv+Fk8CoycXokkppkQXFicWo0wWokkppkQXSU4CD0EAgiKMAIsGiwcPQQBtIowFiwiLCQ9BAFgijAKLCosLD0EAQyKMBIsAiwUOQQAxiwCMAYsCiwQOQQAeiwKMA4sBiwMOQQANiwGL/Yv/jAKMAYwAiYsDQv/wiwSMA0L/34sFjAFC/8yLC4sKCYwEQv+2iwmLCAmMAkL/oYsHiwYJjAVC/4yLDIsGCYwAQv93igIAIicEZUSxi/4Wi/8WgARNBsBJshpMshqyGrIYgQayECKyAbOJigIAsYv/sgiL/rIHI7IQIrIBs4mKAQGL/1cACCpLAVC8RIv/VwggTFCAAW9MULxEi/+JiggAi/glD0SL+SUPRIv5i/gORIv6IQQORIv7IQQORIv8RIv9RIv+i/0PRIv/i/0ORIk=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [ { "name": "ProtocolAdminCreated", "args": [ { "type": "address", "name": "0" } ] }, { "name": "ProtocolInitializedEvent", "args": [ { "type": "address", "name": "admin" }, { "type": "uint64", "name": "oracleAppId" }, { "type": "uint64", "name": "stablecoinAppId" }, { "type": "uint64", "name": "liquidationAppId" } ] }, { "name": "VaultCreatedEvent", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "address", "name": "owner" }, { "type": "uint64", "name": "createdAt" } ] }, { "name": "ProtocolParamsUpdatedEvent", "args": [ { "type": "address", "name": "admin" }, { "type": "uint64", "name": "minCollateralRatioBps" }, { "type": "uint64", "name": "liquidationRatioBps" }, { "type": "uint64", "name": "protocolDebtCeilingMicroStable" } ] }, { "name": "ProtocolIntegrationsUpdatedEvent", "args": [ { "type": "address", "name": "admin" }, { "type": "uint64", "name": "oracleAppId" }, { "type": "uint64", "name": "stablecoinAppId" }, { "type": "uint64", "name": "liquidationAppId" } ] }, { "name": "ProtocolPauseFlagsUpdatedEvent", "args": [ { "type": "address", "name": "admin" }, { "type": "uint64", "name": "pauseFlags" } ] }, { "name": "ProtocolAdminTransferred", "args": [ { "type": "address", "name": "0" }, { "type": "address", "name": "1" } ] }, { "name": "CollateralDepositedEvent", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "address", "name": "owner" }, { "type": "uint64", "name": "amountMicroAlgo" }, { "type": "uint64", "name": "newCollateralMicroAlgo" }, { "type": "uint64", "name": "totalCollateralMicroAlgo" } ] }, { "name": "StablecoinMintedEvent", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "address", "name": "owner" }, { "type": "uint64", "name": "amountMicroStable" }, { "type": "uint64", "name": "newDebtMicroStable" }, { "type": "uint64", "name": "totalDebtMicroStable" } ] }, { "name": "StablecoinRepaidEvent", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "address", "name": "owner" }, { "type": "uint64", "name": "amountMicroStable" }, { "type": "uint64", "name": "newDebtMicroStable" }, { "type": "uint64", "name": "totalDebtMicroStable" } ] }, { "name": "CollateralWithdrawnEvent", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "address", "name": "owner" }, { "type": "uint64", "name": "amountMicroAlgo" }, { "type": "uint64", "name": "remainingCollateralMicroAlgo" }, { "type": "uint64", "name": "totalCollateralMicroAlgo" } ] }, { "name": "VaultClosedEvent", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "address", "name": "owner" }, { "type": "uint64", "name": "returnedCollateralMicroAlgo" }, { "type": "uint64", "name": "closedAt" } ] }, { "name": "VaultLiquidatedEvent", "args": [ { "type": "uint64", "name": "vaultId" }, { "type": "address", "name": "owner" }, { "type": "address", "name": "liquidator" }, { "type": "uint64", "name": "repaidDebtMicroStable" }, { "type": "uint64", "name": "liquidatorCollateralMicroAlgo" }, { "type": "uint64", "name": "protocolFeeCollateralMicroAlgo" }, { "type": "uint64", "name": "ownerRefundCollateralMicroAlgo" }, { "type": "uint64", "name": "pricePerAlgoMicroStable" }, { "type": "uint64", "name": "oracleUpdatedRound" }, { "type": "uint64", "name": "totalDebtMicroStable" }, { "type": "uint64", "name": "totalCollateralMicroAlgo" } ] } ], "templateVariables": {} }