{"cells":[{"id":"protocol","cell_type":"markdown","metadata":{},"source":"# RSNA Knee Silver4221 multisource robust submission v2\n\nExact evaluated weights and frozen preprocessing with registered deterministic degraded-input handling.\n"},{"id":"inference","cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":"# Exact evaluated model with registered robust v2 deployment behavior.\nimport base64, hashlib, importlib.util, json, os\nfrom pathlib import Path\n\nos.environ[\"OMP_NUM_THREADS\"] = \"1\"\nos.environ[\"OPENBLAS_NUM_THREADS\"] = \"1\"\nos.environ[\"MKL_NUM_THREADS\"] = \"1\"\nos.environ[\"NUMEXPR_NUM_THREADS\"] = \"1\"\n\nPACKAGE=json.loads('{\"frozen_e0_feature_extraction.py\":{\"base64\":\"IiIiQTQuM1IgRTA6IHByaXZhdGUsIG9mZmxpbmUsIGxhYmVsLWZyZWUgTVJJIGZlYXR1cmUgZXh0cmFjdGlvbi4KClRoZSBzY3JpcHQgcmVhZHMgb25seSB0cmFpbi1zZXJpZXMgbWV0YWRhdGEgYW5kIHNlbGVjdGVkIHRyYWluaW5nIERJQ09Ncy4gSXQgbmV2ZXIKcmVhZHMgcmVwb3J0IHRleHQsIGdvbGQgbGFiZWxzLCBvciB0ZXN0IGRhdGEsIGFuZCB3cml0ZXMgb25seSBoYXNoZWQgaWRlbnRpdGllcy4KIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgaGFzaGxpYgppbXBvcnQgaW5zcGVjdAppbXBvcnQganNvbgppbXBvcnQgbWF0aAppbXBvcnQgb3MKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCByZQppbXBvcnQgcmVzb3VyY2UKaW1wb3J0IHN5cwppbXBvcnQgdGltZQpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKCmltcG9ydCBudW1weSBhcyBucAppbXBvcnQgcGFuZGFzIGFzIHBkCmltcG9ydCBweWRpY29tCmltcG9ydCB0b3JjaAppbXBvcnQgdG9yY2gubm4gYXMgbm4KaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHRvcmNodmlzaW9uLm1vZGVscyBpbXBvcnQgcmVzbmV0MTgKCgpTRUVEID0gMApCQVRDSF9TSVpFID0gMzIKU1RVRElFU19QRVJfU0hBUkQgPSA2NApXQUxMX0xJTUlUX1NFQ09ORFMgPSA4ICogNjAgKiA2MApTQUZFX1NUT1BfU0VDT05EUyA9IGludCg3Ljc1ICogNjAgKiA2MCkKRVhQT1JUX0xJTUlUX0JZVEVTID0gNCAqIDEwMjQqKjMKRVhQRUNURURfSU5QVVRfTUFOSUZFU1RfU0hBMjU2ID0gIjhkNjUwYzVjMDFiOWY5NDY1MjA0YmU5YzZiMDVlMTdmYjdjOGNiYjU1ZGFiNWE1NmM3NjFhYzhmNjZmM2Y0YjUiCkVYUEVDVEVEX1RSQUlOX1NFUklFU19TSEEyNTYgPSAiNTczYzFkODA3NzJiZjQxMjExYzkxYjE0OWM5NTY3NzM4NWExYzIyZDYzZjQ4NWMzNDdmMWI0NmMwMTc3YWVmMyIKRVhQRUNURURfUkVTTkVUMThfRklMRV9TSEEyNTYgPSAiZjM3MDcyZmQ0N2U4OWM1ZTgyNzYyMWM1YmFmZmE3NTAwODE5Zjc4OTZiYmFjZWMxNjBiMWExNmM1NjBlMDdlYyIKRVhQRUNURURfUkVTTkVUMThfQkFDS0JPTkVfU0hBMjU2ID0gImNjNzE4OTA4NDUyZjRjNmI2Y2VlMjc4YmRjNzY3ZTkyZDhiOWJhOGRkZjJjMmRmMDc2ODE1Y2M4N2M3NjY1ZGIiCkVYUEVDVEVEX1NJTFZFUl9TVFVEWV9TRVFVRU5DRV9TSEEyNTYgPSAiZTdkNWQyMTdkOTkzODBmZjc4NmRhZjA3OGM4ODU4YWJkODhmNDA3ZDE5MTFhZjJhYzAzNjI1ZGY3ZWNjYjZiZSIKRVhQRUNURURfU0lMVkVSX1NFUklFU19TRVFVRU5DRV9TSEEyNTYgPSAiY2RlNzQwNzg3MGVlZjE1ZDk0Y2Q5NDU0NzNkZGE1M2JjNmIzZDVkMGU1ZWE1NjI5YTIyNzI5MWQwOWE0M2FlYiIKUExBTkVTID0gKCJBeGlhbCIsICJDb3JvbmFsIiwgIlNhZ2l0dGFsIikKUkFXX1VJRF9QQVRURVJOID0gcmUuY29tcGlsZShyYiIxXC4yXC44MjZcLjBcLjFcLjM2ODAwNDNcLjhcLjQ5OFwuIikKSU1BR0VORVRfTUVBTiA9IHRvcmNoLnRlbnNvcihbMC40ODUsIDAuNDU2LCAwLjQwNl0pLnZpZXcoMSwgMywgMSwgMSkKSU1BR0VORVRfU1REID0gdG9yY2gudGVuc29yKFswLjIyOSwgMC4yMjQsIDAuMjI1XSkudmlldygxLCAzLCAxLCAxKQpQUkVQUk9DRVNTSU5HX1NQRUMgPSB7CiAgICAic2xpY2Vfb3JkZXIiOiAiRElDT00gZ2VvbWV0cnkgY29vcmRpbmF0ZSBkb3QoSW1hZ2VQb3NpdGlvblBhdGllbnQsIGNyb3NzKHJvd19jb3NpbmVzLCBjb2x1bW5fY29zaW5lcykpIiwKICAgICJjZW50cmFsX2ZpdmUiOiAibG93PW1heCgwLG4vLzItMik7IGluZGljZXMgbG93Omxvdys1OyByZXF1aXJlIG4+PTUiLAogICAgInVuaWZvcm1fc2l4dGVlbiI6ICJ1bmlxdWUgcm91bmQobGluc3BhY2UoMCxuLTEsbWluKDE2LG4pKSk7IHJlcXVpcmUgbj49NSIsCiAgICAiZXh0cmFjdGVkX3NsaWNlcyI6ICJzb3J0ZWQgdW5pb24gb2YgY2VudHJhbC1maXZlIGFuZCB1bmlmb3JtLXNpeHRlZW4gaW5kaWNlcyIsCiAgICAiaW50ZW5zaXR5IjogInBlci1zbGljZSByZXNjYWxlOyBNT05PQ0hST01FMSBpbnZlcnNpb247IGZpbml0ZSAxc3QvOTl0aCBwZXJjZW50aWxlIGNsaXA7IFswLDFdIHNjYWxlIiwKICAgICJyZXNpemUiOiAidG9yY2ggYmlsaW5lYXIgMjI0eDIyNCBhbGlnbl9jb3JuZXJzPUZhbHNlIiwKICAgICJjaGFubmVscyI6ICJncmF5c2NhbGUgcmVwZWF0ZWQgdG8gdGhyZWUgY2hhbm5lbHMiLAogICAgIm5vcm1hbGl6YXRpb24iOiAiSW1hZ2VOZXQgbWVhbi9zdGQiLAogICAgImVuY29kZXIiOiAidG9yY2h2aXNpb24gUmVzTmV0MTggYXJjaGl0ZWN0dXJlIHdpdGggb2ZmbGluZSBJTUFHRU5FVDFLX1YxIGYzNzA3MmZkIHN0YXRlOyBpZGVudGl0eSBmYzsgZnJvemVuIGV2YWwiLAogICAgInNlcmllc19wb29saW5nIjogInNlcGFyYXRlIGFyaXRobWV0aWMgbWVhbnMgZm9yIGV4YWN0IGNlbnRyYWwtZml2ZSBhbmQgdXAtdG8tMTYgdW5pZm9ybSBzbGljZXMiLAogICAgInN0dWR5X3Bvb2xpbmciOiAic2VwYXJhdGUgZXF1YWwtc2VyaWVzIGFuZCBlcXVhbC1hbmF0b21pY2FsLXBsYW5lIGFyaXRobWV0aWMgbWVhbnMiLAp9CgoKZGVmIHNoYTI1Nl9ieXRlcyhwYXlsb2FkOiBieXRlcykgLT4gc3RyOgogICAgcmV0dXJuIGhhc2hsaWIuc2hhMjU2KHBheWxvYWQpLmhleGRpZ2VzdCgpCgoKZGVmIHNoYTI1Nl90ZXh0KHZhbHVlOiBzdHIpIC0+IHN0cjoKICAgIHJldHVybiBzaGEyNTZfYnl0ZXModmFsdWUuZW5jb2RlKCJ1dGYtOCIpKQoKCmRlZiBzaGEyNTZfZmlsZShwYXRoOiBQYXRoKSAtPiBzdHI6CiAgICBkaWdlc3QgPSBoYXNobGliLnNoYTI1NigpCiAgICB3aXRoIHBhdGgub3BlbigicmIiKSBhcyBoYW5kbGU6CiAgICAgICAgZm9yIGNodW5rIGluIGl0ZXIobGFtYmRhOiBoYW5kbGUucmVhZCgxMDI0ICogMTAyNCksIGIiIik6CiAgICAgICAgICAgIGRpZ2VzdC51cGRhdGUoY2h1bmspCiAgICByZXR1cm4gZGlnZXN0LmhleGRpZ2VzdCgpCgoKZGVmIGNhbm9uaWNhbF9oYXNoKHZhbHVlOiBvYmplY3QpIC0+IHN0cjoKICAgIHJldHVybiBzaGEyNTZfYnl0ZXMoanNvbi5kdW1wcyh2YWx1ZSwgc29ydF9rZXlzPVRydWUsIHNlcGFyYXRvcnM9KCIsIiwgIjoiKSwgZW5zdXJlX2FzY2lpPVRydWUpLmVuY29kZSgidXRmLTgiKSkKCgpkZWYgY2VudHJhbF9maXZlX2luZGljZXMoY291bnQ6IGludCkgLT4gbGlzdFtpbnRdOgogICAgaWYgY291bnQgPCA1OgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZld2VyX3RoYW5fZml2ZV9nZW9tZXRyeV9vcmRlcmVkX3NsaWNlcyIpCiAgICBsb3cgPSBtYXgoMCwgY291bnQgLy8gMiAtIDIpCiAgICByZXN1bHQgPSBsaXN0KHJhbmdlKGxvdywgbG93ICsgNSkpCiAgICBpZiByZXN1bHRbLTFdID49IGNvdW50OgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNlbnRyYWxfZml2ZV9pbmRleF9vdXRfb2ZfYm91bmRzIikKICAgIHJldHVybiByZXN1bHQKCgpkZWYgdW5pZm9ybV9zaXh0ZWVuX2luZGljZXMoY291bnQ6IGludCkgLT4gbGlzdFtpbnRdOgogICAgaWYgY291bnQgPCA1OgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZld2VyX3RoYW5fZml2ZV9nZW9tZXRyeV9vcmRlcmVkX3NsaWNlcyIpCiAgICBzYW1wbGVfY291bnQgPSBtaW4oMTYsIGNvdW50KQogICAgcmVzdWx0ID0gbnAudW5pcXVlKG5wLmxpbnNwYWNlKDAsIGNvdW50IC0gMSwgc2FtcGxlX2NvdW50KS5yb3VuZCgpLmFzdHlwZShpbnQpKS50b2xpc3QoKQogICAgaWYgbGVuKHJlc3VsdCkgIT0gc2FtcGxlX2NvdW50IG9yIHJlc3VsdFswXSAhPSAwIG9yIHJlc3VsdFstMV0gIT0gY291bnQgLSAxOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuaWZvcm1faW5kZXhfY29uc3RydWN0aW9uX2ZhaWxlZCIpCiAgICByZXR1cm4gW2ludCh2YWx1ZSkgZm9yIHZhbHVlIGluIHJlc3VsdF0KCgpkZWYgZXh0cmFjdGlvbl9pbmRpY2VzKGNvdW50OiBpbnQpIC0+IHR1cGxlW2xpc3RbaW50XSwgbGlzdFtpbnRdLCBsaXN0W2ludF1dOgogICAgY2VudHJhbCA9IGNlbnRyYWxfZml2ZV9pbmRpY2VzKGNvdW50KQogICAgdW5pZm9ybSA9IHVuaWZvcm1fc2l4dGVlbl9pbmRpY2VzKGNvdW50KQogICAgcmV0dXJuIGNlbnRyYWwsIHVuaWZvcm0sIHNvcnRlZChzZXQoY2VudHJhbCkgfCBzZXQodW5pZm9ybSkpCgoKZGVmIGVxdWFsX3Nlcmllc19tZWFuKHZhbHVlczogbnAubmRhcnJheSkgLT4gbnAubmRhcnJheToKICAgIGFycmF5ID0gbnAuYXNhcnJheSh2YWx1ZXMsIGR0eXBlPW5wLmZsb2F0MzIpCiAgICBpZiBhcnJheS5uZGltICE9IDIgb3Igbm90IGxlbihhcnJheSkgb3Igbm90IG5wLmlzZmluaXRlKGFycmF5KS5hbGwoKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkX3Nlcmllc19mZWF0dXJlcyIpCiAgICByZXR1cm4gYXJyYXkubWVhbihheGlzPTAsIGR0eXBlPW5wLmZsb2F0NjQpLmFzdHlwZShucC5mbG9hdDMyKQoKCmRlZiBwbGFuZV9iYWxhbmNlZF9tZWFuKHZhbHVlczogbnAubmRhcnJheSwgcGxhbmVzOiBsaXN0W3N0cl0pIC0+IG5wLm5kYXJyYXk6CiAgICBhcnJheSA9IG5wLmFzYXJyYXkodmFsdWVzLCBkdHlwZT1ucC5mbG9hdDMyKQogICAgaWYgYXJyYXkubmRpbSAhPSAyIG9yIGxlbihhcnJheSkgIT0gbGVuKHBsYW5lcykgb3Igbm90IG5wLmlzZmluaXRlKGFycmF5KS5hbGwoKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkX3Nlcmllc19mZWF0dXJlcyIpCiAgICB2ZWN0b3JzID0gW10KICAgIGZvciBwbGFuZSBpbiBQTEFORVM6CiAgICAgICAgaW5kaWNlcyA9IFtpbmRleCBmb3IgaW5kZXgsIHZhbHVlIGluIGVudW1lcmF0ZShwbGFuZXMpIGlmIHZhbHVlID09IHBsYW5lXQogICAgICAgIGlmIG5vdCBpbmRpY2VzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtaXNzaW5nX2FuYXRvbWljYWxfcGxhbmUiKQogICAgICAgIHZlY3RvcnMuYXBwZW5kKGFycmF5W2luZGljZXNdLm1lYW4oYXhpcz0wLCBkdHlwZT1ucC5mbG9hdDY0KSkKICAgIHJldHVybiBucC5hc2FycmF5KHZlY3RvcnMsIGR0eXBlPW5wLmZsb2F0NjQpLm1lYW4oYXhpcz0wKS5hc3R5cGUobnAuZmxvYXQzMikKCgpkZWYgcGVha19yc3NfbWIoKSAtPiBmbG9hdDoKICAgIHZhbHVlID0gZmxvYXQocmVzb3VyY2UuZ2V0cnVzYWdlKHJlc291cmNlLlJVU0FHRV9TRUxGKS5ydV9tYXhyc3MpCiAgICByZXR1cm4gdmFsdWUgLyAxMDI0LjAgaWYgc3lzLnBsYXRmb3JtICE9ICJkYXJ3aW4iIGVsc2UgdmFsdWUgLyAxXzAwMF8wMDAuMAoKCmRlZiBzZWxlY3RfZGV2aWNlKCkgLT4gdHVwbGVbc3RyLCBzdHIgfCBOb25lLCBzdHIgfCBOb25lXToKICAgIGlmIG5vdCB0b3JjaC5jdWRhLmlzX2F2YWlsYWJsZSgpOgogICAgICAgIHJldHVybiAiY3B1IiwgIkNVREEgaXMgdW5hdmFpbGFibGUiLCBOb25lCiAgICBhc3NpZ25lZCA9IHRvcmNoLmN1ZGEuZ2V0X2RldmljZV9uYW1lKDApCiAgICBtYWpvciwgbWlub3IgPSB0b3JjaC5jdWRhLmdldF9kZXZpY2VfY2FwYWJpbGl0eSgwKQogICAgcmVxdWlyZWQgPSBmInNtX3ttYWpvcn17bWlub3J9IgogICAgY29tcGlsZWQgPSBzZXQodG9yY2guY3VkYS5nZXRfYXJjaF9saXN0KCkpCiAgICBpZiByZXF1aXJlZCBub3QgaW4gY29tcGlsZWQ6CiAgICAgICAgcmV0dXJuICJjcHUiLCBmImFzc2lnbmVkIEdQVSByZXF1aXJlcyB7cmVxdWlyZWR9OyBQeVRvcmNoIHN1cHBvcnRzIHtzb3J0ZWQoY29tcGlsZWQpfSIsIGFzc2lnbmVkCiAgICByZXR1cm4gImN1ZGEiLCBOb25lLCBhc3NpZ25lZAoKCmRlZiByZXNvbHZlX3ByaXZhdGVfaW5wdXQoKSAtPiBQYXRoOgogICAgY2FuZGlkYXRlcyA9IFsKICAgICAgICBQYXRoKCIva2FnZ2xlL2lucHV0L3JzbmEta25lZS1hNC0zci1lMC1wcml2YXRlLWlucHV0cyIpLAogICAgICAgIFBhdGgoIi9rYWdnbGUvaW5wdXQvZGF0YXNldHMvcmF5bW9uZG9kaWFuZmxveWQvcnNuYS1rbmVlLWE0LTNyLWUwLXByaXZhdGUtaW5wdXRzIiksCiAgICBdCiAgICBmb3IgY2FuZGlkYXRlIGluIGNhbmRpZGF0ZXM6CiAgICAgICAgcGF0aCA9IGNhbmRpZGF0ZSAvICJpbnB1dF9tYW5pZmVzdC5qc29uIgogICAgICAgIGlmIHBhdGguaXNfZmlsZSgpIGFuZCBzaGEyNTZfZmlsZShwYXRoKSA9PSBFWFBFQ1RFRF9JTlBVVF9NQU5JRkVTVF9TSEEyNTY6CiAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGUKICAgIGZvciBwYXRoIGluIFBhdGgoIi9rYWdnbGUvaW5wdXQiKS5nbG9iKCIqKi9pbnB1dF9tYW5pZmVzdC5qc29uIik6CiAgICAgICAgaWYgc2hhMjU2X2ZpbGUocGF0aCkgPT0gRVhQRUNURURfSU5QVVRfTUFOSUZFU1RfU0hBMjU2OgogICAgICAgICAgICByZXR1cm4gcGF0aC5wYXJlbnQKICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigidmVyaWZpZWRfcHJpdmF0ZV9pbnB1dF91bmF2YWlsYWJsZSIpCgoKZGVmIHJlc29sdmVfY29tcGV0aXRpb25fZGF0YSgpIC0+IHR1cGxlW1BhdGgsIFBhdGhdOgogICAgcm9vdHMgPSBbCiAgICAgICAgUGF0aCh2YWx1ZSkKICAgICAgICBmb3IgdmFsdWUgaW4gKAogICAgICAgICAgICBvcy5lbnZpcm9uLmdldCgiUlNOQV9EQVRBX1JPT1QiKSwKICAgICAgICAgICAgIi9rYWdnbGUvaW5wdXQvcnNuYS1rbmVlLWFibm9ybWFsaXR5LWRldGVjdGlvbiIsCiAgICAgICAgICAgICIva2FnZ2xlL2lucHV0L2NvbXBldGl0aW9ucy9yc25hLWtuZWUtYWJub3JtYWxpdHktZGV0ZWN0aW9uIiwKICAgICAgICApCiAgICAgICAgaWYgdmFsdWUKICAgIF0KICAgIGZvciByb290IGluIHJvb3RzOgogICAgICAgIHNlcmllc19jc3YgPSBuZXh0KChwYXRoIGZvciBwYXRoIGluIChyb290IC8gInRyYWluX3Nlcmllcy5jc3YiLCByb290IC8gIm1ldGFkYXRhL3RyYWluX3Nlcmllcy5jc3YiKSBpZiBwYXRoLmlzX2ZpbGUoKSksIE5vbmUpCiAgICAgICAgZGljb21fcm9vdCA9IG5leHQoKHBhdGggZm9yIHBhdGggaW4gKHJvb3QgLyAidHJhaW5fc2VyaWVzIiwgcm9vdCAvICJzYW1wbGUvdHJhaW5fc2VyaWVzIikgaWYgcGF0aC5pc19kaXIoKSksIE5vbmUpCiAgICAgICAgaWYgc2VyaWVzX2NzdiBpcyBub3QgTm9uZSBhbmQgZGljb21fcm9vdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlcmllc19jc3YsIGRpY29tX3Jvb3QKICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiY29tcGV0aXRpb25fdHJhaW5pbmdfc2VyaWVzX3VuYXZhaWxhYmxlIikKCgpkZWYgdmFsaWRhdGVfcHJpdmF0ZV9pbnB1dChyb290OiBQYXRoKSAtPiB0dXBsZVtwZC5EYXRhRnJhbWUsIHBkLkRhdGFGcmFtZSwgZGljdFtzdHIsIG9iamVjdF1dOgogICAgbWFuaWZlc3RfcGF0aCA9IHJvb3QgLyAiaW5wdXRfbWFuaWZlc3QuanNvbiIKICAgIGlmIHNoYTI1Nl9maWxlKG1hbmlmZXN0X3BhdGgpICE9IEVYUEVDVEVEX0lOUFVUX01BTklGRVNUX1NIQTI1NjoKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImlucHV0X21hbmlmZXN0X2hhc2hfbWlzbWF0Y2giKQogICAgbWFuaWZlc3QgPSBqc29uLmxvYWRzKG1hbmlmZXN0X3BhdGgucmVhZF90ZXh0KGVuY29kaW5nPSJ1dGYtOCIpKQogICAgZm9yIGl0ZW0gaW4gbWFuaWZlc3RbImZpbGVzIl06CiAgICAgICAgcGF0aCA9IHJvb3QgLyBzdHIoaXRlbVsicGF0aCJdKQogICAgICAgIGlmIG5vdCBwYXRoLmlzX2ZpbGUoKSBvciBwYXRoLnN0YXQoKS5zdF9zaXplICE9IGludChpdGVtWyJieXRlcyJdKSBvciBzaGEyNTZfZmlsZShwYXRoKSAhPSBpdGVtWyJzaGEyNTYiXToKICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJwcml2YXRlX2lucHV0X2FydGlmYWN0X21pc21hdGNoIikKICAgIGlmIG1hbmlmZXN0WyJwcml2YWN5Il0gIT0gewogICAgICAgICJnb2xkX2xhYmVsc19wcmVzZW50IjogRmFsc2UsCiAgICAgICAgInByaXZhdGVfZGF0YXNldCI6IFRydWUsCiAgICAgICAgInJhd19kaWNvbV9wcmVzZW50IjogRmFsc2UsCiAgICAgICAgInJhd19pZGVudGlmaWVyc19wcmVzZW50IjogRmFsc2UsCiAgICAgICAgInJhd19yZXBvcnRzX3ByZXNlbnQiOiBGYWxzZSwKICAgIH06CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJwcml2YXRlX2lucHV0X3ByaXZhY3lfZGVjbGFyYXRpb25fbWlzbWF0Y2giKQoKICAgIHNpbHZlcl9zdHVkaWVzID0gcGQucmVhZF9jc3Yocm9vdCAvICJzaWx2ZXJfc2VsZWN0aW9uX21hbmlmZXN0LmNzdiIsIGR0eXBlPXN0ciwga2VlcF9kZWZhdWx0X25hPUZhbHNlKQogICAgc2lsdmVyX3NlcmllcyA9IHBkLnJlYWRfY3N2KHJvb3QgLyAic2lsdmVyX3Nlcmllc19tYW5pZmVzdC5jc3YiLCBkdHlwZT1zdHIsIGtlZXBfZGVmYXVsdF9uYT1GYWxzZSkKICAgIGdvbGRfc3R1ZGllcyA9IHBkLnJlYWRfY3N2KHJvb3QgLyAiZ29sZF9zdHVkeV9tYW5pZmVzdC5jc3YiLCBkdHlwZT1zdHIsIGtlZXBfZGVmYXVsdF9uYT1GYWxzZSkKICAgIGdvbGRfc2VyaWVzID0gcGQucmVhZF9jc3Yocm9vdCAvICJnb2xkX3Nlcmllc19tYW5pZmVzdC5jc3YiLCBkdHlwZT1zdHIsIGtlZXBfZGVmYXVsdF9uYT1GYWxzZSkKICAgIGhhc2hlcyA9IGpzb24ubG9hZHMoKHJvb3QgLyAic2lsdmVyX3NlbGVjdGlvbl9oYXNoZXMuanNvbiIpLnJlYWRfdGV4dChlbmNvZGluZz0idXRmLTgiKSkKICAgIGlmIGxlbihzaWx2ZXJfc3R1ZGllcykgIT0gNTEyIG9yIGxlbihzaWx2ZXJfc2VyaWVzKSAhPSAzMTQwIG9yIGxlbihnb2xkX3N0dWRpZXMpICE9IDU4IG9yIGxlbihnb2xkX3NlcmllcykgIT0gMzAyOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigicHJpdmF0ZV9pbnB1dF9zY29wZV9taXNtYXRjaCIpCiAgICBpZiBzaGEyNTZfdGV4dCgiXG4iLmpvaW4oc2lsdmVyX3N0dWRpZXMuc3R1ZHlfaWRfc2hhMjU2KSArICJcbiIpICE9IEVYUEVDVEVEX1NJTFZFUl9TVFVEWV9TRVFVRU5DRV9TSEEyNTY6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJzaWx2ZXJfc3R1ZHlfc2VxdWVuY2VfaGFzaF9taXNtYXRjaCIpCiAgICBpZiBzaGEyNTZfdGV4dCgiXG4iLmpvaW4oc2lsdmVyX3Nlcmllcy5zZXJpZXNfaWRfc2hhMjU2KSArICJcbiIpICE9IEVYUEVDVEVEX1NJTFZFUl9TRVJJRVNfU0VRVUVOQ0VfU0hBMjU2OgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigic2lsdmVyX3Nlcmllc19zZXF1ZW5jZV9oYXNoX21pc21hdGNoIikKICAgIGlmIGhhc2hlc1sic3R1ZHlfaGFzaF9zZXF1ZW5jZV9zaGEyNTYiXSAhPSBFWFBFQ1RFRF9TSUxWRVJfU1RVRFlfU0VRVUVOQ0VfU0hBMjU2IG9yIGhhc2hlc1sic2VyaWVzX2hhc2hfc2VxdWVuY2Vfc2hhMjU2Il0gIT0gRVhQRUNURURfU0lMVkVSX1NFUklFU19TRVFVRU5DRV9TSEEyNTY6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJzZWxlY3Rpb25faGFzaF9yZWNvcmRfbWlzbWF0Y2giKQoKICAgIHNpbHZlcl9pZGVudGl0eSA9IHNpbHZlcl9zdHVkaWVzW1siY29ob3J0X2luZGV4IiwgInBhdGllbnRfaWRfc2hhMjU2IiwgInN0dWR5X2lkX3NoYTI1NiJdXS5jb3B5KCkKICAgIHNpbHZlciA9IHNpbHZlcl9zZXJpZXMubWVyZ2Uoc2lsdmVyX2lkZW50aXR5LCBvbj1bImNvaG9ydF9pbmRleCIsICJzdHVkeV9pZF9zaGEyNTYiXSwgaG93PSJsZWZ0IiwgdmFsaWRhdGU9Im1hbnlfdG9fb25lIikKICAgIHNpbHZlci5pbnNlcnQoMCwgImNvaG9ydF9raW5kIiwgInNpbHZlcl90cmFpbmluZyIpCiAgICBnb2xkID0gZ29sZF9zZXJpZXMucmVuYW1lKGNvbHVtbnM9eyJnb2xkX2luZGV4IjogImNvaG9ydF9pbmRleCJ9KS5jb3B5KCkKICAgIGdvbGQuaW5zZXJ0KDAsICJjb2hvcnRfa2luZCIsICJleHBlcnRfZ29sZF9ldmFsdWF0aW9uIikKICAgIGV4cGVjdGVkID0gcGQuY29uY2F0KFtzaWx2ZXIsIGdvbGRdLCBpZ25vcmVfaW5kZXg9VHJ1ZSwgc29ydD1GYWxzZSkKICAgIGV4cGVjdGVkID0gZXhwZWN0ZWRbWyJjb2hvcnRfa2luZCIsICJjb2hvcnRfaW5kZXgiLCAicGF0aWVudF9pZF9zaGEyNTYiLCAic3R1ZHlfaWRfc2hhMjU2IiwgInNlcmllc19pZF9zaGEyNTYiLCAiYW5hdG9taWNhbF9wbGFuZSJdXQogICAgZXhwZWN0ZWQuaW5zZXJ0KDAsICJnbG9iYWxfc2VyaWVzX2luZGV4IiwgcmFuZ2UobGVuKGV4cGVjdGVkKSkpCiAgICBpZiBleHBlY3RlZC5pc25hKCkuYW55KCkuYW55KCkgb3IgZXhwZWN0ZWQuc2VyaWVzX2lkX3NoYTI1Ni5udW5pcXVlKCkgIT0gMzQ0MiBvciBleHBlY3RlZC5zdHVkeV9pZF9zaGEyNTYubnVuaXF1ZSgpICE9IDU3MDoKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImNvbWJpbmVkX2hhc2hlZF9zY29wZV9pbnZhbGlkIikKICAgIGlmIG5vdCBzZXQoZXhwZWN0ZWQuYW5hdG9taWNhbF9wbGFuZSkuaXNzdWJzZXQoc2V0KFBMQU5FUykpOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigidW5leHBlY3RlZF9hbmF0b21pY2FsX3BsYW5lIikKICAgIHJldHVybiBleHBlY3RlZCwgc2lsdmVyX3N0dWRpZXMsIG1hbmlmZXN0CgoKZGVmIG1hcF9yYXdfc2VyaWVzKGV4cGVjdGVkOiBwZC5EYXRhRnJhbWUsIHNlcmllc19jc3Y6IFBhdGgpIC0+IHBkLkRhdGFGcmFtZToKICAgIGlmIHNoYTI1Nl9maWxlKHNlcmllc19jc3YpICE9IEVYUEVDVEVEX1RSQUlOX1NFUklFU19TSEEyNTY6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJ0cmFpbl9zZXJpZXNfY3N2X2hhc2hfbWlzbWF0Y2giKQogICAgcmF3ID0gcGQucmVhZF9jc3Yoc2VyaWVzX2NzdiwgZHR5cGU9c3RyLCBrZWVwX2RlZmF1bHRfbmE9RmFsc2UsIHVzZWNvbHM9WyJTdHVkeUluc3RhbmNlVUlEIiwgIlNlcmllc0luc3RhbmNlVUlEIl0pCiAgICByYXdbInN0dWR5X2lkX3NoYTI1NiJdID0gcmF3LlN0dWR5SW5zdGFuY2VVSUQubWFwKHNoYTI1Nl90ZXh0KQogICAgcmF3WyJzZXJpZXNfaWRfc2hhMjU2Il0gPSByYXcuU2VyaWVzSW5zdGFuY2VVSUQubWFwKHNoYTI1Nl90ZXh0KQogICAgaWYgcmF3LnNlcmllc19pZF9zaGEyNTYubnVuaXF1ZSgpICE9IGxlbihyYXcpOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiY29tcGV0aXRpb25fc2VyaWVzX2lkZW50aXR5X25vdF91bmlxdWUiKQogICAgbWFwcGVkID0gZXhwZWN0ZWQubWVyZ2UocmF3LCBvbj1bInN0dWR5X2lkX3NoYTI1NiIsICJzZXJpZXNfaWRfc2hhMjU2Il0sIGhvdz0ibGVmdCIsIHZhbGlkYXRlPSJvbmVfdG9fb25lIikKICAgIGlmIG1hcHBlZC5TdHVkeUluc3RhbmNlVUlELmVxKCIiKS5hbnkoKSBvciBtYXBwZWQuU2VyaWVzSW5zdGFuY2VVSUQuZXEoIiIpLmFueSgpIG9yIG1hcHBlZFtbIlN0dWR5SW5zdGFuY2VVSUQiLCAiU2VyaWVzSW5zdGFuY2VVSUQiXV0uaXNuYSgpLmFueSgpLmFueSgpOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiaGFzaGVkX3Nlcmllc19tYXBwaW5nX2luY29tcGxldGUiKQogICAgcmV0dXJuIG1hcHBlZC5zb3J0X3ZhbHVlcygiZ2xvYmFsX3Nlcmllc19pbmRleCIsIGtpbmQ9Im1lcmdlc29ydCIpLnJlc2V0X2luZGV4KGRyb3A9VHJ1ZSkKCgpkZWYgZ2VvbWV0cnlfb3JkZXJlZF9wYXRocyhzZXJpZXNfZGlyOiBQYXRoKSAtPiB0dXBsZVtsaXN0W2RpY3Rbc3RyLCBvYmplY3RdXSwgc3RyXToKICAgIGZpbGVzID0gc29ydGVkKHNlcmllc19kaXIuZ2xvYigiKi5kY20iKSkKICAgIGlmIG5vdCBmaWxlczoKICAgICAgICBmaWxlcyA9IHNvcnRlZChwYXRoIGZvciBwYXRoIGluIHNlcmllc19kaXIuaXRlcmRpcigpIGlmIHBhdGguaXNfZmlsZSgpKQogICAgaWYgbm90IGZpbGVzOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vX2RpY29tX2ZpbGVzIikKICAgIHJlY29yZHMgPSBbXQogICAgZm9yIHBhdGggaW4gZmlsZXM6CiAgICAgICAgZGF0YXNldCA9IHB5ZGljb20uZGNtcmVhZChzdHIocGF0aCksIHN0b3BfYmVmb3JlX3BpeGVscz1UcnVlLCBmb3JjZT1UcnVlKQogICAgICAgIG9yaWVudGF0aW9uID0gbnAuYXNhcnJheShkYXRhc2V0LkltYWdlT3JpZW50YXRpb25QYXRpZW50LCBkdHlwZT1mbG9hdCkKICAgICAgICBwb3NpdGlvbiA9IG5wLmFzYXJyYXkoZGF0YXNldC5JbWFnZVBvc2l0aW9uUGF0aWVudCwgZHR5cGU9ZmxvYXQpCiAgICAgICAgaWYgb3JpZW50YXRpb24uc2hhcGUgIT0gKDYsKSBvciBwb3NpdGlvbi5zaGFwZSAhPSAoMywpIG9yIG5vdCBucC5pc2Zpbml0ZShvcmllbnRhdGlvbikuYWxsKCkgb3Igbm90IG5wLmlzZmluaXRlKHBvc2l0aW9uKS5hbGwoKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW5jb21wbGV0ZV9nZW9tZXRyeSIpCiAgICAgICAgY29vcmRpbmF0ZSA9IGZsb2F0KG5wLmRvdChwb3NpdGlvbiwgbnAuY3Jvc3Mob3JpZW50YXRpb25bOjNdLCBvcmllbnRhdGlvblszOl0pKSkKICAgICAgICBpZiBub3QgbWF0aC5pc2Zpbml0ZShjb29yZGluYXRlKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibm9uZmluaXRlX2dlb21ldHJ5X2Nvb3JkaW5hdGUiKQogICAgICAgIHJlY29yZHMuYXBwZW5kKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAicGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAiY29vcmRpbmF0ZSI6IGNvb3JkaW5hdGUsCiAgICAgICAgICAgICAgICAic29wX2luc3RhbmNlX3NoYTI1NiI6IHNoYTI1Nl90ZXh0KHN0cihnZXRhdHRyKGRhdGFzZXQsICJTT1BJbnN0YW5jZVVJRCIsICIiKSkpLAogICAgICAgICAgICAgICAgImZpbGVuYW1lX3NoYTI1NiI6IHNoYTI1Nl90ZXh0KHBhdGgubmFtZSksCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICByZWNvcmRzLnNvcnQoa2V5PWxhbWJkYSBpdGVtOiAoZmxvYXQoaXRlbVsiY29vcmRpbmF0ZSJdKSwgc3RyKGl0ZW1bImZpbGVuYW1lX3NoYTI1NiJdKSkpCiAgICByb3VuZGVkID0gW3JvdW5kKGZsb2F0KGl0ZW1bImNvb3JkaW5hdGUiXSksIDQpIGZvciBpdGVtIGluIHJlY29yZHNdCiAgICBpZiBsZW4ocm91bmRlZCkgIT0gbGVuKHNldChyb3VuZGVkKSk6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZHVwbGljYXRlX2dlb21ldHJ5X3Bvc2l0aW9ucyIpCiAgICBoZWFkZXJfZGlnZXN0ID0gY2Fub25pY2FsX2hhc2goCiAgICAgICAgW3siY29vcmRpbmF0ZSI6IHJvdW5kKGZsb2F0KGl0ZW1bImNvb3JkaW5hdGUiXSksIDgpLCAic29wX2luc3RhbmNlX3NoYTI1NiI6IGl0ZW1bInNvcF9pbnN0YW5jZV9zaGEyNTYiXSwgImZpbGVuYW1lX3NoYTI1NiI6IGl0ZW1bImZpbGVuYW1lX3NoYTI1NiJdfSBmb3IgaXRlbSBpbiByZWNvcmRzXQogICAgKQogICAgcmV0dXJuIHJlY29yZHMsIGhlYWRlcl9kaWdlc3QKCgpkZWYgZGVjb2RlX2FuZF9zY2FsZShwYXRoOiBQYXRoKSAtPiB0dXBsZVtucC5uZGFycmF5LCBzdHIsIHN0cl06CiAgICBkaWNvbV9oYXNoID0gc2hhMjU2X2ZpbGUocGF0aCkKICAgIGRhdGFzZXQgPSBweWRpY29tLmRjbXJlYWQoc3RyKHBhdGgpLCBmb3JjZT1UcnVlKQogICAgcGl4ZWxzID0gbnAuYXNhcnJheShkYXRhc2V0LnBpeGVsX2FycmF5LCBkdHlwZT1ucC5mbG9hdDMyKQogICAgaWYgcGl4ZWxzLm5kaW0gIT0gMjoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJkZWNvZGVkX3BpeGVsc19ub3RfMmQiKQogICAgcGl4ZWxzID0gcGl4ZWxzICogZmxvYXQoZ2V0YXR0cihkYXRhc2V0LCAiUmVzY2FsZVNsb3BlIiwgMS4wKSkgKyBmbG9hdChnZXRhdHRyKGRhdGFzZXQsICJSZXNjYWxlSW50ZXJjZXB0IiwgMC4wKSkKICAgIGlmIHN0cihnZXRhdHRyKGRhdGFzZXQsICJQaG90b21ldHJpY0ludGVycHJldGF0aW9uIiwgIk1PTk9DSFJPTUUyIikpID09ICJNT05PQ0hST01FMSI6CiAgICAgICAgcGl4ZWxzID0gZmxvYXQocGl4ZWxzLm1heCgpICsgcGl4ZWxzLm1pbigpKSAtIHBpeGVscwogICAgZmluaXRlID0gcGl4ZWxzW25wLmlzZmluaXRlKHBpeGVscyldCiAgICBpZiBub3QgZmluaXRlLnNpemU6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibm9fZmluaXRlX3BpeGVscyIpCiAgICBsb3csIGhpZ2ggPSBucC5wZXJjZW50aWxlKGZpbml0ZSwgWzEsIDk5XSkKICAgIGlmIGhpZ2ggPD0gbG93OgogICAgICAgIHNjYWxlZCA9IG5wLnplcm9zX2xpa2UocGl4ZWxzLCBkdHlwZT1ucC5mbG9hdDMyKQogICAgZWxzZToKICAgICAgICBjbGVhbiA9IG5wLm5hbl90b19udW0ocGl4ZWxzLCBuYW49ZmxvYXQobG93KSwgcG9zaW5mPWZsb2F0KGhpZ2gpLCBuZWdpbmY9ZmxvYXQobG93KSkKICAgICAgICBzY2FsZWQgPSBucC5jbGlwKChjbGVhbiAtIGxvdykgLyAoaGlnaCAtIGxvdyksIDAsIDEpLmFzdHlwZShucC5mbG9hdDMyKQogICAgcmV0dXJuIHNjYWxlZCwgZGljb21faGFzaCwgc2hhMjU2X2J5dGVzKHNjYWxlZC50b2J5dGVzKCkpCgoKZGVmIHByZXByb2Nlc3MoaW1hZ2VzOiBsaXN0W25wLm5kYXJyYXldKSAtPiB0b3JjaC5UZW5zb3I6CiAgICBmcmFtZXMgPSBbXQogICAgZm9yIGltYWdlIGluIGltYWdlczoKICAgICAgICB2YWx1ZSA9IHRvcmNoLmZyb21fbnVtcHkoaW1hZ2UpW05vbmUsIE5vbmVdCiAgICAgICAgdmFsdWUgPSBGLmludGVycG9sYXRlKHZhbHVlLCBzaXplPSgyMjQsIDIyNCksIG1vZGU9ImJpbGluZWFyIiwgYWxpZ25fY29ybmVycz1GYWxzZSkKICAgICAgICBmcmFtZXMuYXBwZW5kKHZhbHVlWzAsIDBdKQogICAgYmF0Y2ggPSB0b3JjaC5zdGFjayhmcmFtZXMpWzosIE5vbmVdLnJlcGVhdCgxLCAzLCAxLCAxKQogICAgcmV0dXJuIChiYXRjaCAtIElNQUdFTkVUX01FQU4pIC8gSU1BR0VORVRfU1RECgoKQHRvcmNoLmluZmVyZW5jZV9tb2RlKCkKZGVmIGVuY29kZShtb2RlbDogbm4uTW9kdWxlLCBpbWFnZXM6IGxpc3RbbnAubmRhcnJheV0sIGRldmljZTogc3RyKSAtPiBucC5uZGFycmF5OgogICAgYmF0Y2ggPSBwcmVwcm9jZXNzKGltYWdlcykKICAgIGNodW5rcyA9IFtdCiAgICBmb3Igc3RhcnQgaW4gcmFuZ2UoMCwgbGVuKGJhdGNoKSwgQkFUQ0hfU0laRSk6CiAgICAgICAgY2h1bmtzLmFwcGVuZChtb2RlbChiYXRjaFtzdGFydCA6IHN0YXJ0ICsgQkFUQ0hfU0laRV0udG8oZGV2aWNlKSkuZmxvYXQoKS5jcHUoKSkKICAgIHJlc3VsdCA9IHRvcmNoLmNhdChjaHVua3MpLm51bXB5KCkuYXN0eXBlKG5wLmZsb2F0MzIpCiAgICBpZiByZXN1bHQuc2hhcGUgIT0gKGxlbihpbWFnZXMpLCA1MTIpIG9yIG5vdCBucC5pc2Zpbml0ZShyZXN1bHQpLmFsbCgpOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWRfZW5jb2Rlcl9vdXRwdXQiKQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBzdGF0ZV9kaWN0X2hhc2gobW9kZWw6IG5uLk1vZHVsZSkgLT4gc3RyOgogICAgZGlnZXN0ID0gaGFzaGxpYi5zaGEyNTYoKQogICAgZm9yIG5hbWUsIHRlbnNvciBpbiBzb3J0ZWQobW9kZWwuc3RhdGVfZGljdCgpLml0ZW1zKCkpOgogICAgICAgIHZhbHVlID0gdGVuc29yLmRldGFjaCgpLmNwdSgpLmNvbnRpZ3VvdXMoKQogICAgICAgIGRpZ2VzdC51cGRhdGUobmFtZS5lbmNvZGUoInV0Zi04IikgKyBiIlwwIikKICAgICAgICBkaWdlc3QudXBkYXRlKHN0cih2YWx1ZS5kdHlwZSkuZW5jb2RlKCJ1dGYtOCIpICsgYiJcMCIpCiAgICAgICAgZGlnZXN0LnVwZGF0ZShqc29uLmR1bXBzKGxpc3QodmFsdWUuc2hhcGUpKS5lbmNvZGUoInV0Zi04IikgKyBiIlwwIikKICAgICAgICBkaWdlc3QudXBkYXRlKHZhbHVlLm51bXB5KCkudG9ieXRlcygpKQogICAgcmV0dXJuIGRpZ2VzdC5oZXhkaWdlc3QoKQoKCmRlZiBidWlsZF9tb2RlbChjaGVja3BvaW50OiBQYXRoLCBkZXZpY2U6IHN0cikgLT4gdHVwbGVbbm4uTW9kdWxlLCBzdHJdOgogICAgaWYgc2hhMjU2X2ZpbGUoY2hlY2twb2ludCkgIT0gRVhQRUNURURfUkVTTkVUMThfRklMRV9TSEEyNTY6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJvZmZsaW5lX2NoZWNrcG9pbnRfZmlsZV9oYXNoX21pc21hdGNoIikKICAgIHN0YXRlID0gdG9yY2gubG9hZChjaGVja3BvaW50LCBtYXBfbG9jYXRpb249ImNwdSIsIHdlaWdodHNfb25seT1UcnVlKQogICAgbW9kZWwgPSByZXNuZXQxOCh3ZWlnaHRzPU5vbmUpCiAgICBtb2RlbC5sb2FkX3N0YXRlX2RpY3Qoc3RhdGUsIHN0cmljdD1UcnVlKQogICAgbW9kZWwuZmMgPSBubi5JZGVudGl0eSgpCiAgICBtb2RlbCA9IG1vZGVsLmV2YWwoKS50byhkZXZpY2UpCiAgICBmb3IgcGFyYW1ldGVyIGluIG1vZGVsLnBhcmFtZXRlcnMoKToKICAgICAgICBwYXJhbWV0ZXIucmVxdWlyZXNfZ3JhZF8oRmFsc2UpCiAgICBiYWNrYm9uZV9oYXNoID0gc3RhdGVfZGljdF9oYXNoKG1vZGVsKQogICAgaWYgYmFja2JvbmVfaGFzaCAhPSBFWFBFQ1RFRF9SRVNORVQxOF9CQUNLQk9ORV9TSEEyNTY6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJvZmZsaW5lX2NoZWNrcG9pbnRfc3RhdGVfaGFzaF9taXNtYXRjaCIpCiAgICByZXR1cm4gbW9kZWwsIGJhY2tib25lX2hhc2gKCgpkZWYgd3JpdGVfY3N2KGZyYW1lOiBwZC5EYXRhRnJhbWUsIHBhdGg6IFBhdGgpIC0+IE5vbmU6CiAgICBmcmFtZS50b19jc3YocGF0aCwgaW5kZXg9RmFsc2UsIGxpbmV0ZXJtaW5hdG9yPSJcbiIsIGZsb2F0X2Zvcm1hdD0iJS4xMGciKQoKCmRlZiBmZWF0dXJlX2NvZGVfaGFzaCgpIC0+IHN0cjoKICAgIGZ1bmN0aW9ucyA9IFtnZW9tZXRyeV9vcmRlcmVkX3BhdGhzLCBjZW50cmFsX2ZpdmVfaW5kaWNlcywgdW5pZm9ybV9zaXh0ZWVuX2luZGljZXMsIGRlY29kZV9hbmRfc2NhbGUsIHByZXByb2Nlc3MsIGVuY29kZSwgZXF1YWxfc2VyaWVzX21lYW4sIHBsYW5lX2JhbGFuY2VkX21lYW5dCiAgICByZXR1cm4gc2hhMjU2X3RleHQoIlxuIi5qb2luKGluc3BlY3QuZ2V0c291cmNlKGZ1bmN0aW9uKSBmb3IgZnVuY3Rpb24gaW4gZnVuY3Rpb25zKSkKCgpkZWYgcHJvY2Vzc19zZXJpZXMoCiAgICByb3c6IG9iamVjdCwKICAgIGRpY29tX3Jvb3Q6IFBhdGgsCiAgICBtb2RlbDogbm4uTW9kdWxlLAogICAgZGV2aWNlOiBzdHIsCiAgICBwcmVwcm9jZXNzaW5nX2hhc2g6IHN0ciwKICAgIGVuY29kZXJfaGFzaDogc3RyLAogICAgYmFja2JvbmVfaGFzaDogc3RyLAopIC0+IHR1cGxlW2RpY3Rbc3RyLCBvYmplY3RdLCBsaXN0W2RpY3Rbc3RyLCBvYmplY3RdXSwgbnAubmRhcnJheSwgbnAubmRhcnJheSwgbnAubmRhcnJheV06CiAgICBzZXJpZXNfZGlyID0gZGljb21fcm9vdCAvIHN0cihyb3cuU3R1ZHlJbnN0YW5jZVVJRCkgLyBzdHIocm93LlNlcmllc0luc3RhbmNlVUlEKQogICAgaWYgbm90IHNlcmllc19kaXIuaXNfZGlyKCk6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic2VyaWVzX2RpcmVjdG9yeV9taXNzaW5nIikKICAgIHJlY29yZHMsIGhlYWRlcl9kaWdlc3QgPSBnZW9tZXRyeV9vcmRlcmVkX3BhdGhzKHNlcmllc19kaXIpCiAgICBjZW50cmFsX2luZGljZXMsIHVuaWZvcm1faW5kaWNlcywgdW5pb25faW5kaWNlcyA9IGV4dHJhY3Rpb25faW5kaWNlcyhsZW4ocmVjb3JkcykpCiAgICBpbWFnZXMgPSBbXQogICAgc2VsZWN0ZWRfbWV0YWRhdGEgPSBbXQogICAgZm9yIG9yZGVyZWRfaW5kZXggaW4gdW5pb25faW5kaWNlczoKICAgICAgICByZWNvcmQgPSByZWNvcmRzW29yZGVyZWRfaW5kZXhdCiAgICAgICAgc2NhbGVkLCBkaWNvbV9oYXNoLCBwaXhlbF9oYXNoID0gZGVjb2RlX2FuZF9zY2FsZShQYXRoKHJlY29yZFsicGF0aCJdKSkKICAgICAgICBpbWFnZXMuYXBwZW5kKHNjYWxlZCkKICAgICAgICBzZWxlY3RlZF9tZXRhZGF0YS5hcHBlbmQoKG9yZGVyZWRfaW5kZXgsIGRpY29tX2hhc2gsIHBpeGVsX2hhc2gsIHJlY29yZFsic29wX2luc3RhbmNlX3NoYTI1NiJdKSkKICAgIGVuY29kZWQgPSBlbmNvZGUobW9kZWwsIGltYWdlcywgZGV2aWNlKQogICAgYnlfaW5kZXggPSB7b3JkZXJlZF9pbmRleDogZW5jb2RlZFtwb3NpdGlvbl0gZm9yIHBvc2l0aW9uLCBvcmRlcmVkX2luZGV4IGluIGVudW1lcmF0ZSh1bmlvbl9pbmRpY2VzKX0KICAgIGNlbnRyYWwgPSBucC5zdGFjayhbYnlfaW5kZXhbaW5kZXhdIGZvciBpbmRleCBpbiBjZW50cmFsX2luZGljZXNdKS5tZWFuKGF4aXM9MCwgZHR5cGU9bnAuZmxvYXQ2NCkuYXN0eXBlKG5wLmZsb2F0MzIpCiAgICB1bmlmb3JtID0gbnAuc3RhY2soW2J5X2luZGV4W2luZGV4XSBmb3IgaW5kZXggaW4gdW5pZm9ybV9pbmRpY2VzXSkubWVhbihheGlzPTAsIGR0eXBlPW5wLmZsb2F0NjQpLmFzdHlwZShucC5mbG9hdDMyKQogICAgc2xpY2Vfcm93cyA9IFtdCiAgICBmb3IgZmVhdHVyZSwgKG9yZGVyZWRfaW5kZXgsIGRpY29tX2hhc2gsIHBpeGVsX2hhc2gsIHNvcF9oYXNoKSBpbiB6aXAoZW5jb2RlZCwgc2VsZWN0ZWRfbWV0YWRhdGEsIHN0cmljdD1UcnVlKToKICAgICAgICBrZXkgPSBjYW5vbmljYWxfaGFzaCgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInN0dWR5X2lkX3NoYTI1NiI6IHJvdy5zdHVkeV9pZF9zaGEyNTYsCiAgICAgICAgICAgICAgICAic2VyaWVzX2lkX3NoYTI1NiI6IHJvdy5zZXJpZXNfaWRfc2hhMjU2LAogICAgICAgICAgICAgICAgIm9yZGVyZWRfc2xpY2VfaW5kZXgiOiBpbnQob3JkZXJlZF9pbmRleCksCiAgICAgICAgICAgICAgICAic29wX2luc3RhbmNlX3NoYTI1NiI6IHNvcF9oYXNoLAogICAgICAgICAgICAgICAgImRpY29tX3NoYTI1NiI6IGRpY29tX2hhc2gsCiAgICAgICAgICAgICAgICAic2NhbGVkX3BpeGVsX3NoYTI1NiI6IHBpeGVsX2hhc2gsCiAgICAgICAgICAgICAgICAicHJlcHJvY2Vzc2luZ19zaGEyNTYiOiBwcmVwcm9jZXNzaW5nX2hhc2gsCiAgICAgICAgICAgICAgICAiZW5jb2Rlcl9jb2RlX3NoYTI1NiI6IGVuY29kZXJfaGFzaCwKICAgICAgICAgICAgICAgICJyZXNuZXQxOF9iYWNrYm9uZV9zaGEyNTYiOiBiYWNrYm9uZV9oYXNoLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHNsaWNlX3Jvd3MuYXBwZW5kKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiZ2xvYmFsX3Nlcmllc19pbmRleCI6IGludChyb3cuZ2xvYmFsX3Nlcmllc19pbmRleCksCiAgICAgICAgICAgICAgICAic3R1ZHlfaWRfc2hhMjU2Ijogcm93LnN0dWR5X2lkX3NoYTI1NiwKICAgICAgICAgICAgICAgICJzZXJpZXNfaWRfc2hhMjU2Ijogcm93LnNlcmllc19pZF9zaGEyNTYsCiAgICAgICAgICAgICAgICAib3JkZXJlZF9zbGljZV9pbmRleCI6IGludChvcmRlcmVkX2luZGV4KSwKICAgICAgICAgICAgICAgICJjZW50cmFsX2ZpdmUiOiBpbnQob3JkZXJlZF9pbmRleCBpbiBjZW50cmFsX2luZGljZXMpLAogICAgICAgICAgICAgICAgInVuaWZvcm1fc2l4dGVlbiI6IGludChvcmRlcmVkX2luZGV4IGluIHVuaWZvcm1faW5kaWNlcyksCiAgICAgICAgICAgICAgICAic2xpY2VfY2FjaGVfa2V5Ijoga2V5LAogICAgICAgICAgICAgICAgInNsaWNlX2ZlYXR1cmVfc2hhMjU2Ijogc2hhMjU2X2J5dGVzKGZlYXR1cmUudG9ieXRlcygpKSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgIGNlbnRyYWxfa2V5cyA9IFtzbGljZV9yb3dzW3VuaW9uX2luZGljZXMuaW5kZXgoaW5kZXgpXVsic2xpY2VfY2FjaGVfa2V5Il0gZm9yIGluZGV4IGluIGNlbnRyYWxfaW5kaWNlc10KICAgIHVuaWZvcm1fa2V5cyA9IFtzbGljZV9yb3dzW3VuaW9uX2luZGljZXMuaW5kZXgoaW5kZXgpXVsic2xpY2VfY2FjaGVfa2V5Il0gZm9yIGluZGV4IGluIHVuaWZvcm1faW5kaWNlc10KICAgIHNlcmllc19yb3cgPSB7CiAgICAgICAgImdsb2JhbF9zZXJpZXNfaW5kZXgiOiBpbnQocm93Lmdsb2JhbF9zZXJpZXNfaW5kZXgpLAogICAgICAgICJjb2hvcnRfa2luZCI6IHJvdy5jb2hvcnRfa2luZCwKICAgICAgICAiY29ob3J0X2luZGV4IjogaW50KHJvdy5jb2hvcnRfaW5kZXgpLAogICAgICAgICJwYXRpZW50X2lkX3NoYTI1NiI6IHJvdy5wYXRpZW50X2lkX3NoYTI1NiwKICAgICAgICAic3R1ZHlfaWRfc2hhMjU2Ijogcm93LnN0dWR5X2lkX3NoYTI1NiwKICAgICAgICAic2VyaWVzX2lkX3NoYTI1NiI6IHJvdy5zZXJpZXNfaWRfc2hhMjU2LAogICAgICAgICJhbmF0b21pY2FsX3BsYW5lIjogcm93LmFuYXRvbWljYWxfcGxhbmUsCiAgICAgICAgInN0YXR1cyI6ICJWQUxJRCIsCiAgICAgICAgImZhaWx1cmVfcmVhc29uIjogIiIsCiAgICAgICAgImdlb21ldHJ5X29yZGVyZWRfc2xpY2VzIjogbGVuKHJlY29yZHMpLAogICAgICAgICJoZWFkZXJfZGlnZXN0X3NoYTI1NiI6IGhlYWRlcl9kaWdlc3QsCiAgICAgICAgImNlbnRyYWxfZml2ZV9pbmRpY2VzIjoganNvbi5kdW1wcyhjZW50cmFsX2luZGljZXMsIHNlcGFyYXRvcnM9KCIsIiwgIjoiKSksCiAgICAgICAgInVuaWZvcm1fc2l4dGVlbl9pbmRpY2VzIjoganNvbi5kdW1wcyh1bmlmb3JtX2luZGljZXMsIHNlcGFyYXRvcnM9KCIsIiwgIjoiKSksCiAgICAgICAgImV4dHJhY3RlZF91bmlvbl9pbmRpY2VzIjoganNvbi5kdW1wcyh1bmlvbl9pbmRpY2VzLCBzZXBhcmF0b3JzPSgiLCIsICI6IikpLAogICAgICAgICJjZW50cmFsX2ZpdmVfZmVhdHVyZV9zaGEyNTYiOiBzaGEyNTZfYnl0ZXMoY2VudHJhbC50b2J5dGVzKCkpLAogICAgICAgICJ1bmlmb3JtX3NpeHRlZW5fZmVhdHVyZV9zaGEyNTYiOiBzaGEyNTZfYnl0ZXModW5pZm9ybS50b2J5dGVzKCkpLAogICAgICAgICJjZW50cmFsX2ZpdmVfY2FjaGVfa2V5IjogY2Fub25pY2FsX2hhc2goeyJzbGljZV9jYWNoZV9rZXlzIjogY2VudHJhbF9rZXlzLCAicG9vbGluZyI6ICJhcml0aG1ldGljX21lYW4iLCAic2VyaWVzX2lkX3NoYTI1NiI6IHJvdy5zZXJpZXNfaWRfc2hhMjU2fSksCiAgICAgICAgInVuaWZvcm1fc2l4dGVlbl9jYWNoZV9rZXkiOiBjYW5vbmljYWxfaGFzaCh7InNsaWNlX2NhY2hlX2tleXMiOiB1bmlmb3JtX2tleXMsICJwb29saW5nIjogImFyaXRobWV0aWNfbWVhbiIsICJzZXJpZXNfaWRfc2hhMjU2Ijogcm93LnNlcmllc19pZF9zaGEyNTZ9KSwKICAgIH0KICAgIHJldHVybiBzZXJpZXNfcm93LCBzbGljZV9yb3dzLCBlbmNvZGVkLCBjZW50cmFsLCB1bmlmb3JtCgoKZGVmIHRleHRfYXJ0aWZhY3RfcHJpdmFjeV9zY2FuKG91dHB1dF9kaXI6IFBhdGgpIC0+IHR1cGxlW2Jvb2wsIGxpc3Rbc3RyXV06CiAgICBvZmZlbmRlcnMgPSBbXQogICAgZm9yIHBhdGggaW4gc29ydGVkKG91dHB1dF9kaXIuaXRlcmRpcigpKToKICAgICAgICBpZiBwYXRoLnN1ZmZpeC5sb3dlcigpIGluIHsiLmNzdiIsICIuanNvbiIsICIubG9nIiwgIi5tZCIsICIudHh0In0gYW5kIFJBV19VSURfUEFUVEVSTi5zZWFyY2gocGF0aC5yZWFkX2J5dGVzKCkpOgogICAgICAgICAgICBvZmZlbmRlcnMuYXBwZW5kKHBhdGgubmFtZSkKICAgIHJldHVybiBub3Qgb2ZmZW5kZXJzLCBvZmZlbmRlcnMKCgpkZWYgbWFpbigpIC0+IE5vbmU6CiAgICB0b3JjaC5tYW51YWxfc2VlZChTRUVEKQogICAgdG9yY2guYmFja2VuZHMuY3Vkbm4uYmVuY2htYXJrID0gRmFsc2UKICAgIHRvcmNoLmJhY2tlbmRzLmN1ZG5uLmRldGVybWluaXN0aWMgPSBUcnVlCiAgICBvdXRwdXRfZGlyID0gUGF0aCgiL2thZ2dsZS93b3JraW5nIiBpZiBQYXRoKCIva2FnZ2xlL3dvcmtpbmciKS5pc19kaXIoKSBlbHNlICIuIikucmVzb2x2ZSgpCiAgICBzdGFydGVkID0gdGltZS5wZXJmX2NvdW50ZXIoKQogICAgaW5wdXRfcm9vdCA9IHJlc29sdmVfcHJpdmF0ZV9pbnB1dCgpCiAgICBleHBlY3RlZCwgc2lsdmVyX3N0dWRpZXMsIGlucHV0X21hbmlmZXN0ID0gdmFsaWRhdGVfcHJpdmF0ZV9pbnB1dChpbnB1dF9yb290KQogICAgc2VyaWVzX2NzdiwgZGljb21fcm9vdCA9IHJlc29sdmVfY29tcGV0aXRpb25fZGF0YSgpCiAgICBtYXBwZWQgPSBtYXBfcmF3X3NlcmllcyhleHBlY3RlZCwgc2VyaWVzX2NzdikKICAgIGRldmljZSwgZmFsbGJhY2tfcmVhc29uLCBhc3NpZ25lZF9ncHUgPSBzZWxlY3RfZGV2aWNlKCkKICAgIGlmIGRldmljZSA9PSAiY3VkYSI6CiAgICAgICAgdG9yY2guY3VkYS5yZXNldF9wZWFrX21lbW9yeV9zdGF0cygpCiAgICBtb2RlbCwgYmFja2JvbmVfaGFzaCA9IGJ1aWxkX21vZGVsKGlucHV0X3Jvb3QgLyAicmVzbmV0MTgtZjM3MDcyZmQucHRoIiwgZGV2aWNlKQogICAgZW5jb2Rlcl9oYXNoID0gZmVhdHVyZV9jb2RlX2hhc2goKQogICAgcHJlcHJvY2Vzc2luZ19oYXNoID0gY2Fub25pY2FsX2hhc2goUFJFUFJPQ0VTU0lOR19TUEVDKQogICAga2VybmVsX2hhc2ggPSBzaGEyNTZfZmlsZShQYXRoKF9fZmlsZV9fKS5yZXNvbHZlKCkpCgogICAgc3R1ZHlfb3JkZXIgPSBleHBlY3RlZFtbImNvaG9ydF9raW5kIiwgImNvaG9ydF9pbmRleCIsICJwYXRpZW50X2lkX3NoYTI1NiIsICJzdHVkeV9pZF9zaGEyNTYiXV0uZHJvcF9kdXBsaWNhdGVzKCkucmVzZXRfaW5kZXgoZHJvcD1UcnVlKQogICAgaWYgbGVuKHN0dWR5X29yZGVyKSAhPSA1NzA6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJjb21iaW5lZF9zdHVkeV9vcmRlcl9pbnZhbGlkIikKCiAgICBzZXJpZXNfcm93czogbGlzdFtkaWN0W3N0ciwgb2JqZWN0XV0gPSBbXQogICAgc2xpY2Vfcm93czogbGlzdFtkaWN0W3N0ciwgb2JqZWN0XV0gPSBbXQogICAgY2VudHJhbF9mZWF0dXJlczogZGljdFtpbnQsIG5wLm5kYXJyYXldID0ge30KICAgIHVuaWZvcm1fZmVhdHVyZXM6IGRpY3RbaW50LCBucC5uZGFycmF5XSA9IHt9CiAgICBzaGFyZF9yZWNvcmRzOiBsaXN0W2RpY3Rbc3RyLCBvYmplY3RdXSA9IFtdCiAgICB0aW1lX2xpbWl0X2hpdCA9IEZhbHNlCiAgICBwcm9jZXNzaW5nX3NlY29uZHMgPSAwLjAKCiAgICBmb3Igc2hhcmRfaW5kZXgsIHN0YXJ0IGluIGVudW1lcmF0ZShyYW5nZSgwLCBsZW4oc3R1ZHlfb3JkZXIpLCBTVFVESUVTX1BFUl9TSEFSRCkpOgogICAgICAgIGlmIHRpbWUucGVyZl9jb3VudGVyKCkgLSBzdGFydGVkID4gU0FGRV9TVE9QX1NFQ09ORFM6CiAgICAgICAgICAgIHRpbWVfbGltaXRfaGl0ID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgICAgIHNoYXJkX3N0dWRpZXMgPSBzZXQoc3R1ZHlfb3JkZXIuaWxvY1tzdGFydCA6IHN0YXJ0ICsgU1RVRElFU19QRVJfU0hBUkRdLnN0dWR5X2lkX3NoYTI1NikKICAgICAgICBzaGFyZF9zZXJpZXMgPSBtYXBwZWRbbWFwcGVkLnN0dWR5X2lkX3NoYTI1Ni5pc2luKHNoYXJkX3N0dWRpZXMpXS5zb3J0X3ZhbHVlcygiZ2xvYmFsX3Nlcmllc19pbmRleCIsIGtpbmQ9Im1lcmdlc29ydCIpCiAgICAgICAgc2hhcmRfc2xpY2VfZmVhdHVyZXM6IGxpc3RbbnAubmRhcnJheV0gPSBbXQogICAgICAgIHNoYXJkX3NsaWNlX3Nlcmllc19pbmRpY2VzOiBsaXN0W2ludF0gPSBbXQogICAgICAgIHNoYXJkX3NsaWNlX29yZGVyZWRfaW5kaWNlczogbGlzdFtpbnRdID0gW10KICAgICAgICBzaGFyZF9zbGljZV9jZW50cmFsOiBsaXN0W2ludF0gPSBbXQogICAgICAgIHNoYXJkX3NsaWNlX3VuaWZvcm06IGxpc3RbaW50XSA9IFtdCiAgICAgICAgc2hhcmRfc2VyaWVzX2luZGljZXM6IGxpc3RbaW50XSA9IFtdCiAgICAgICAgc2hhcmRfY2VudHJhbDogbGlzdFtucC5uZGFycmF5XSA9IFtdCiAgICAgICAgc2hhcmRfdW5pZm9ybTogbGlzdFtucC5uZGFycmF5XSA9IFtdCgogICAgICAgIGZvciByb3cgaW4gc2hhcmRfc2VyaWVzLml0ZXJ0dXBsZXMoaW5kZXg9RmFsc2UpOgogICAgICAgICAgICBzZXJpZXNfc3RhcnRlZCA9IHRpbWUucGVyZl9jb3VudGVyKCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VyaWVzX3JvdywgY3VycmVudF9zbGljZXMsIGVuY29kZWQsIGNlbnRyYWwsIHVuaWZvcm0gPSBwcm9jZXNzX3NlcmllcygKICAgICAgICAgICAgICAgICAgICByb3csIGRpY29tX3Jvb3QsIG1vZGVsLCBkZXZpY2UsIHByZXByb2Nlc3NpbmdfaGFzaCwgZW5jb2Rlcl9oYXNoLCBiYWNrYm9uZV9oYXNoCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBnbG9iYWxfaW5kZXggPSBpbnQocm93Lmdsb2JhbF9zZXJpZXNfaW5kZXgpCiAgICAgICAgICAgICAgICBjZW50cmFsX2ZlYXR1cmVzW2dsb2JhbF9pbmRleF0gPSBjZW50cmFsCiAgICAgICAgICAgICAgICB1bmlmb3JtX2ZlYXR1cmVzW2dsb2JhbF9pbmRleF0gPSB1bmlmb3JtCiAgICAgICAgICAgICAgICBzaGFyZF9zZXJpZXNfaW5kaWNlcy5hcHBlbmQoZ2xvYmFsX2luZGV4KQogICAgICAgICAgICAgICAgc2hhcmRfY2VudHJhbC5hcHBlbmQoY2VudHJhbCkKICAgICAgICAgICAgICAgIHNoYXJkX3VuaWZvcm0uYXBwZW5kKHVuaWZvcm0pCiAgICAgICAgICAgICAgICBmb3IgZmVhdHVyZSwgaXRlbSBpbiB6aXAoZW5jb2RlZCwgY3VycmVudF9zbGljZXMsIHN0cmljdD1UcnVlKToKICAgICAgICAgICAgICAgICAgICBzaGFyZF9zbGljZV9mZWF0dXJlcy5hcHBlbmQoZmVhdHVyZSkKICAgICAgICAgICAgICAgICAgICBzaGFyZF9zbGljZV9zZXJpZXNfaW5kaWNlcy5hcHBlbmQoZ2xvYmFsX2luZGV4KQogICAgICAgICAgICAgICAgICAgIHNoYXJkX3NsaWNlX29yZGVyZWRfaW5kaWNlcy5hcHBlbmQoaW50KGl0ZW1bIm9yZGVyZWRfc2xpY2VfaW5kZXgiXSkpCiAgICAgICAgICAgICAgICAgICAgc2hhcmRfc2xpY2VfY2VudHJhbC5hcHBlbmQoaW50KGl0ZW1bImNlbnRyYWxfZml2ZSJdKSkKICAgICAgICAgICAgICAgICAgICBzaGFyZF9zbGljZV91bmlmb3JtLmFwcGVuZChpbnQoaXRlbVsidW5pZm9ybV9zaXh0ZWVuIl0pKQogICAgICAgICAgICAgICAgc2xpY2Vfcm93cy5leHRlbmQoY3VycmVudF9zbGljZXMpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyb3I6CiAgICAgICAgICAgICAgICByZWFzb24gPSBzdHIoZXJyb3IpCiAgICAgICAgICAgICAgICBpZiByZWFzb24gbm90IGluIHsKICAgICAgICAgICAgICAgICAgICAic2VyaWVzX2RpcmVjdG9yeV9taXNzaW5nIiwgIm5vX2RpY29tX2ZpbGVzIiwgImluY29tcGxldGVfZ2VvbWV0cnkiLCAibm9uZmluaXRlX2dlb21ldHJ5X2Nvb3JkaW5hdGUiLAogICAgICAgICAgICAgICAgICAgICJkdXBsaWNhdGVfZ2VvbWV0cnlfcG9zaXRpb25zIiwgImZld2VyX3RoYW5fZml2ZV9nZW9tZXRyeV9vcmRlcmVkX3NsaWNlcyIsICJjZW50cmFsX2ZpdmVfaW5kZXhfb3V0X29mX2JvdW5kcyIsCiAgICAgICAgICAgICAgICAgICAgInVuaWZvcm1faW5kZXhfY29uc3RydWN0aW9uX2ZhaWxlZCIsICJkZWNvZGVkX3BpeGVsc19ub3RfMmQiLCAibm9fZmluaXRlX3BpeGVscyIsICJpbnZhbGlkX2VuY29kZXJfb3V0cHV0IiwKICAgICAgICAgICAgICAgIH06CiAgICAgICAgICAgICAgICAgICAgcmVhc29uID0gdHlwZShlcnJvcikuX19uYW1lX18KICAgICAgICAgICAgICAgIHNlcmllc19yb3cgPSB7CiAgICAgICAgICAgICAgICAgICAgImdsb2JhbF9zZXJpZXNfaW5kZXgiOiBpbnQocm93Lmdsb2JhbF9zZXJpZXNfaW5kZXgpLCAiY29ob3J0X2tpbmQiOiByb3cuY29ob3J0X2tpbmQsCiAgICAgICAgICAgICAgICAgICAgImNvaG9ydF9pbmRleCI6IGludChyb3cuY29ob3J0X2luZGV4KSwgInBhdGllbnRfaWRfc2hhMjU2Ijogcm93LnBhdGllbnRfaWRfc2hhMjU2LAogICAgICAgICAgICAgICAgICAgICJzdHVkeV9pZF9zaGEyNTYiOiByb3cuc3R1ZHlfaWRfc2hhMjU2LCAic2VyaWVzX2lkX3NoYTI1NiI6IHJvdy5zZXJpZXNfaWRfc2hhMjU2LAogICAgICAgICAgICAgICAgICAgICJhbmF0b21pY2FsX3BsYW5lIjogcm93LmFuYXRvbWljYWxfcGxhbmUsICJzdGF0dXMiOiAiRkFJTEVEIiwgImZhaWx1cmVfcmVhc29uIjogcmVhc29uLAogICAgICAgICAgICAgICAgICAgICJnZW9tZXRyeV9vcmRlcmVkX3NsaWNlcyI6ICIiLCAiaGVhZGVyX2RpZ2VzdF9zaGEyNTYiOiAiIiwgImNlbnRyYWxfZml2ZV9pbmRpY2VzIjogIiIsCiAgICAgICAgICAgICAgICAgICAgInVuaWZvcm1fc2l4dGVlbl9pbmRpY2VzIjogIiIsICJleHRyYWN0ZWRfdW5pb25faW5kaWNlcyI6ICIiLCAiY2VudHJhbF9maXZlX2ZlYXR1cmVfc2hhMjU2IjogIiIsCiAgICAgICAgICAgICAgICAgICAgInVuaWZvcm1fc2l4dGVlbl9mZWF0dXJlX3NoYTI1NiI6ICIiLCAiY2VudHJhbF9maXZlX2NhY2hlX2tleSI6ICIiLCAidW5pZm9ybV9zaXh0ZWVuX2NhY2hlX2tleSI6ICIiLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBzZXJpZXNfcm93cy5hcHBlbmQoc2VyaWVzX3JvdykKICAgICAgICAgICAgcHJvY2Vzc2luZ19zZWNvbmRzICs9IHRpbWUucGVyZl9jb3VudGVyKCkgLSBzZXJpZXNfc3RhcnRlZAoKICAgICAgICBzaGFyZF9wYXRoID0gb3V0cHV0X2RpciAvIGYiZmVhdHVyZV9zaGFyZF97c2hhcmRfaW5kZXg6MDNkfS5ucHoiCiAgICAgICAgaWYgc2hhcmRfc2VyaWVzX2luZGljZXM6CiAgICAgICAgICAgIG5wLnNhdmV6X2NvbXByZXNzZWQoCiAgICAgICAgICAgICAgICBzaGFyZF9wYXRoLAogICAgICAgICAgICAgICAgc2xpY2VfZmVhdHVyZXM9bnAuc3RhY2soc2hhcmRfc2xpY2VfZmVhdHVyZXMpLmFzdHlwZShucC5mbG9hdDMyKSwKICAgICAgICAgICAgICAgIHNsaWNlX3Nlcmllc19pbmRpY2VzPW5wLmFzYXJyYXkoc2hhcmRfc2xpY2Vfc2VyaWVzX2luZGljZXMsIGR0eXBlPW5wLmludDMyKSwKICAgICAgICAgICAgICAgIHNsaWNlX29yZGVyZWRfaW5kaWNlcz1ucC5hc2FycmF5KHNoYXJkX3NsaWNlX29yZGVyZWRfaW5kaWNlcywgZHR5cGU9bnAuaW50MzIpLAogICAgICAgICAgICAgICAgc2xpY2VfY2VudHJhbF9maXZlPW5wLmFzYXJyYXkoc2hhcmRfc2xpY2VfY2VudHJhbCwgZHR5cGU9bnAudWludDgpLAogICAgICAgICAgICAgICAgc2xpY2VfdW5pZm9ybV9zaXh0ZWVuPW5wLmFzYXJyYXkoc2hhcmRfc2xpY2VfdW5pZm9ybSwgZHR5cGU9bnAudWludDgpLAogICAgICAgICAgICAgICAgc2VyaWVzX2luZGljZXM9bnAuYXNhcnJheShzaGFyZF9zZXJpZXNfaW5kaWNlcywgZHR5cGU9bnAuaW50MzIpLAogICAgICAgICAgICAgICAgY2VudHJhbF9maXZlX3Nlcmllc19mZWF0dXJlcz1ucC5zdGFjayhzaGFyZF9jZW50cmFsKS5hc3R5cGUobnAuZmxvYXQzMiksCiAgICAgICAgICAgICAgICB1bmlmb3JtX3NpeHRlZW5fc2VyaWVzX2ZlYXR1cmVzPW5wLnN0YWNrKHNoYXJkX3VuaWZvcm0pLmFzdHlwZShucC5mbG9hdDMyKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBzaGFyZF9yZWNvcmRzLmFwcGVuZCh7InBhdGgiOiBzaGFyZF9wYXRoLm5hbWUsICJzaGEyNTYiOiBzaGEyNTZfZmlsZShzaGFyZF9wYXRoKSwgImJ5dGVzIjogc2hhcmRfcGF0aC5zdGF0KCkuc3Rfc2l6ZSwgInNlcmllcyI6IGxlbihzaGFyZF9zZXJpZXNfaW5kaWNlcyksICJzbGljZXMiOiBsZW4oc2hhcmRfc2xpY2VfZmVhdHVyZXMpfSkKICAgICAgICBwcmludChqc29uLmR1bXBzKHsic2hhcmQiOiBzaGFyZF9pbmRleCwgInNlcmllc19wcm9jZXNzZWQiOiBsZW4oc2hhcmRfc2VyaWVzKSwgInZhbGlkX3NlcmllcyI6IGxlbihzaGFyZF9zZXJpZXNfaW5kaWNlcyksICJlbGFwc2VkX3NlY29uZHMiOiB0aW1lLnBlcmZfY291bnRlcigpIC0gc3RhcnRlZH0sIHNvcnRfa2V5cz1UcnVlKSkKCiAgICBzZXJpZXNfbWFuaWZlc3QgPSBwZC5EYXRhRnJhbWUoc2VyaWVzX3Jvd3MpLnNvcnRfdmFsdWVzKCJnbG9iYWxfc2VyaWVzX2luZGV4Iiwga2luZD0ibWVyZ2Vzb3J0IikucmVzZXRfaW5kZXgoZHJvcD1UcnVlKQogICAgc2xpY2VfbWFuaWZlc3QgPSBwZC5EYXRhRnJhbWUoc2xpY2Vfcm93cykuc29ydF92YWx1ZXMoWyJnbG9iYWxfc2VyaWVzX2luZGV4IiwgIm9yZGVyZWRfc2xpY2VfaW5kZXgiXSwga2luZD0ibWVyZ2Vzb3J0IikucmVzZXRfaW5kZXgoZHJvcD1UcnVlKQogICAgd3JpdGVfY3N2KHNlcmllc19tYW5pZmVzdCwgb3V0cHV0X2RpciAvICJzZXJpZXNfZmVhdHVyZV9tYW5pZmVzdC5jc3YiKQogICAgd3JpdGVfY3N2KHNsaWNlX21hbmlmZXN0LCBvdXRwdXRfZGlyIC8gInNsaWNlX2ZlYXR1cmVfbWFuaWZlc3QuY3N2IikKCiAgICBzdHVkeV9yb3dzID0gW10KICAgIGNlbnRyYWxfZXF1YWxfdmFsdWVzID0gW10KICAgIGNlbnRyYWxfcGxhbmVfdmFsdWVzID0gW10KICAgIHVuaWZvcm1fZXF1YWxfdmFsdWVzID0gW10KICAgIHVuaWZvcm1fcGxhbmVfdmFsdWVzID0gW10KICAgIGZvciBzdHVkeSBpbiBzdHVkeV9vcmRlci5pdGVydHVwbGVzKGluZGV4PUZhbHNlKToKICAgICAgICByb3dzID0gc2VyaWVzX21hbmlmZXN0WyhzZXJpZXNfbWFuaWZlc3Quc3R1ZHlfaWRfc2hhMjU2ID09IHN0dWR5LnN0dWR5X2lkX3NoYTI1NikgJiAoc2VyaWVzX21hbmlmZXN0LnN0YXR1cyA9PSAiVkFMSUQiKV0KICAgICAgICBpbmRpY2VzID0gcm93cy5nbG9iYWxfc2VyaWVzX2luZGV4LmFzdHlwZShpbnQpLnRvbGlzdCgpCiAgICAgICAgcGxhbmVzID0gcm93cy5hbmF0b21pY2FsX3BsYW5lLnRvbGlzdCgpCiAgICAgICAgY29tcGxldGUgPSBib29sKGluZGljZXMpIGFuZCBhbGwocGxhbmUgaW4gcGxhbmVzIGZvciBwbGFuZSBpbiBQTEFORVMpCiAgICAgICAgaWYgY29tcGxldGU6CiAgICAgICAgICAgIGNlbnRyYWxfYXJyYXkgPSBucC5zdGFjayhbY2VudHJhbF9mZWF0dXJlc1tpbmRleF0gZm9yIGluZGV4IGluIGluZGljZXNdKQogICAgICAgICAgICB1bmlmb3JtX2FycmF5ID0gbnAuc3RhY2soW3VuaWZvcm1fZmVhdHVyZXNbaW5kZXhdIGZvciBpbmRleCBpbiBpbmRpY2VzXSkKICAgICAgICAgICAgY2UgPSBlcXVhbF9zZXJpZXNfbWVhbihjZW50cmFsX2FycmF5KQogICAgICAgICAgICBjcCA9IHBsYW5lX2JhbGFuY2VkX21lYW4oY2VudHJhbF9hcnJheSwgcGxhbmVzKQogICAgICAgICAgICB1ZSA9IGVxdWFsX3Nlcmllc19tZWFuKHVuaWZvcm1fYXJyYXkpCiAgICAgICAgICAgIHVwID0gcGxhbmVfYmFsYW5jZWRfbWVhbih1bmlmb3JtX2FycmF5LCBwbGFuZXMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY2UgPSBjcCA9IHVlID0gdXAgPSBucC5mdWxsKDUxMiwgbnAubmFuLCBkdHlwZT1ucC5mbG9hdDMyKQogICAgICAgIGNlbnRyYWxfZXF1YWxfdmFsdWVzLmFwcGVuZChjZSkKICAgICAgICBjZW50cmFsX3BsYW5lX3ZhbHVlcy5hcHBlbmQoY3ApCiAgICAgICAgdW5pZm9ybV9lcXVhbF92YWx1ZXMuYXBwZW5kKHVlKQogICAgICAgIHVuaWZvcm1fcGxhbmVfdmFsdWVzLmFwcGVuZCh1cCkKICAgICAgICBzdHVkeV9yb3dzLmFwcGVuZCgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImNvaG9ydF9raW5kIjogc3R1ZHkuY29ob3J0X2tpbmQsICJjb2hvcnRfaW5kZXgiOiBpbnQoc3R1ZHkuY29ob3J0X2luZGV4KSwKICAgICAgICAgICAgICAgICJwYXRpZW50X2lkX3NoYTI1NiI6IHN0dWR5LnBhdGllbnRfaWRfc2hhMjU2LCAic3R1ZHlfaWRfc2hhMjU2Ijogc3R1ZHkuc3R1ZHlfaWRfc2hhMjU2LAogICAgICAgICAgICAgICAgInN0YXR1cyI6ICJDT01QTEVURV9USFJFRV9QTEFORSIgaWYgY29tcGxldGUgZWxzZSAiSU5DT01QTEVURSIsCiAgICAgICAgICAgICAgICAidmFsaWRfc2VyaWVzIjogbGVuKGluZGljZXMpLCAiYXhpYWxfc2VyaWVzIjogcGxhbmVzLmNvdW50KCJBeGlhbCIpLCAiY29yb25hbF9zZXJpZXMiOiBwbGFuZXMuY291bnQoIkNvcm9uYWwiKSwKICAgICAgICAgICAgICAgICJzYWdpdHRhbF9zZXJpZXMiOiBwbGFuZXMuY291bnQoIlNhZ2l0dGFsIiksCiAgICAgICAgICAgICAgICAiY2VudHJhbF9maXZlX2VxdWFsX3Nlcmllc19zaGEyNTYiOiBzaGEyNTZfYnl0ZXMoY2UudG9ieXRlcygpKSBpZiBjb21wbGV0ZSBlbHNlICIiLAogICAgICAgICAgICAgICAgImNlbnRyYWxfZml2ZV9wbGFuZV9iYWxhbmNlZF9zaGEyNTYiOiBzaGEyNTZfYnl0ZXMoY3AudG9ieXRlcygpKSBpZiBjb21wbGV0ZSBlbHNlICIiLAogICAgICAgICAgICAgICAgInVuaWZvcm1fc2l4dGVlbl9lcXVhbF9zZXJpZXNfc2hhMjU2Ijogc2hhMjU2X2J5dGVzKHVlLnRvYnl0ZXMoKSkgaWYgY29tcGxldGUgZWxzZSAiIiwKICAgICAgICAgICAgICAgICJ1bmlmb3JtX3NpeHRlZW5fcGxhbmVfYmFsYW5jZWRfc2hhMjU2Ijogc2hhMjU2X2J5dGVzKHVwLnRvYnl0ZXMoKSkgaWYgY29tcGxldGUgZWxzZSAiIiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgIHN0dWR5X21hbmlmZXN0ID0gcGQuRGF0YUZyYW1lKHN0dWR5X3Jvd3MpCiAgICB3cml0ZV9jc3Yoc3R1ZHlfbWFuaWZlc3QsIG91dHB1dF9kaXIgLyAic3R1ZHlfZmVhdHVyZV9tYW5pZmVzdC5jc3YiKQogICAgc3R1ZHlfY2FjaGVfcGF0aCA9IG91dHB1dF9kaXIgLyAic3R1ZHlfZmVhdHVyZXMubnB6IgogICAgbnAuc2F2ZXpfY29tcHJlc3NlZCgKICAgICAgICBzdHVkeV9jYWNoZV9wYXRoLAogICAgICAgIGNvaG9ydF9raW5kPXN0dWR5X21hbmlmZXN0LmNvaG9ydF9raW5kLnRvX251bXB5KGR0eXBlPSJVMjQiKSwKICAgICAgICBjb2hvcnRfaW5kZXg9c3R1ZHlfbWFuaWZlc3QuY29ob3J0X2luZGV4LnRvX251bXB5KGR0eXBlPW5wLmludDMyKSwKICAgICAgICBwYXRpZW50X2lkX3NoYTI1Nj1zdHVkeV9tYW5pZmVzdC5wYXRpZW50X2lkX3NoYTI1Ni50b19udW1weShkdHlwZT0iVTY0IiksCiAgICAgICAgc3R1ZHlfaWRfc2hhMjU2PXN0dWR5X21hbmlmZXN0LnN0dWR5X2lkX3NoYTI1Ni50b19udW1weShkdHlwZT0iVTY0IiksCiAgICAgICAgY2VudHJhbF9maXZlX2VxdWFsX3Nlcmllcz1ucC5zdGFjayhjZW50cmFsX2VxdWFsX3ZhbHVlcykuYXN0eXBlKG5wLmZsb2F0MzIpLAogICAgICAgIGNlbnRyYWxfZml2ZV9wbGFuZV9iYWxhbmNlZD1ucC5zdGFjayhjZW50cmFsX3BsYW5lX3ZhbHVlcykuYXN0eXBlKG5wLmZsb2F0MzIpLAogICAgICAgIHVuaWZvcm1fc2l4dGVlbl9lcXVhbF9zZXJpZXM9bnAuc3RhY2sodW5pZm9ybV9lcXVhbF92YWx1ZXMpLmFzdHlwZShucC5mbG9hdDMyKSwKICAgICAgICB1bmlmb3JtX3NpeHRlZW5fcGxhbmVfYmFsYW5jZWQ9bnAuc3RhY2sodW5pZm9ybV9wbGFuZV92YWx1ZXMpLmFzdHlwZShucC5mbG9hdDMyKSwKICAgICkKCiAgICB2YWxpZF9zZXJpZXMgPSBpbnQoKHNlcmllc19tYW5pZmVzdC5zdGF0dXMgPT0gIlZBTElEIikuc3VtKCkpCiAgICBjb21wbGV0ZV9zdHVkaWVzID0gaW50KChzdHVkeV9tYW5pZmVzdC5zdGF0dXMgPT0gIkNPTVBMRVRFX1RIUkVFX1BMQU5FIikuc3VtKCkpCiAgICBzaWx2ZXJfY29tcGxldGUgPSBpbnQoKChzdHVkeV9tYW5pZmVzdC5jb2hvcnRfa2luZCA9PSAic2lsdmVyX3RyYWluaW5nIikgJiAoc3R1ZHlfbWFuaWZlc3Quc3RhdHVzID09ICJDT01QTEVURV9USFJFRV9QTEFORSIpKS5zdW0oKSkKICAgIGdvbGRfY29tcGxldGUgPSBpbnQoKChzdHVkeV9tYW5pZmVzdC5jb2hvcnRfa2luZCA9PSAiZXhwZXJ0X2dvbGRfZXZhbHVhdGlvbiIpICYgKHN0dWR5X21hbmlmZXN0LnN0YXR1cyA9PSAiQ09NUExFVEVfVEhSRUVfUExBTkUiKSkuc3VtKCkpCiAgICBlbGFwc2VkID0gdGltZS5wZXJmX2NvdW50ZXIoKSAtIHN0YXJ0ZWQKICAgIHRleHRfcHJpdmFjeV9wYXNzZWQsIHByaXZhY3lfb2ZmZW5kZXJzID0gdGV4dF9hcnRpZmFjdF9wcml2YWN5X3NjYW4ob3V0cHV0X2RpcikKICAgIGV4cG9ydF9ieXRlc19iZWZvcmVfbWFuaWZlc3QgPSBzdW0ocGF0aC5zdGF0KCkuc3Rfc2l6ZSBmb3IgcGF0aCBpbiBvdXRwdXRfZGlyLml0ZXJkaXIoKSBpZiBwYXRoLmlzX2ZpbGUoKSkKICAgIGdhdGVzID0gewogICAgICAgICJhbGxfNTEyX3NpbHZlcl9zdHVkaWVzX2NvbXBsZXRlX3RocmVlX3BsYW5lIjogc2lsdmVyX2NvbXBsZXRlID09IDUxMiwKICAgICAgICAiYWxsXzU4X2dvbGRfc3R1ZGllc19jb21wbGV0ZV90aHJlZV9wbGFuZSI6IGdvbGRfY29tcGxldGUgPT0gNTgsCiAgICAgICAgImF0X2xlYXN0Xzk1X3BlcmNlbnRfc2VyaWVzX3ZhbGlkIjogdmFsaWRfc2VyaWVzID49IG1hdGguY2VpbCgwLjk1ICogMzQ0MiksCiAgICAgICAgInRpbWVfbGltaXRfbm90X2hpdCI6IG5vdCB0aW1lX2xpbWl0X2hpdCBhbmQgZWxhcHNlZCA8IFdBTExfTElNSVRfU0VDT05EUywKICAgICAgICAiZXhwb3J0X2JlbG93XzRfZ2liIjogZXhwb3J0X2J5dGVzX2JlZm9yZV9tYW5pZmVzdCA8IEVYUE9SVF9MSU1JVF9CWVRFUywKICAgICAgICAidGV4dF9wcml2YWN5X3NjYW4iOiB0ZXh0X3ByaXZhY3lfcGFzc2VkLAogICAgICAgICJvZmZsaW5lX2NoZWNrcG9pbnRfdmVyaWZpZWQiOiBiYWNrYm9uZV9oYXNoID09IEVYUEVDVEVEX1JFU05FVDE4X0JBQ0tCT05FX1NIQTI1NiwKICAgICAgICAibm9fdGVzdF9vcl9yZXBvcnRfb3JfbGFiZWxfZmlsZV9yZWFkIjogVHJ1ZSwKICAgIH0KICAgIGFjY2VwdGVkID0gYWxsKGdhdGVzLnZhbHVlcygpKQogICAgc3RhdHVzID0gIkNPTVBMRVRFX1ZBTElEQVRFRF9JTlBVVFNfQUNDRVBURUQiIGlmIGFjY2VwdGVkIGVsc2UgIkNPTVBMRVRFX05PVF9BQ0NFUFRFRCIKICAgIGRlY2lzaW9uID0gIkFMTE9XX0E0XzNSX0UxX01SSV9PTkxZX0JBU0VMSU5FIiBpZiBhY2NlcHRlZCBlbHNlICJSRUpFQ1RfRkVBVFVSRV9FWFRSQUNUSU9OX0lORlJBU1RSVUNUVVJFIgogICAgcGVha19ncHVfbWIgPSBmbG9hdCh0b3JjaC5jdWRhLm1heF9tZW1vcnlfYWxsb2NhdGVkKCkgLyAxMDI0KioyKSBpZiBkZXZpY2UgPT0gImN1ZGEiIGVsc2UgMC4wCiAgICBzdW1tYXJ5ID0gewogICAgICAgICJzY2hlbWFfdmVyc2lvbiI6IDEsICJzdGFnZSI6ICJBNC4zUl9FMF9QUklWQVRFX0ZFQVRVUkVfRVhUUkFDVElPTiIsICJzdGF0dXMiOiBzdGF0dXMsICJkZWNpc2lvbiI6IGRlY2lzaW9uLAogICAgICAgICJjYW5kaWRhdGVfbW9kZWxfY3JlYXRlZCI6IEZhbHNlLCAiY2FuZGlkYXRlX21ldHJpY19jYWxjdWxhdGVkIjogRmFsc2UsCiAgICAgICAgImNvdW50cyI6IHsiZXhwZWN0ZWRfc3R1ZGllcyI6IDU3MCwgInNpbHZlcl90cmFpbmluZ19zdHVkaWVzIjogNTEyLCAiZXhwZXJ0X2dvbGRfZXZhbHVhdGlvbl9zdHVkaWVzIjogNTgsCiAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWRfc2VyaWVzIjogMzQ0MiwgInZhbGlkX3NlcmllcyI6IHZhbGlkX3NlcmllcywgImZhaWxlZF9zZXJpZXMiOiBsZW4oc2VyaWVzX21hbmlmZXN0KSAtIHZhbGlkX3NlcmllcywKICAgICAgICAgICAgICAgICAgICJjb21wbGV0ZV90aHJlZV9wbGFuZV9zdHVkaWVzIjogY29tcGxldGVfc3R1ZGllcywgInNlbGVjdGVkX3VuaW9uX3NsaWNlcyI6IGxlbihzbGljZV9tYW5pZmVzdCl9LAogICAgICAgICJnYXRlcyI6IGdhdGVzLAogICAgICAgICJoYXNoZXMiOiB7ImlucHV0X21hbmlmZXN0X3NoYTI1NiI6IEVYUEVDVEVEX0lOUFVUX01BTklGRVNUX1NIQTI1NiwgInRyYWluX3Nlcmllc19jc3Zfc2hhMjU2IjogRVhQRUNURURfVFJBSU5fU0VSSUVTX1NIQTI1NiwKICAgICAgICAgICAgICAgICAgICJyZXNuZXQxOF9maWxlX3NoYTI1NiI6IEVYUEVDVEVEX1JFU05FVDE4X0ZJTEVfU0hBMjU2LCAicmVzbmV0MThfYmFja2JvbmVfc2hhMjU2IjogYmFja2JvbmVfaGFzaCwKICAgICAgICAgICAgICAgICAgICJwcmVwcm9jZXNzaW5nX3NoYTI1NiI6IHByZXByb2Nlc3NpbmdfaGFzaCwgImVuY29kZXJfY29kZV9zaGEyNTYiOiBlbmNvZGVyX2hhc2gsICJrZXJuZWxfY29kZV9zaGEyNTYiOiBrZXJuZWxfaGFzaCwKICAgICAgICAgICAgICAgICAgICJzdHVkeV9mZWF0dXJlc19zaGEyNTYiOiBzaGEyNTZfZmlsZShzdHVkeV9jYWNoZV9wYXRoKX0sCiAgICAgICAgIm1ldGhvZHMiOiBQUkVQUk9DRVNTSU5HX1NQRUMsCiAgICAgICAgInNoYXJkcyI6IHNoYXJkX3JlY29yZHMsCiAgICAgICAgInByaXZhY3kiOiB7InJhd19yZXBvcnRzX3JlYWRfb3Jfd3JpdHRlbiI6IEZhbHNlLCAicmF3X2lkZW50aWZpZXJzX3dyaXR0ZW4iOiBGYWxzZSwgInJhd19kaWNvbV9leHBvcnRlZCI6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgICJnb2xkX2xhYmVsc19yZWFkX29yX3dyaXR0ZW4iOiBGYWxzZSwgInRlc3RfZGF0YV9yZWFkIjogRmFsc2UsICJ0ZXh0X3NjYW5fcGFzc2VkIjogdGV4dF9wcml2YWN5X3Bhc3NlZCwKICAgICAgICAgICAgICAgICAgICAidGV4dF9zY2FuX29mZmVuZGVycyI6IHByaXZhY3lfb2ZmZW5kZXJzfSwKICAgICAgICAicnVudGltZSI6IHsic2VyaWVzX3Byb2Nlc3Npbmdfc2Vjb25kcyI6IHByb2Nlc3Npbmdfc2Vjb25kcywgInRvdGFsX3NlY29uZHMiOiBlbGFwc2VkLCAidGltZV9saW1pdF9zZWNvbmRzIjogV0FMTF9MSU1JVF9TRUNPTkRTfSwKICAgICAgICAicmVzb3VyY2VzIjogeyJwZWFrX3Byb2Nlc3NfcnNzX21iIjogcGVha19yc3NfbWIoKSwgInBlYWtfZ3B1X2FsbG9jYXRlZF9tYiI6IHBlYWtfZ3B1X21iLAogICAgICAgICAgICAgICAgICAgICAgImV4cG9ydF9ieXRlc19iZWZvcmVfbWFuaWZlc3QiOiBleHBvcnRfYnl0ZXNfYmVmb3JlX21hbmlmZXN0fSwKICAgICAgICAiZW52aXJvbm1lbnQiOiB7InB5dGhvbiI6IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCksICJwbGF0Zm9ybSI6IHBsYXRmb3JtLnBsYXRmb3JtKCksICJudW1weSI6IG5wLl9fdmVyc2lvbl9fLAogICAgICAgICAgICAgICAgICAgICAgICAicGFuZGFzIjogcGQuX192ZXJzaW9uX18sICJweWRpY29tIjogcHlkaWNvbS5fX3ZlcnNpb25fXywgInRvcmNoIjogdG9yY2guX192ZXJzaW9uX18sCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b3JjaHZpc2lvbiI6IF9faW1wb3J0X18oInRvcmNodmlzaW9uIikuX192ZXJzaW9uX18sICJkZXZpY2UiOiBkZXZpY2UsICJhc3NpZ25lZF9ncHUiOiBhc3NpZ25lZF9ncHUsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXZpY2VfZmFsbGJhY2tfcmVhc29uIjogZmFsbGJhY2tfcmVhc29uLCAiaW50ZXJuZXRfZW5hYmxlZF9ieV9tZXRhZGF0YSI6IEZhbHNlfSwKICAgICAgICAiaW5wdXRfbWFuaWZlc3QiOiBpbnB1dF9tYW5pZmVzdCwKICAgIH0KICAgIHN1bW1hcnlfcGF0aCA9IG91dHB1dF9kaXIgLyAiZmVhdHVyZV9leHRyYWN0aW9uX3N1bW1hcnkuanNvbiIKICAgIHN1bW1hcnlfcGF0aC53cml0ZV90ZXh0KGpzb24uZHVtcHMoc3VtbWFyeSwgaW5kZW50PTIsIHNvcnRfa2V5cz1UcnVlKSArICJcbiIsIGVuY29kaW5nPSJ1dGYtOCIpCiAgICBydW5fbG9nID0gewogICAgICAgICJzdGFnZSI6IHN1bW1hcnlbInN0YWdlIl0sICJzdGF0dXMiOiBzdGF0dXMsICJkZWNpc2lvbiI6IGRlY2lzaW9uLCAidmFsaWRfc2VyaWVzIjogdmFsaWRfc2VyaWVzLAogICAgICAgICJmYWlsZWRfc2VyaWVzIjogbGVuKHNlcmllc19tYW5pZmVzdCkgLSB2YWxpZF9zZXJpZXMsICJjb21wbGV0ZV9zdHVkaWVzIjogY29tcGxldGVfc3R1ZGllcywKICAgICAgICAiZWxhcHNlZF9zZWNvbmRzIjogZWxhcHNlZCwgImRldmljZSI6IGRldmljZSwgImFzc2lnbmVkX2dwdSI6IGFzc2lnbmVkX2dwdSwKICAgIH0KICAgIChvdXRwdXRfZGlyIC8gInJ1bi5sb2ciKS53cml0ZV90ZXh0KGpzb24uZHVtcHMocnVuX2xvZywgc29ydF9rZXlzPVRydWUpICsgIlxuIiwgZW5jb2Rpbmc9InV0Zi04IikKCiAgICBhcnRpZmFjdHMgPSBbXQogICAgcHVycG9zZXMgPSB7CiAgICAgICAgInNlcmllc19mZWF0dXJlX21hbmlmZXN0LmNzdiI6ICJIYXNoZWQgcGVyLXNlcmllcyB2YWxpZGl0eSwgZ2VvbWV0cnksIGNhY2hlLCBhbmQgZmVhdHVyZSBoYXNoZXMuIiwKICAgICAgICAic2xpY2VfZmVhdHVyZV9tYW5pZmVzdC5jc3YiOiAiSGFzaGVkIHBlci1zbGljZSBjYWNoZSBhbmQgZmVhdHVyZSBoYXNoZXMgd2l0aCB2aWV3LW1lbWJlcnNoaXAgZmxhZ3MuIiwKICAgICAgICAic3R1ZHlfZmVhdHVyZV9tYW5pZmVzdC5jc3YiOiAiSGFzaGVkIHRocmVlLXBsYW5lIHN0dWR5IGNvdmVyYWdlIGFuZCBmb3VyIGZyb3plbiByZXByZXNlbnRhdGlvbiBoYXNoZXMuIiwKICAgICAgICAic3R1ZHlfZmVhdHVyZXMubnB6IjogIk1hY2hpbmUtcmVhZGFibGUgZml2ZS8xNi1zbGljZSBlcXVhbC1zZXJpZXMgYW5kIHBsYW5lLWJhbGFuY2VkIHN0dWR5IGZlYXR1cmVzLiIsCiAgICAgICAgImZlYXR1cmVfZXh0cmFjdGlvbl9zdW1tYXJ5Lmpzb24iOiAiTWV0aG9kcywgY291bnRzLCBnYXRlcywgcHJpdmFjeSwgaGFzaGVzLCBydW50aW1lLCBhbmQgcmVzb3VyY2VzLiIsCiAgICAgICAgInJ1bi5sb2ciOiAiSWRlbnRpZmllci1zYWZlIGNvbXBhY3QgZXhlY3V0aW9uIHN0YXR1cy4iLAogICAgfQogICAgZm9yIHBhdGggaW4gc29ydGVkKG91dHB1dF9kaXIuaXRlcmRpcigpKToKICAgICAgICBpZiBub3QgcGF0aC5pc19maWxlKCkgb3IgcGF0aC5uYW1lID09ICJhcnRpZmFjdF9tYW5pZmVzdC5qc29uIjoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBwdXJwb3NlID0gcHVycG9zZXMuZ2V0KHBhdGgubmFtZSwgIkNvbnRlbnQtYWRkcmVzc2VkIHJlc3VtYWJsZSBmZWF0dXJlIHNoYXJkLiIpCiAgICAgICAgYXJ0aWZhY3RzLmFwcGVuZCh7InBhdGgiOiBwYXRoLm5hbWUsICJzaGEyNTYiOiBzaGEyNTZfZmlsZShwYXRoKSwgImJ5dGVzIjogcGF0aC5zdGF0KCkuc3Rfc2l6ZSwgInNlbWFudGljX3B1cnBvc2UiOiBwdXJwb3NlfSkKICAgIGFydGlmYWN0X21hbmlmZXN0ID0gewogICAgICAgICJzY2hlbWFfdmVyc2lvbiI6IDEsICJzdGFnZSI6IHN1bW1hcnlbInN0YWdlIl0sICJzdGF0dXMiOiBzdGF0dXMsICJkZWNpc2lvbiI6IGRlY2lzaW9uLAogICAgICAgICJhcnRpZmFjdF9jb3VudF9leGNsdWRpbmdfc2VsZiI6IGxlbihhcnRpZmFjdHMpLCAiYXJ0aWZhY3RzIjogYXJ0aWZhY3RzLAogICAgICAgICJzb3VyY2UiOiB7Imtlcm5lbF9jb2RlX3NoYTI1NiI6IGtlcm5lbF9oYXNoLCAiaW5wdXRfbWFuaWZlc3Rfc2hhMjU2IjogRVhQRUNURURfSU5QVVRfTUFOSUZFU1RfU0hBMjU2fSwKICAgICAgICAic2VsZl9yZWNvcmQiOiB7InBhdGgiOiAiYXJ0aWZhY3RfbWFuaWZlc3QuanNvbiIsICJieXRlcyI6IDAsICJzaGEyNTYiOiBOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAicG9saWN5IjogIkFjdHVhbCBTSEEtMjU2IGlzIHJlY29yZGVkIGV4dGVybmFsbHk7IGJ5dGUgc2l6ZSB1c2VzIGZpeGVkLXBvaW50IHNlcmlhbGl6YXRpb24uIn0sCiAgICB9CiAgICBtYW5pZmVzdF9wYXRoID0gb3V0cHV0X2RpciAvICJhcnRpZmFjdF9tYW5pZmVzdC5qc29uIgogICAgcHJldmlvdXMgPSBOb25lCiAgICBmb3IgXyBpbiByYW5nZSgyMCk6CiAgICAgICAgcGF5bG9hZCA9IChqc29uLmR1bXBzKGFydGlmYWN0X21hbmlmZXN0LCBpbmRlbnQ9Miwgc29ydF9rZXlzPVRydWUpICsgIlxuIikuZW5jb2RlKCJ1dGYtOCIpCiAgICAgICAgYXJ0aWZhY3RfbWFuaWZlc3RbInNlbGZfcmVjb3JkIl1bImJ5dGVzIl0gPSBsZW4ocGF5bG9hZCkKICAgICAgICBpZiBsZW4ocGF5bG9hZCkgPT0gcHJldmlvdXM6CiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcHJldmlvdXMgPSBsZW4ocGF5bG9hZCkKICAgIG1hbmlmZXN0X3BhdGgud3JpdGVfdGV4dChqc29uLmR1bXBzKGFydGlmYWN0X21hbmlmZXN0LCBpbmRlbnQ9Miwgc29ydF9rZXlzPVRydWUpICsgIlxuIiwgZW5jb2Rpbmc9InV0Zi04IikKICAgIGlmIG1hbmlmZXN0X3BhdGguc3RhdCgpLnN0X3NpemUgIT0gYXJ0aWZhY3RfbWFuaWZlc3RbInNlbGZfcmVjb3JkIl1bImJ5dGVzIl06CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJhcnRpZmFjdF9tYW5pZmVzdF9maXhlZF9wb2ludF9mYWlsZWQiKQogICAgcHJpbnQoanNvbi5kdW1wcyh7InN0YXR1cyI6IHN0YXR1cywgImRlY2lzaW9uIjogZGVjaXNpb24sICJhcnRpZmFjdF9tYW5pZmVzdF9zaGEyNTYiOiBzaGEyNTZfZmlsZShtYW5pZmVzdF9wYXRoKSwKICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZF9zZXJpZXMiOiB2YWxpZF9zZXJpZXMsICJmYWlsZWRfc2VyaWVzIjogbGVuKHNlcmllc19tYW5pZmVzdCkgLSB2YWxpZF9zZXJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAiY29tcGxldGVfc3R1ZGllcyI6IGNvbXBsZXRlX3N0dWRpZXMsICJlbGFwc2VkX3NlY29uZHMiOiBlbGFwc2VkfSwgc29ydF9rZXlzPVRydWUpKQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBtYWluKCkK\",\"bytes\":37644,\"sha256\":\"2f4e00016d064ce46e9034f1becf0a9f6fd88d541ab0ddffac2e924b9a64cad2\"},\"input_manifest.json\":{\"base64\":\"ewogICJmaWxlcyI6IFsKICAgIHsKICAgICAgImJ5dGVzIjogMzc2NDQsCiAgICAgICJwYXRoIjogImZyb3plbl9lMF9mZWF0dXJlX2V4dHJhY3Rpb24ucHkiLAogICAgICAic2hhMjU2IjogIjJmNGUwMDAxNmQwNjRjZTQ2ZTkwMzRmMWJlY2YwYTlmNmZkODhkNTQxYWIwZGRmZmFjMmU5MjRiOWE2NGNhZDIiCiAgICB9LAogICAgewogICAgICAiYnl0ZXMiOiAyNzY2LAogICAgICAicGF0aCI6ICJtb2RlbF9tYW5pZmVzdC5qc29uIiwKICAgICAgInNoYTI1NiI6ICIyOWZjNWQ0OGQyNDcyNTUzOTVmNmMzNGEyMzQyN2E4MWZhM2RkYTA2ZGNmYTcwNzdmNzQ4ODhjY2EzZWNmN2I4IgogICAgfSwKICAgIHsKICAgICAgImJ5dGVzIjogMjE4NTQsCiAgICAgICJwYXRoIjogInNpbmdsZV9tb2RlbF9pbmZlcmVuY2UucHkiLAogICAgICAic2hhMjU2IjogIjUxNDhiNTljNmJhYWM1NjE2YzkyMjJmNDBiNDAzNjEwNzQyZTgzNDZhNzY1OTEwMTdjZTUyZjAyYjQ1YjgzOGIiCiAgICB9LAogICAgewogICAgICAiYnl0ZXMiOiA1NjEyOCwKICAgICAgInBhdGgiOiAic3R1ZGVudF9wYXJhbWV0ZXJzLm5weiIsCiAgICAgICJzaGEyNTYiOiAiNGQ3ZmVmYjVjOTIxZWU0YjU2NGYwNmI0NGU1Y2M0NTlkNzhjMjVjYzdiZDkzMjdjYTVlNmMwZTkxNWQ1ZTA0ZSIKICAgIH0KICBdLAogICJwcml2YWN5IjogewogICAgInByaXZhdGVfZGF0YXNldF9yZXF1aXJlZCI6IHRydWUsCiAgICAicmF3X2RpY29tX3ByZXNlbnQiOiBmYWxzZSwKICAgICJyYXdfaWRlbnRpZmllcnNfcHJlc2VudCI6IGZhbHNlLAogICAgInJhd19yZXBvcnRzX3ByZXNlbnQiOiBmYWxzZSwKICAgICJ0ZXN0X2xhYmVsc19wcmVzZW50IjogZmFsc2UKICB9Cn0K\",\"bytes\":855,\"sha256\":\"7f3eebfb96ee0dd55b59ac6f5df4cb95932d78216cd309fe14004f43bfb42690\"},\"model_manifest.json\":{\"base64\":\"ewogICJhcnRpZmFjdHMiOiB7CiAgICAicG9ydGFibGVfcGFyYW1ldGVycyI6IHsKICAgICAgInNoYTI1NiI6ICI0ZDdmZWZiNWM5MjFlZTRiNTY0ZjA2YjQ0ZTVjYzQ1OWQ3OGMyNWNjN2JkOTMyN2NhNWU2YzBlOTE1ZDVlMDRlIgogICAgfQogIH0sCiAgImRlcGxveW1lbnRfYW1lbmRtZW50X3NoYTI1NiI6ICJmZTdkMTdmYmM4MTZhYmM2NDkxNDU5ZDk3ZjI5OTVmMjYyYjE5MDRjMDJlNzU3OTg3MDRiMDM5NjEwZGUzMmQzIiwKICAiZGVwbG95bWVudF9wYWNrYWdlX3ZlcnNpb24iOiAyLAogICJkZXBsb3ltZW50X3BhcmVudCI6IHsKICAgICJpbnB1dF9tYW5pZmVzdF9zaGEyNTYiOiAiNmM4YWQ4MTVkYzU0MThiZjIzMGZlZWQwNjY2ZjFjYzc3NmYzNzVlMzVmZGYzOWI3MzhiODllMmE5YzcxYjFjZiIsCiAgICAibW9kZWxfbWFuaWZlc3Rfc2hhMjU2IjogIjRmNjY0M2ZhZDI4Nzc0ZTM4YzE3MzQwODA1NzczYmIwMjMzNDg2MTJiYTU2MDYxYmRjZjNlYzUzNmE1YTJlY2UiLAogICAgInN0dWRlbnRfcGFyYW1ldGVyc19zaGEyNTYiOiAiNGQ3ZmVmYjVjOTIxZWU0YjU2NGYwNmI0NGU1Y2M0NTlkNzhjMjVjYzdiZDkzMjdjYTVlNmMwZTkxNWQ1ZTA0ZSIKICB9LAogICJmaXQiOiB7CiAgICAiZml0X2lkIjogIlNJTFZFUjQyMjFfQ0VOVFJBTDVfU1RFVkVOX1BJTEtXQU5HX0RJU0FHUkVFTUVOVF9DMV8yMDI2MDkxNF9WMTpyZWFsIiwKICAgICJnb2xkX3RyYWluaW5nX3N0dWRpZXMiOiAwLAogICAgInJlZ2lzdHJhdGlvbl9zaGEyNTYiOiAiMDYwMjI0Y2NiZmIyNTFjNjhlNDc0NTYwMDE1ODE5NDk4NzVhNGQ5MmZjODQ3ZGIwZGE5Njg1MzZlMzAzMDFjMSIsCiAgICAicmVzZXJ2ZWRfdHJhaW5pbmdfc3R1ZGllcyI6IDAsCiAgICAidHJhaW5pbmdfbWFuaWZlc3Rfc2hhMjU2IjogIjkwZjg0ZDhmYTEyNjNkNTFkZTBjYjg5ODA5MGMzODE1Y2RmY2RlYTZkNzdhNjVkNDY3YjM0YmE3ZWE4MWQzZGMiLAogICAgInRyYWluaW5nX3N0dWRpZXMiOiA0MjIxCiAgfSwKICAiaW5mZXJlbmNlIjogewogICAgIk1SSV9vbmx5IjogdHJ1ZSwKICAgICJtaXNzaW5nX3Nlcmllc19wb2xpY3kiOiAib21pdF9mYWlsZWRfc2VyaWVzX3Bvb2xfdmFsaWRfb3JfaW50ZXJjZXB0X2ZhbGxiYWNrX3YyIiwKICAgICJub192YWxpZF9zZXJpZXNfcHJlZGljdGlvbiI6ICJleHBpdChmcm96ZW5faGVhZF9pbnRlcmNlcHQpIiwKICAgICJydW50aW1lX2d1YXJkX3NlY29uZHMiOiAyNzkwMCwKICAgICJzdHVkZW50X21vZGVscyI6IDEKICB9LAogICJsYWJlbF9vcmRlciI6IFsKICAgICJBQ0wiLAogICAgIk1DTCIsCiAgICAiTWVkaWFsIE1lbmlzY3VzIiwKICAgICJMYXRlcmFsIE1lbmlzY3VzIiwKICAgICJNZWRpYWwgT0EiLAogICAgIkxhdGVyYWwgT0EiLAogICAgIlBGIE9BIiwKICAgICJFZmZ1c2lvbiIsCiAgICAiU3lub3ZpdGlzIiwKICAgICJCYWtlcidzIiwKICAgICJDb250dXNpb24iLAogICAgIkZyYWN0dXJlIgogIF0sCiAgImxvY2FsX2RldmVsb3BtZW50X3Jlc3VsdCI6IHsKICAgICJkZWx0YV92c19yZXRhaW5lZF9jZW50cmFsNSI6IDAuMDA3NzA2MzMwNDgzOTAxMjM2LAogICAgImluZGVwZW5kZW50X3ZhbGlkYXRpb24iOiBmYWxzZSwKICAgICJtYWNyb19hdWMiOiAwLjc1ODE1MzQ0NDIxNjc4MDIsCiAgICAicGFpcmVkX2Rlc2NyaXB0aXZlOTUiOiBbCiAgICAgIC0wLjAwMTc1NTM5MzMyNzExMTMwOTksCiAgICAgIDAuMDE2NTgzNTgzODkxOTA5NjUKICAgIF0sCiAgICAicG9zaXRpdmVfcmVwb3J0aW5nX3BhcnRpdGlvbnMiOiA0LAogICAgInN1cHBvcnRlZF90YXJnZXRfY29sbGFwc2VzIjogW10KICB9LAogICJtb2RlbF9pZCI6ICJTSUxWRVI0MjIxX0NFTlRSQUw1X1NURVZFTl9QSUxLV0FOR19ESVNBR1JFRU1FTlRfQzFfMjAyNjA5MTRfVjEiLAogICJuZXdfZml0c19pbl9wYWNrYWdpbmciOiAwLAogICJwcm9tb3Rpb24iOiAiUEFDS0FHRURfVU5ERVJfVVNFUl9QT0lOVF9JTVBST1ZFTUVOVF9HQVRFOyBTVFJPTkdfQ0lfR0FURV9VTk1FVCIsCiAgInJhd19kaWNvbV9yZXBsYXkiOiAiUEVORElOR19DT01QT1NFRF9FWEFDVF9SRVBMQVkiLAogICJzYW1lX2V2YWx1YXRlZF9jYW5kaWRhdGUiOiB0cnVlLAogICJzdWJtaXNzaW9uX3BlcmZvcm1lZCI6IGZhbHNlLAogICJzdXBlcnZpc2lvbiI6IHsKICAgICJjb25maWRlbmNlX3J1bGUiOiAidW5pdF9iYXNlX3RpbWVzX29uZV9taW51c19wb3B1bGF0aW9uX3ZhcmlhbmNlX2dhbW1hMSIsCiAgICAic291cmNlcyI6IHsKICAgICAgInBpbGt3YW5nIjogewogICAgICAgICJmaWxlIjogInJlcG9ydF9sYWJlbHNfdjIuY3N2IiwKICAgICAgICAibGljZW5zZSI6ICJDQzAtMS4wIiwKICAgICAgICAic2hhMjU2IjogIjZmNzA0YTdiZGIyZjg5NGNjNDk0NDViMTliYTdjNDM3OGMzZjU0OGQzNDQ5ZTAwMzYxZTEwMDQ0YmVlNDA5MjAiLAogICAgICAgICJ2ZXJzaW9uIjogMQogICAgICB9LAogICAgICAic3RldmVuIjogewogICAgICAgICJmaWxlIjogImxsbV9sYWJlbHNfZnVsbC5jc3YiLAogICAgICAgICJsaWNlbnNlIjogIkNDMC0xLjAiLAogICAgICAgICJzaGEyNTYiOiAiOTY0NDRjZDNjN2QzOTZiYWU0YTcxNDU0MzE3ZDljYmUwNjg5NzU5YjUyNzhiMzA5Mzk3ODFlMDRkMDc3NDUzNyIsCiAgICAgICAgInZlcnNpb24iOiA2CiAgICAgIH0KICAgIH0sCiAgICAidGFyZ2V0X3J1bGUiOiAicT0wLjUqU3RldmVuX29yaWdpbmFsKzAuNSpQaWxrd2FuZ192MiIsCiAgICAidGVzdF90aW1lX3JlcG9ydF9kZXBlbmRlbmN5IjogZmFsc2UKICB9Cn0K\",\"bytes\":2766,\"sha256\":\"29fc5d48d247255395f6c34a23427a81fa3dda06dcfa7077f74888cca3ecf7b8\"},\"package_receipt.json\":{\"base64\":\"ewogICJhZGFwdGVyX3NoYTI1NiI6ICI1MTQ4YjU5YzZiYWFjNTYxNmM5MjIyZjQwYjQwMzYxMDc0MmU4MzQ2YTc2NTkxMDE3Y2U1MmYwMmI0NWI4MzhiIiwKICAiYW1lbmRtZW50X3NoYTI1NiI6ICJmZTdkMTdmYmM4MTZhYmM2NDkxNDU5ZDk3ZjI5OTVmMjYyYjE5MDRjMDJlNzU3OTg3MDRiMDM5NjEwZGUzMmQzIiwKICAiZnJvemVuX2V4dHJhY3Rvcl9zaGEyNTYiOiAiMmY0ZTAwMDE2ZDA2NGNlNDZlOTAzNGYxYmVjZjBhOWY2ZmQ4OGQ1NDFhYjBkZGZmYWMyZTkyNGI5YTY0Y2FkMiIsCiAgImdvbGRfb3V0Y29tZXNfcmVhZCI6IGZhbHNlLAogICJpbnB1dF9tYW5pZmVzdF9zaGEyNTYiOiAiN2YzZWViZmI5NmVlMGRkNTViNTlhYzZmNWRmNGNiOTU5MzJkNzgyMTZjZDMwOWZlMTQwMDRmNDNiZmI0MjY5MCIsCiAgIm1vZGVsX21hbmlmZXN0X3NoYTI1NiI6ICIyOWZjNWQ0OGQyNDcyNTUzOTVmNmMzNGEyMzQyN2E4MWZhM2RkYTA2ZGNmYTcwNzdmNzQ4ODhjY2EzZWNmN2I4IiwKICAibmV3X2ZpdHMiOiAwLAogICJwYXJlbnRfaW5wdXRfbWFuaWZlc3Rfc2hhMjU2IjogIjZjOGFkODE1ZGM1NDE4YmYyMzBmZWVkMDY2NmYxY2M3NzZmMzc1ZTM1ZmRmMzliNzM4Yjg5ZTJhOWM3MWIxY2YiLAogICJzY2hlbWFfdmVyc2lvbiI6IDIsCiAgInN0YXR1cyI6ICJFWEFDVF9FVkFMVUFURURfTU9ERUxfUkVQQUNLQUdFRF9XSVRIX1JFR0lTVEVSRURfUk9CVVNUX0lORkVSRU5DRSIsCiAgInN0dWRlbnRfcGFyYW1ldGVyc19zaGEyNTYiOiAiNGQ3ZmVmYjVjOTIxZWU0YjU2NGYwNmI0NGU1Y2M0NTlkNzhjMjVjYzdiZDkzMjdjYTVlNmMwZTkxNWQ1ZTA0ZSIsCiAgInN1Ym1pc3Npb25fcGVyZm9ybWVkIjogZmFsc2UKfQo=\",\"bytes\":854,\"sha256\":\"72759829942dca9c3985f4f5535e062e902b4ade7b47e430b995182b17210ce1\"},\"single_model_inference.py\":{\"base64\":\"IiIiUm9idXN0IHYyIGRlcGxveW1lbnQgaW5mZXJlbmNlIGZvciB0aGUgZXhhY3QgZXZhbHVhdGVkIG11bHRpc291cmNlIG1vZGVsLgoKTm9taW5hbCBpbnB1dHMgdXNlIHRoZSBieXRlLWlkZW50aWNhbCBmcm96ZW4gRTAgcHJlcHJvY2Vzc2luZyBhbmQgcG9ydGFibGUgbW9kZWwuCkZhaWxlZCBzZXJpZXMgYXJlIG9taXR0ZWQgZnJvbSBlcXVhbC1zZXJpZXMgcG9vbGluZyBhbmQgcmVjb3JkZWQgYnkgaGFzaGVkIGlkZW50aXR5LgpBIHN0dWR5IHdpdGggbm8gdXNhYmxlIHNlcmllcyByZWNlaXZlcyB0aGUgZnJvemVuIGhlYWQtaW50ZXJjZXB0IHByb2JhYmlsaXRpZXMuCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IGFyZ3BhcnNlCmltcG9ydCBoYXNobGliCmltcG9ydCBpbXBvcnRsaWIudXRpbAppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCB0aW1lCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAoKaW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBwYW5kYXMgYXMgcGQKZnJvbSBzY2lweS5zcGVjaWFsIGltcG9ydCBleHBpdAppbXBvcnQgdG9yY2gKCgpGSU5ESU5HUyA9IFsiQUNMIiwgIk1DTCIsICJNZWRpYWwgTWVuaXNjdXMiLCAiTGF0ZXJhbCBNZW5pc2N1cyIsICJNZWRpYWwgT0EiLAogICAgICAgICAgICAiTGF0ZXJhbCBPQSIsICJQRiBPQSIsICJFZmZ1c2lvbiIsICJTeW5vdml0aXMiLCAiQmFrZXIncyIsCiAgICAgICAgICAgICJDb250dXNpb24iLCAiRnJhY3R1cmUiXQpFWFBFQ1RFRF9NT0RFTF9JTlBVVF9NQU5JRkVTVF9TSEEyNTYgPSBOb25lCk1PREVMX1JPT1QgPSBOb25lCk9VVFBVVF9ESVIgPSBOb25lCkVYUEVDVEVEX0UwX1NPVVJDRV9TSEEyNTYgPSAiMmY0ZTAwMDE2ZDA2NGNlNDZlOTAzNGYxYmVjZjBhOWY2ZmQ4OGQ1NDFhYjBkZGZmYWMyZTkyNGI5YTY0Y2FkMiIKRVhQRUNURURfUkVTTkVUMThfRklMRV9TSEEyNTYgPSAiZjM3MDcyZmQ0N2U4OWM1ZTgyNzYyMWM1YmFmZmE3NTAwODE5Zjc4OTZiYmFjZWMxNjBiMWExNmM1NjBlMDdlYyIKRVhQRUNURURfUkVTTkVUMThfQkFDS0JPTkVfU0hBMjU2ID0gImNjNzE4OTA4NDUyZjRjNmI2Y2VlMjc4YmRjNzY3ZTkyZDhiOWJhOGRkZjJjMmRmMDc2ODE1Y2M4N2M3NjY1ZGIiCkVYUEVDVEVEX0UwX1BSRVBST0NFU1NJTkdfU0hBMjU2ID0gImRjMzY3MWI5ZWNhNTg2YjYyNTE4YTVlMjcwYTA3ZTlhNDY1MjlhMGU2ODVhZWNlM2MyMzFiZjYxODM0MWRmMjAiCkVYUEVDVEVEX0UwX0VOQ09ERVJfQ09ERV9TSEEyNTYgPSAiY2U2ZmM5N2ZhMzEyODRkZDAyZjA4YTQxMDE1YjlmYjQ0MDYyM2E2YzFmNDk3NDg4NmQ1YWViMzZhMzA1ODE0NyIKUExBTkVTID0gKCJBeGlhbCIsICJDb3JvbmFsIiwgIlNhZ2l0dGFsIikKU0FGRV9TVE9QX1NFQ09ORFMgPSBpbnQoNy43NSAqIDYwICogNjApCk1JU1NJTkdfU0VSSUVTX1BPTElDWSA9ICJvbWl0X2ZhaWxlZF9zZXJpZXNfcG9vbF92YWxpZF9vcl9pbnRlcmNlcHRfZmFsbGJhY2tfdjIiCgoKZGVmIHNoYTI1Nl9maWxlKHBhdGg6IFBhdGgpIC0+IHN0cjoKICAgIGRpZ2VzdCA9IGhhc2hsaWIuc2hhMjU2KCkKICAgIHdpdGggcGF0aC5vcGVuKCJyYiIpIGFzIGhhbmRsZToKICAgICAgICBmb3IgY2h1bmsgaW4gaXRlcihsYW1iZGE6IGhhbmRsZS5yZWFkKDEwMjQgKiAxMDI0KSwgYiIiKToKICAgICAgICAgICAgZGlnZXN0LnVwZGF0ZShjaHVuaykKICAgIHJldHVybiBkaWdlc3QuaGV4ZGlnZXN0KCkKCgpkZWYgc2hhMjU2X3RleHQodmFsdWU6IHN0cikgLT4gc3RyOgogICAgcmV0dXJuIGhhc2hsaWIuc2hhMjU2KHZhbHVlLmVuY29kZSgidXRmLTgiKSkuaGV4ZGlnZXN0KCkKCgpkZWYgcmVzb2x2ZV9tb2RlbF9pbnB1dCgpIC0+IFBhdGg6CiAgICBpZiBNT0RFTF9ST09UIGlzIE5vbmUgb3IgRVhQRUNURURfTU9ERUxfSU5QVVRfTUFOSUZFU1RfU0hBMjU2IGlzIE5vbmU6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJleHBsaWNpdCBmaW5hbCBzaW5nbGUtbW9kZWwgcGFja2FnZSBiaW5kaW5nIGlzIHJlcXVpcmVkIikKICAgIHJvb3QgPSBQYXRoKE1PREVMX1JPT1QpLnJlc29sdmUoKQogICAgaWYgc2hhMjU2X2ZpbGUocm9vdCAvICJpbnB1dF9tYW5pZmVzdC5qc29uIikgIT0gRVhQRUNURURfTU9ERUxfSU5QVVRfTUFOSUZFU1RfU0hBMjU2OgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiZmluYWwgbW9kZWwgaW5wdXQgbWFuaWZlc3QgY2hlY2tzdW0gbWlzbWF0Y2giKQogICAgcmV0dXJuIHJvb3QKCgpkZWYgdmFsaWRhdGVfbW9kZWxfaW5wdXQocm9vdDogUGF0aCkgLT4gdHVwbGVbZGljdFtzdHIsIG9iamVjdF0sIGRpY3Rbc3RyLCBucC5uZGFycmF5XV06CiAgICBpbnB1dF9tYW5pZmVzdCA9IGpzb24ubG9hZHMoKHJvb3QgLyAiaW5wdXRfbWFuaWZlc3QuanNvbiIpLnJlYWRfdGV4dChlbmNvZGluZz0idXRmLTgiKSkKICAgIGlmIGlucHV0X21hbmlmZXN0WyJwcml2YWN5Il0gIT0gewogICAgICAgICJwcml2YXRlX2RhdGFzZXRfcmVxdWlyZWQiOiBUcnVlLCAicmF3X2RpY29tX3ByZXNlbnQiOiBGYWxzZSwKICAgICAgICAicmF3X2lkZW50aWZpZXJzX3ByZXNlbnQiOiBGYWxzZSwgInJhd19yZXBvcnRzX3ByZXNlbnQiOiBGYWxzZSwKICAgICAgICAidGVzdF9sYWJlbHNfcHJlc2VudCI6IEZhbHNlLAogICAgfToKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImRlcGxveW1lbnQgaW5wdXQgcHJpdmFjeSBkZWNsYXJhdGlvbiBtaXNtYXRjaCIpCiAgICBwYXRocyA9IHNldCgpCiAgICBmb3IgaXRlbSBpbiBpbnB1dF9tYW5pZmVzdFsiZmlsZXMiXToKICAgICAgICBwYXRoID0gcm9vdCAvIGl0ZW1bInBhdGgiXQogICAgICAgIGlmIGl0ZW1bInBhdGgiXSBpbiBwYXRocyBvciBub3QgcGF0aC5yZXNvbHZlKCkuaXNfcmVsYXRpdmVfdG8ocm9vdC5yZXNvbHZlKCkpIG9yIHBhdGguaXNfc3ltbGluaygpOgogICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImludmFsaWQgb3IgZHVwbGljYXRlIHBhY2thZ2VkIGFydGlmYWN0IHBhdGgiKQogICAgICAgIHBhdGhzLmFkZChpdGVtWyJwYXRoIl0pCiAgICAgICAgaWYgbm90IHBhdGguaXNfZmlsZSgpIG9yIHBhdGguc3RhdCgpLnN0X3NpemUgIT0gaXRlbVsiYnl0ZXMiXSBvciBzaGEyNTZfZmlsZShwYXRoKSAhPSBpdGVtWyJzaGEyNTYiXToKICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJwYWNrYWdlZCBhcnRpZmFjdCBjaGVja3N1bSBtaXNtYXRjaCIpCiAgICBpZiBub3QgeyJtb2RlbF9tYW5pZmVzdC5qc29uIiwgInN0dWRlbnRfcGFyYW1ldGVycy5ucHoiLCAiZnJvemVuX2UwX2ZlYXR1cmVfZXh0cmFjdGlvbi5weSJ9Lmlzc3Vic2V0KHBhdGhzKToKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoInJlcXVpcmVkIHNpbmdsZS1tb2RlbCBwYWNrYWdlIGludmVudG9yeSBtaXNzaW5nIikKICAgIG1hbmlmZXN0ID0ganNvbi5sb2Fkcygocm9vdCAvICJtb2RlbF9tYW5pZmVzdC5qc29uIikucmVhZF90ZXh0KGVuY29kaW5nPSJ1dGYtOCIpKQogICAgaWYgbWFuaWZlc3RbImxhYmVsX29yZGVyIl0gIT0gRklORElOR1Mgb3IgbWFuaWZlc3RbImluZmVyZW5jZSJdWyJNUklfb25seSJdIGlzIG5vdCBUcnVlIG9yIG1hbmlmZXN0WyJpbmZlcmVuY2UiXVsic3R1ZGVudF9tb2RlbHMiXSAhPSAxOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigic2luZ2xlLW1vZGVsIHNlbWFudGljcyBjaGFuZ2VkIikKICAgIGZpdCA9IG1hbmlmZXN0WyJmaXQiXQogICAgaWYgZml0WyJ0cmFpbmluZ19zdHVkaWVzIl0gIT0gNDIyMSBvciBmaXRbImdvbGRfdHJhaW5pbmdfc3R1ZGllcyJdICE9IDAgb3IgZml0WyJyZXNlcnZlZF90cmFpbmluZ19zdHVkaWVzIl0gIT0gMCBvciBub3QgZml0WyJmaXRfaWQiXToKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImZpbmFsIHNpbHZlci1vbmx5IGZpdHRpbmcgcHJvdmVuYW5jZSBjaGFuZ2VkIikKICAgIGZvciBmaWVsZCBpbiBbInJlZ2lzdHJhdGlvbl9zaGEyNTYiLCAidHJhaW5pbmdfbWFuaWZlc3Rfc2hhMjU2Il06CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZml0W2ZpZWxkXSwgc3RyKSBvciBsZW4oZml0W2ZpZWxkXSkgIT0gNjQgb3IgYW55KGMgbm90IGluICIwMTIzNDU2Nzg5YWJjZGVmIiBmb3IgYyBpbiBmaXRbZmllbGRdKToKICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJtaXNzaW5nIGZpbmFsIGZpdCBzb3VyY2UgYXV0aG9yaXR5IikKICAgIGlmIG1hbmlmZXN0WyJpbmZlcmVuY2UiXVsibWlzc2luZ19zZXJpZXNfcG9saWN5Il0gIT0gTUlTU0lOR19TRVJJRVNfUE9MSUNZOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigicmVnaXN0ZXJlZCByb2J1c3Qgc2VyaWVzIHBvbGljeSBjaGFuZ2VkIikKICAgIHBhcmFtZXRlcl9wYXRoID0gcm9vdCAvICJzdHVkZW50X3BhcmFtZXRlcnMubnB6IgogICAgaWYgc2hhMjU2X2ZpbGUocGFyYW1ldGVyX3BhdGgpICE9IG1hbmlmZXN0WyJhcnRpZmFjdHMiXVsicG9ydGFibGVfcGFyYW1ldGVycyJdWyJzaGEyNTYiXToKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoInBvcnRhYmxlIHNpbmdsZS1tb2RlbCBwYXJhbWV0ZXIgY2hlY2tzdW0gbWlzbWF0Y2giKQogICAgd2l0aCBucC5sb2FkKHBhcmFtZXRlcl9wYXRoLCBhbGxvd19waWNrbGU9RmFsc2UpIGFzIGFyY2hpdmU6CiAgICAgICAgYXJyYXlzID0ge25hbWU6IGFyY2hpdmVbbmFtZV0gZm9yIG5hbWUgaW4gYXJjaGl2ZS5maWxlc30KICAgIGFsbG93ZWQgPSB7ImNvZWZmaWNpZW50IiwgImludGVyY2VwdCIsICJzY2FsZXJfbWVhbiIsICJzY2FsZXJfc2NhbGUiLCAiZmluZGluZ3MiLCAiYWN0aXZlX21hc2sifQogICAgaWYgbm90IHNldChhcnJheXMpLmlzc3Vic2V0KGFsbG93ZWQpIG9yIGFycmF5c1siZmluZGluZ3MiXS50b2xpc3QoKSAhPSBGSU5ESU5HUzoKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoInBvcnRhYmxlIHNpbmdsZS1tb2RlbCBpbnZlbnRvcnkgb3IgdGFyZ2V0IG9yZGVyIGNoYW5nZWQiKQogICAgZXhwZWN0ZWQgPSB7ImNvZWZmaWNpZW50IjogKDEyLCA1MTIpLCAiaW50ZXJjZXB0IjogKDEyLCksICJzY2FsZXJfbWVhbiI6ICg1MTIsKSwgInNjYWxlcl9zY2FsZSI6ICg1MTIsKX0KICAgIGZvciBuYW1lLCBzaGFwZSBpbiBleHBlY3RlZC5pdGVtcygpOgogICAgICAgIGlmIGFycmF5c1tuYW1lXS5zaGFwZSAhPSBzaGFwZSBvciBhcnJheXNbbmFtZV0uZHR5cGUgIT0gbnAuZmxvYXQ2NCBvciBub3QgbnAuaXNmaW5pdGUoYXJyYXlzW25hbWVdKS5hbGwoKToKICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJpbnZhbGlkIHNpbmdsZS1tb2RlbCBwYXJhbWV0ZXIgc2hhcGUsIGR0eXBlIG9yIHZhbHVlIikKICAgIGlmIG5vdCAoYXJyYXlzWyJzY2FsZXJfc2NhbGUiXSA+IDApLmFsbCgpOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiaW52YWxpZCBmcm96ZW4gc2NhbGVyIHNjYWxlIikKICAgIHJldHVybiBtYW5pZmVzdCwgYXJyYXlzCgoKZGVmIGxvYWRfZnJvemVuX2UwKHJvb3Q6IFBhdGgpOgogICAgcGF0aCA9IHJvb3QgLyAiZnJvemVuX2UwX2ZlYXR1cmVfZXh0cmFjdGlvbi5weSIKICAgIGlmIHNoYTI1Nl9maWxlKHBhdGgpICE9IEVYUEVDVEVEX0UwX1NPVVJDRV9TSEEyNTY6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJmcm96ZW4gRTAgZmVhdHVyZSBzb3VyY2UgbWlzbWF0Y2giKQogICAgc3BlYyA9IGltcG9ydGxpYi51dGlsLnNwZWNfZnJvbV9maWxlX2xvY2F0aW9uKCJmcm96ZW5fZTBfZmVhdHVyZV9leHRyYWN0aW9uIiwgcGF0aCkKICAgIGlmIHNwZWMgaXMgTm9uZSBvciBzcGVjLmxvYWRlciBpcyBOb25lOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiY2Fubm90IGxvYWQgZnJvemVuIEUwIGZlYXR1cmUgc291cmNlIikKICAgIG1vZHVsZSA9IGltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWMoc3BlYykKICAgIHNwZWMubG9hZGVyLmV4ZWNfbW9kdWxlKG1vZHVsZSkKICAgIGlmIG1vZHVsZS5jYW5vbmljYWxfaGFzaChtb2R1bGUuUFJFUFJPQ0VTU0lOR19TUEVDKSAhPSBFWFBFQ1RFRF9FMF9QUkVQUk9DRVNTSU5HX1NIQTI1NjoKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImZyb3plbiBFMCBwcmVwcm9jZXNzaW5nIG1pc21hdGNoIikKICAgIGlmIG1vZHVsZS5mZWF0dXJlX2NvZGVfaGFzaCgpICE9IEVYUEVDVEVEX0UwX0VOQ09ERVJfQ09ERV9TSEEyNTY6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJmcm96ZW4gRTAgZW5jb2RlciBjb2RlIG1pc21hdGNoIikKICAgIHJldHVybiBtb2R1bGUKCgpkZWYgcmVzb2x2ZV9jaGVja3BvaW50KCkgLT4gUGF0aDoKICAgIGZvciBwYXRoIGluIFBhdGgoIi9rYWdnbGUvaW5wdXQiKS5nbG9iKCIqKi9yZXNuZXQxOC1mMzcwNzJmZC5wdGgiKToKICAgICAgICBpZiBzaGEyNTZfZmlsZShwYXRoKSA9PSBFWFBFQ1RFRF9SRVNORVQxOF9GSUxFX1NIQTI1NjoKICAgICAgICAgICAgcmV0dXJuIHBhdGgKICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigidmVyaWZpZWQgb2ZmbGluZSBSZXNOZXQtMTggY2hlY2twb2ludCBpcyB1bmF2YWlsYWJsZSIpCgoKZGVmIHJlc29sdmVfY29tcGV0aXRpb25fdGVzdCgpIC0+IHR1cGxlW1BhdGgsIFBhdGgsIFBhdGhdOgogICAgZm9yIHJvb3QgaW4gKAogICAgICAgIFBhdGgob3MuZW52aXJvbi5nZXQoIlJTTkFfREFUQV9ST09UIiwgIi9taXNzaW5nIikpLAogICAgICAgIFBhdGgoIi9rYWdnbGUvaW5wdXQvcnNuYS1rbmVlLWFibm9ybWFsaXR5LWRldGVjdGlvbiIpLAogICAgICAgIFBhdGgoIi9rYWdnbGUvaW5wdXQvY29tcGV0aXRpb25zL3JzbmEta25lZS1hYm5vcm1hbGl0eS1kZXRlY3Rpb24iKSwKICAgICk6CiAgICAgICAgc2VyaWVzX2NzdiA9IG5leHQoKHBhdGggZm9yIHBhdGggaW4gKHJvb3QgLyAidGVzdF9zZXJpZXMuY3N2Iiwgcm9vdCAvICJtZXRhZGF0YS90ZXN0X3Nlcmllcy5jc3YiKSBpZiBwYXRoLmlzX2ZpbGUoKSksIE5vbmUpCiAgICAgICAgc2FtcGxlX2NzdiA9IG5leHQoKHBhdGggZm9yIHBhdGggaW4gKHJvb3QgLyAic2FtcGxlX3N1Ym1pc3Npb24uY3N2Iiwgcm9vdCAvICJtZXRhZGF0YS9zYW1wbGVfc3VibWlzc2lvbi5jc3YiKSBpZiBwYXRoLmlzX2ZpbGUoKSksIE5vbmUpCiAgICAgICAgZGljb21fcm9vdCA9IG5leHQoKHBhdGggZm9yIHBhdGggaW4gKHJvb3QgLyAidGVzdF9zZXJpZXMiLCByb290IC8gInNhbXBsZS90ZXN0X3NlcmllcyIsIHJvb3QgLyAidGVzdF9pbWFnZXMiKSBpZiBwYXRoLmlzX2RpcigpKSwgTm9uZSkKICAgICAgICBpZiBzZXJpZXNfY3N2IGlzIG5vdCBOb25lIGFuZCBzYW1wbGVfY3N2IGlzIG5vdCBOb25lIGFuZCBkaWNvbV9yb290IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VyaWVzX2Nzdiwgc2FtcGxlX2NzdiwgZGljb21fcm9vdAogICAgcmFpc2UgUnVudGltZUVycm9yKCJjb21wZXRpdGlvbiB0ZXN0IE1SSSBkYXRhIGlzIHVuYXZhaWxhYmxlIikKCgpkZWYgcmVxdWlyZShjb25kaXRpb24sIG1lc3NhZ2UpOgogICAgaWYgbm90IGNvbmRpdGlvbjoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1lc3NhZ2UpCgpkZWYgY2hlY2tfZmVhdHVyZXMoZmVhdHVyZXMpOgogICAgeCA9IG5wLmFzYXJyYXkoZmVhdHVyZXMpCiAgICByZXF1aXJlKHgubmRpbSA9PSAyIGFuZCB4LnNoYXBlWzFdID09IDUxMiwgIk1SSSBmZWF0dXJlcyBtdXN0IGhhdmUgc2hhcGUgKG4sIDUxMikiKQogICAgcmVxdWlyZSh4LmR0eXBlID09IG5wLmZsb2F0MzIsICJNUkkgZmVhdHVyZXMgbXVzdCByZXRhaW4gdGhlIGZyb3plbiBmbG9hdDMyIGR0eXBlIikKICAgIHJlcXVpcmUobnAuaXNmaW5pdGUoeCkuYWxsKCksICJub24tZmluaXRlIE1SSSBmZWF0dXJlcyIpCiAgICByZXR1cm4geAoKZGVmIHByZWRpY3RfbW9kZWwocGFyYW1ldGVycywgZmVhdHVyZXMpOgogICAgIiIiTWF0Y2ggZnJvemVuIHNrbGVhcm4gU3RhbmRhcmRTY2FsZXIgYW5kIGJpbmFyeSBsb2dpc3RpYyBoZWFkcy4iIiIKICAgIHggPSBjaGVja19mZWF0dXJlcyhmZWF0dXJlcykKICAgIHJlcXVpcmUocGFyYW1ldGVyc1snZmluZGluZ3MnXS50b2xpc3QoKSA9PSBGSU5ESU5HUywgInRhcmdldCBvcmRlciBjaGFuZ2VkIikKICAgIHNoYXBlcyA9IHsnY29lZmZpY2llbnQnOiAoMTIsIDUxMiksICdpbnRlcmNlcHQnOiAoMTIsKSwKICAgICAgICAgICAgICAnc2NhbGVyX21lYW4nOiAoNTEyLCksICdzY2FsZXJfc2NhbGUnOiAoNTEyLCl9CiAgICBmb3IgbmFtZSwgc2hhcGUgaW4gc2hhcGVzLml0ZW1zKCk6CiAgICAgICAgcmVxdWlyZShwYXJhbWV0ZXJzW25hbWVdLnNoYXBlID09IHNoYXBlIGFuZCBucC5pc2Zpbml0ZShwYXJhbWV0ZXJzW25hbWVdKS5hbGwoKSwKICAgICAgICAgICAgICAgIGYiaW52YWxpZCB7bmFtZX0iKQogICAgcmVxdWlyZSgocGFyYW1ldGVyc1snc2NhbGVyX3NjYWxlJ10gPiAwKS5hbGwoKSwgImludmFsaWQgc2NhbGVyIHNjYWxlIikKICAgICMgU3RhbmRhcmRTY2FsZXIgdHJhbnNmb3JtcyBpdHMgZmxvYXQzMiBpbnB1dCBpbiBwbGFjZTogcm91bmQgYWZ0ZXIgZWFjaAogICAgIyBvcGVyYXRpb24sIHRoZW4gdXNlIHRoZSBsZWFybmVkIGZsb2F0NjQgY29lZmZpY2llbnRzIGZvciB0aGUgaGVhZCBkb3QuCiAgICBzY2FsZWQgPSB4LmNvcHkoKQogICAgc2NhbGVkIC09IHBhcmFtZXRlcnNbJ3NjYWxlcl9tZWFuJ10KICAgIHNjYWxlZCAvPSBwYXJhbWV0ZXJzWydzY2FsZXJfc2NhbGUnXQogICAgcHJlZGljdGlvbiA9IG5wLmVtcHR5KChsZW4oeCksIDEyKSwgZHR5cGU9bnAuZmxvYXQ2NCkKICAgIGZvciB0YXJnZXQgaW4gcmFuZ2UoMTIpOgogICAgICAgIHByZWRpY3Rpb25bOiwgdGFyZ2V0XSA9IGV4cGl0KHNjYWxlZCBAIHBhcmFtZXRlcnNbJ2NvZWZmaWNpZW50J11bdGFyZ2V0XSArIHBhcmFtZXRlcnNbJ2ludGVyY2VwdCddW3RhcmdldF0pCiAgICByZXF1aXJlKG5wLmlzZmluaXRlKHByZWRpY3Rpb24pLmFsbCgpLCAibm9uLWZpbml0ZSBwcmVkaWN0aW9ucyIpCiAgICByZXR1cm4gcHJlZGljdGlvbgoKCmRlZiBmYWlsdXJlX3JlY29yZChyb3csIGVycm9yOiBFeGNlcHRpb24pIC0+IGRpY3Rbc3RyLCBzdHJdOgogICAgIiIiUmV0dXJuIGFuIGlkZW50aWZpZXItc2FmZSBkaWFnbm9zdGljIGZvciBvbmUgb21pdHRlZCBzZXJpZXMuIiIiCiAgICByZWFzb24gPSBmInt0eXBlKGVycm9yKS5fX25hbWVfX306e3N0cihlcnJvcil9IgogICAgcmV0dXJuIHsKICAgICAgICAic3R1ZHlfaWRfc2hhMjU2Ijogc3RyKHJvdy5zdHVkeV9pZF9zaGEyNTYpLAogICAgICAgICJzZXJpZXNfaWRfc2hhMjU2Ijogc3RyKHJvdy5zZXJpZXNfaWRfc2hhMjU2KSwKICAgICAgICAicmVhc29uX2NsYXNzIjogdHlwZShlcnJvcikuX19uYW1lX18sCiAgICAgICAgInJlYXNvbl9zaGEyNTYiOiBzaGEyNTZfdGV4dChyZWFzb24pLAogICAgfQoKCmRlZiBhZ2dyZWdhdGVfc3R1ZGllcyhzYW1wbGVfaWRzLCBzZXJpZXMsIGZlYXR1cmVzX2J5X3NlcmllcywgYmFzZSk6CiAgICAiIiJQb29sIHZhbGlkIHNlcmllcyBhbmQgZGVzY3JpYmUgZGV0ZXJtaW5pc3RpYyBkZWdyYWRlZC1zdHVkeSBoYW5kbGluZy4iIiIKICAgIHN0dWR5X2ZlYXR1cmVzID0gW10KICAgIHN0dWR5X2RpYWdub3N0aWNzID0gW10KICAgIG5vX3ZhbGlkX3NlcmllcyA9IFtdCiAgICBmb3IgcG9zaXRpb24sIHN0dWR5X3VpZCBpbiBlbnVtZXJhdGUoc2FtcGxlX2lkcyk6CiAgICAgICAgcm93cyA9IHNlcmllc1tzZXJpZXMuU3R1ZHlJbnN0YW5jZVVJRCA9PSBzdHVkeV91aWRdCiAgICAgICAgdmFsaWRfbWFzayA9IHJvd3MuZ2xvYmFsX3Nlcmllc19pbmRleC5tYXAoCiAgICAgICAgICAgIGxhbWJkYSB2YWx1ZTogaW50KHZhbHVlKSBpbiBmZWF0dXJlc19ieV9zZXJpZXMKICAgICAgICApLmFzdHlwZShib29sKQogICAgICAgIHZhbGlkX3Jvd3MgPSByb3dzW3ZhbGlkX21hc2tdCiAgICAgICAgdmFsaWRfcGxhbmVzID0gc29ydGVkKHNldCh2YWxpZF9yb3dzLmFuYXRvbWljYWxfcGxhbmUpICYgc2V0KFBMQU5FUykpCiAgICAgICAgbWlzc2luZ19wbGFuZXMgPSBzb3J0ZWQoc2V0KFBMQU5FUykgLSBzZXQodmFsaWRfcGxhbmVzKSkKICAgICAgICB2YWx1ZXMgPSBbZmVhdHVyZXNfYnlfc2VyaWVzW2ludChpbmRleCldIGZvciBpbmRleCBpbiB2YWxpZF9yb3dzLmdsb2JhbF9zZXJpZXNfaW5kZXhdCiAgICAgICAgaWYgdmFsdWVzOgogICAgICAgICAgICBzdHVkeV9mZWF0dXJlcy5hcHBlbmQoYmFzZS5lcXVhbF9zZXJpZXNfbWVhbihucC5zdGFjayh2YWx1ZXMpKSkKICAgICAgICAgICAgZmFsbGJhY2sgPSAidmFsaWRfc2VyaWVzX2VxdWFsX21lYW4iCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBQbGFjZWhvbGRlciBpcyBvdmVyd3JpdHRlbiB3aXRoIGV4YWN0IGV4cGl0KGludGVyY2VwdCkgYWZ0ZXIgdGhlCiAgICAgICAgICAgICMgb3JkaW5hcnkgcHJlZGljdG9yIHJ1bnMuIEl0IG11c3Qgc3RpbGwgYmUgZmluaXRlIGZsb2F0MzIgaGVyZS4KICAgICAgICAgICAgc3R1ZHlfZmVhdHVyZXMuYXBwZW5kKG5wLnplcm9zKDUxMiwgZHR5cGU9bnAuZmxvYXQzMikpCiAgICAgICAgICAgIG5vX3ZhbGlkX3Nlcmllcy5hcHBlbmQocG9zaXRpb24pCiAgICAgICAgICAgIGZhbGxiYWNrID0gImZyb3plbl9oZWFkX2ludGVyY2VwdCIKICAgICAgICBpZiBtaXNzaW5nX3BsYW5lcyBvciBsZW4odmFsaWRfcm93cykgIT0gbGVuKHJvd3MpIG9yIG5vdCB2YWx1ZXM6CiAgICAgICAgICAgIHN0dWR5X2RpYWdub3N0aWNzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAic3R1ZHlfaWRfc2hhMjU2Ijogc2hhMjU2X3RleHQoc3RyKHN0dWR5X3VpZCkpLAogICAgICAgICAgICAgICAgIm1ldGFkYXRhX3NlcmllcyI6IGludChsZW4ocm93cykpLAogICAgICAgICAgICAgICAgInZhbGlkX3NlcmllcyI6IGludChsZW4odmFsaWRfcm93cykpLAogICAgICAgICAgICAgICAgIm1pc3NpbmdfdmFsaWRfcGxhbmVzIjogbWlzc2luZ19wbGFuZXMsCiAgICAgICAgICAgICAgICAicHJlZGljdGlvbl9zb3VyY2UiOiBmYWxsYmFjaywKICAgICAgICAgICAgfSkKICAgIHJldHVybiBucC5zdGFjayhzdHVkeV9mZWF0dXJlcykuYXN0eXBlKG5wLmZsb2F0MzIpLCBub192YWxpZF9zZXJpZXMsIHN0dWR5X2RpYWdub3N0aWNzCgoKZGVmIG1haW4oKSAtPiBOb25lOgogICAgdG9yY2gubWFudWFsX3NlZWQoMCkKICAgIHRvcmNoLmJhY2tlbmRzLmN1ZG5uLmJlbmNobWFyayA9IEZhbHNlCiAgICB0b3JjaC5iYWNrZW5kcy5jdWRubi5kZXRlcm1pbmlzdGljID0gVHJ1ZQogICAgc3RhcnRlZCA9IHRpbWUucGVyZl9jb3VudGVyKCkKICAgIG91dHB1dF9kaXIgPSBQYXRoKE9VVFBVVF9ESVIpCiAgICBpZiBub3Qgb3V0cHV0X2Rpci5pc19kaXIoKToKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImNyZWF0ZSB0aGUgZXhwbGljaXRseSBzZWxlY3RlZCBlbXB0eSBvdXRwdXQgZGlyZWN0b3J5IGZpcnN0IikKICAgIGlmIChvdXRwdXRfZGlyIC8gInN1Ym1pc3Npb24uY3N2IikuZXhpc3RzKCkgb3IgKG91dHB1dF9kaXIgLyAiaW5mZXJlbmNlX3ZhbGlkYXRpb24uanNvbiIpLmV4aXN0cygpOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiaW5mZXJlbmNlIG91dHB1dCBleGlzdHM7IHByZXNlcnZlIGl0IikKICAgIG1vZGVsX3Jvb3QgPSByZXNvbHZlX21vZGVsX2lucHV0KCkKICAgIG1vZGVsX21hbmlmZXN0LCBhcnJheXMgPSB2YWxpZGF0ZV9tb2RlbF9pbnB1dChtb2RlbF9yb290KQogICAgYmFzZSA9IGxvYWRfZnJvemVuX2UwKG1vZGVsX3Jvb3QpCiAgICBjaGVja3BvaW50ID0gcmVzb2x2ZV9jaGVja3BvaW50KCkKICAgIHNlcmllc19jc3YsIHNhbXBsZV9jc3YsIGRpY29tX3Jvb3QgPSByZXNvbHZlX2NvbXBldGl0aW9uX3Rlc3QoKQogICAgc2FtcGxlID0gcGQucmVhZF9jc3Yoc2FtcGxlX2NzdiwgZHR5cGU9eyJTdHVkeUluc3RhbmNlVUlEIjogc3RyfSkKICAgIGV4cGVjdGVkX2NvbHVtbnMgPSBbIlN0dWR5SW5zdGFuY2VVSUQiLCAqRklORElOR1NdCiAgICBpZiBzYW1wbGUuY29sdW1ucy50b2xpc3QoKSAhPSBleHBlY3RlZF9jb2x1bW5zIG9yIHNhbXBsZS5TdHVkeUluc3RhbmNlVUlELmR1cGxpY2F0ZWQoKS5hbnkoKToKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoInNhbXBsZSBzdWJtaXNzaW9uIHNjaGVtYSBtaXNtYXRjaCIpCiAgICBzZXJpZXMgPSBwZC5yZWFkX2NzdihzZXJpZXNfY3N2LCBkdHlwZT1zdHIsIGtlZXBfZGVmYXVsdF9uYT1GYWxzZSkKICAgIHJlcXVpcmVkID0geyJTdHVkeUluc3RhbmNlVUlEIiwgIlNlcmllc0luc3RhbmNlVUlEIiwgIkFuYXRvbWljYWxfUGxhbmUifQogICAgaWYgbm90IHJlcXVpcmVkLmlzc3Vic2V0KHNlcmllcy5jb2x1bW5zKToKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoInRlc3Qgc2VyaWVzIG1ldGFkYXRhIG1pc21hdGNoIikKICAgIGR1cGxpY2F0ZV9zZXJpZXMgPSBpbnQoc2VyaWVzLlNlcmllc0luc3RhbmNlVUlELmR1cGxpY2F0ZWQoa2VlcD0iZmlyc3QiKS5zdW0oKSkKICAgIHNlcmllcyA9IHNlcmllcy5kcm9wX2R1cGxpY2F0ZXMoIlNlcmllc0luc3RhbmNlVUlEIiwga2VlcD0iZmlyc3QiKS5jb3B5KCkKICAgIHNhbXBsZV9zZXQgPSBzZXQoc2FtcGxlLlN0dWR5SW5zdGFuY2VVSUQpCiAgICBleHRyYV9zdHVkeV9zZXJpZXMgPSBpbnQoKH5zZXJpZXMuU3R1ZHlJbnN0YW5jZVVJRC5pc2luKHNhbXBsZV9zZXQpKS5zdW0oKSkKICAgIHNlcmllcyA9IHNlcmllc1tzZXJpZXMuU3R1ZHlJbnN0YW5jZVVJRC5pc2luKHNhbXBsZV9zZXQpXS5jb3B5KCkKICAgIG9yZGVyID0ge3ZhbHVlOiBpbmRleCBmb3IgaW5kZXgsIHZhbHVlIGluIGVudW1lcmF0ZShzYW1wbGUuU3R1ZHlJbnN0YW5jZVVJRCl9CiAgICBzZXJpZXNbImNvaG9ydF9pbmRleCJdID0gc2VyaWVzLlN0dWR5SW5zdGFuY2VVSUQubWFwKG9yZGVyKS5hc3R5cGUoaW50KQogICAgc2VyaWVzWyJhbmF0b21pY2FsX3BsYW5lIl0gPSBzZXJpZXMuQW5hdG9taWNhbF9QbGFuZS5zdHIuc3RyaXAoKS5zdHIudGl0bGUoKQogICAgc2VyaWVzWyJzdHVkeV9pZF9zaGEyNTYiXSA9IHNlcmllcy5TdHVkeUluc3RhbmNlVUlELm1hcChzaGEyNTZfdGV4dCkKICAgIHNlcmllc1sic2VyaWVzX2lkX3NoYTI1NiJdID0gc2VyaWVzLlNlcmllc0luc3RhbmNlVUlELm1hcChzaGEyNTZfdGV4dCkKICAgIHNlcmllcyA9IHNlcmllcy5zb3J0X3ZhbHVlcyhbImNvaG9ydF9pbmRleCIsICJhbmF0b21pY2FsX3BsYW5lIiwgIlNlcmllc0luc3RhbmNlVUlEIl0sIGtpbmQ9Im1lcmdlc29ydCIpLnJlc2V0X2luZGV4KGRyb3A9VHJ1ZSkKICAgIHNlcmllcy5pbnNlcnQoMCwgImdsb2JhbF9zZXJpZXNfaW5kZXgiLCBucC5hcmFuZ2UobGVuKHNlcmllcyksIGR0eXBlPW5wLmludDY0KSkKICAgIHVuc3VwcG9ydGVkX3BsYW5lID0gfnNlcmllcy5hbmF0b21pY2FsX3BsYW5lLmlzaW4oUExBTkVTKQogICAgdW5zdXBwb3J0ZWRfcmVjb3JkcyA9IFsKICAgICAgICB7CiAgICAgICAgICAgICJzdHVkeV9pZF9zaGEyNTYiOiBzdHIocm93LnN0dWR5X2lkX3NoYTI1NiksCiAgICAgICAgICAgICJzZXJpZXNfaWRfc2hhMjU2Ijogc3RyKHJvdy5zZXJpZXNfaWRfc2hhMjU2KSwKICAgICAgICAgICAgInJlYXNvbl9jbGFzcyI6ICJVbnN1cHBvcnRlZEFuYXRvbWljYWxQbGFuZSIsCiAgICAgICAgICAgICJyZWFzb25fc2hhMjU2Ijogc2hhMjU2X3RleHQoIlVuc3VwcG9ydGVkQW5hdG9taWNhbFBsYW5lOiIgKyBzdHIocm93LmFuYXRvbWljYWxfcGxhbmUpKSwKICAgICAgICB9CiAgICAgICAgZm9yIHJvdyBpbiBzZXJpZXNbdW5zdXBwb3J0ZWRfcGxhbmVdLml0ZXJ0dXBsZXMoaW5kZXg9RmFsc2UpCiAgICBdCiAgICBlbGlnaWJsZV9zZXJpZXMgPSBzZXJpZXNbfnVuc3VwcG9ydGVkX3BsYW5lXS5jb3B5KCkKCiAgICBkZXZpY2UsIGZhbGxiYWNrX3JlYXNvbiwgYXNzaWduZWRfZ3B1ID0gYmFzZS5zZWxlY3RfZGV2aWNlKCkKICAgIGlmIGRldmljZSA9PSAiY3VkYSI6CiAgICAgICAgdG9yY2guY3VkYS5yZXNldF9wZWFrX21lbW9yeV9zdGF0cygpCiAgICBtb2RlbCwgYmFja2JvbmVfaGFzaCA9IGJhc2UuYnVpbGRfbW9kZWwoY2hlY2twb2ludCwgZGV2aWNlKQogICAgaWYgYmFja2JvbmVfaGFzaCAhPSBFWFBFQ1RFRF9SRVNORVQxOF9CQUNLQk9ORV9TSEEyNTY6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJsb2FkZWQgUmVzTmV0LTE4IGJhY2tib25lIG1pc21hdGNoIikKCiAgICBmZWF0dXJlc19ieV9zZXJpZXM6IGRpY3RbaW50LCBucC5uZGFycmF5XSA9IHt9CiAgICBmYWlsdXJlcyA9IGxpc3QodW5zdXBwb3J0ZWRfcmVjb3JkcykKICAgIHN0b3BwZWRfZWFybHkgPSBGYWxzZQogICAgcHJvY2Vzc2VkX3NlcmllcyA9IDAKICAgIGZvciBvZmZzZXQsIHJvdyBpbiBlbnVtZXJhdGUoZWxpZ2libGVfc2VyaWVzLml0ZXJ0dXBsZXMoaW5kZXg9RmFsc2UpKToKICAgICAgICBpZiB0aW1lLnBlcmZfY291bnRlcigpIC0gc3RhcnRlZCA+IFNBRkVfU1RPUF9TRUNPTkRTOgogICAgICAgICAgICBzdG9wcGVkX2Vhcmx5ID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgICAgIHRyeToKICAgICAgICAgICAgc2VyaWVzX2RpciA9IGRpY29tX3Jvb3QgLyBzdHIocm93LlN0dWR5SW5zdGFuY2VVSUQpIC8gc3RyKHJvdy5TZXJpZXNJbnN0YW5jZVVJRCkKICAgICAgICAgICAgb3JkZXJlZCwgXyA9IGJhc2UuZ2VvbWV0cnlfb3JkZXJlZF9wYXRocyhzZXJpZXNfZGlyKQogICAgICAgICAgICBpbmRpY2VzID0gYmFzZS5jZW50cmFsX2ZpdmVfaW5kaWNlcyhsZW4ob3JkZXJlZCkpCiAgICAgICAgICAgIGltYWdlcyA9IFtiYXNlLmRlY29kZV9hbmRfc2NhbGUoUGF0aChvcmRlcmVkW2luZGV4XVsicGF0aCJdKSlbMF0gZm9yIGluZGV4IGluIGluZGljZXNdCiAgICAgICAgICAgIGVuY29kZWQgPSBiYXNlLmVuY29kZShtb2RlbCwgaW1hZ2VzLCBkZXZpY2UpCiAgICAgICAgICAgIGZlYXR1cmVzX2J5X3Nlcmllc1tpbnQocm93Lmdsb2JhbF9zZXJpZXNfaW5kZXgpXSA9IGVuY29kZWQubWVhbihheGlzPTAsIGR0eXBlPW5wLmZsb2F0NjQpLmFzdHlwZShucC5mbG9hdDMyKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyb3I6CiAgICAgICAgICAgIGZhaWx1cmVzLmFwcGVuZChmYWlsdXJlX3JlY29yZChyb3csIGVycm9yKSkKICAgICAgICBwcm9jZXNzZWRfc2VyaWVzICs9IDEKICAgICAgICBpZiAob2Zmc2V0ICsgMSkgJSAxMDAgPT0gMDoKICAgICAgICAgICAgcHJpbnQoanNvbi5kdW1wcyh7InNlcmllc19jb21wbGV0ZSI6IG9mZnNldCArIDEsICJzZXJpZXNfdG90YWwiOiBsZW4oZWxpZ2libGVfc2VyaWVzKSwgImZhaWx1cmVzIjogbGVuKGZhaWx1cmVzKSwgImVsYXBzZWRfc2Vjb25kcyI6IHRpbWUucGVyZl9jb3VudGVyKCkgLSBzdGFydGVkfSwgc29ydF9rZXlzPVRydWUpKQoKICAgIGZlYXR1cmVzLCBub192YWxpZF9zZXJpZXMsIHN0dWR5X2RpYWdub3N0aWNzID0gYWdncmVnYXRlX3N0dWRpZXMoCiAgICAgICAgc2FtcGxlLlN0dWR5SW5zdGFuY2VVSUQudG9saXN0KCksIHNlcmllcywgZmVhdHVyZXNfYnlfc2VyaWVzLCBiYXNlCiAgICApCiAgICBwcmVkaWN0aW9uID0gcHJlZGljdF9tb2RlbChhcnJheXMsIGZlYXR1cmVzKQogICAgaWYgbm9fdmFsaWRfc2VyaWVzOgogICAgICAgIHByZWRpY3Rpb25bbnAuYXNhcnJheShub192YWxpZF9zZXJpZXMsIGR0eXBlPWludCldID0gZXhwaXQoYXJyYXlzWyJpbnRlcmNlcHQiXSkKICAgIGlmIG5vdCBucC5pc2Zpbml0ZShwcmVkaWN0aW9uKS5hbGwoKSBvciAoKHByZWRpY3Rpb24gPCAwKSB8IChwcmVkaWN0aW9uID4gMSkpLmFueSgpOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiaW52YWxpZCBzaW5nbGUtbW9kZWwgcHJlZGljdGlvbiIpCiAgICBzdWJtaXNzaW9uID0gcGQuRGF0YUZyYW1lKHByZWRpY3Rpb24sIGNvbHVtbnM9bGlzdChGSU5ESU5HUykpCiAgICBzdWJtaXNzaW9uLmluc2VydCgwLCAiU3R1ZHlJbnN0YW5jZVVJRCIsIHNhbXBsZS5TdHVkeUluc3RhbmNlVUlELnRvX251bXB5KCkpCiAgICBpZiBzdWJtaXNzaW9uLmNvbHVtbnMudG9saXN0KCkgIT0gZXhwZWN0ZWRfY29sdW1ucyBvciBzdWJtaXNzaW9uLlN0dWR5SW5zdGFuY2VVSUQudG9saXN0KCkgIT0gc2FtcGxlLlN0dWR5SW5zdGFuY2VVSUQudG9saXN0KCk6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJmaW5hbCBzdWJtaXNzaW9uIG9yZGVyaW5nIG1pc21hdGNoIikKICAgIHN1Ym1pc3Npb25fcGF0aCA9IG91dHB1dF9kaXIgLyAic3VibWlzc2lvbi5jc3YiCiAgICBzdWJtaXNzaW9uLnRvX2NzdihzdWJtaXNzaW9uX3BhdGgsIGluZGV4PUZhbHNlLCBsaW5ldGVybWluYXRvcj0iXG4iLCBmbG9hdF9mb3JtYXQ9IiUuMTdnIikKCiAgICBkaWFnbm9zdGljcyA9IHsKICAgICAgICAic2NoZW1hX3ZlcnNpb24iOiAyLAogICAgICAgICJtaXNzaW5nX3Nlcmllc19wb2xpY3kiOiBNSVNTSU5HX1NFUklFU19QT0xJQ1ksCiAgICAgICAgImR1cGxpY2F0ZV9zZXJpZXNfbWV0YWRhdGFfcm93c19vbWl0dGVkIjogZHVwbGljYXRlX3NlcmllcywKICAgICAgICAic2VyaWVzX2Zvcl9ub25fc2FtcGxlX3N0dWRpZXNfb21pdHRlZCI6IGV4dHJhX3N0dWR5X3NlcmllcywKICAgICAgICAibWV0YWRhdGFfc2VyaWVzIjogaW50KGxlbihzZXJpZXMpKSwKICAgICAgICAiZWxpZ2libGVfc2VyaWVzIjogaW50KGxlbihlbGlnaWJsZV9zZXJpZXMpKSwKICAgICAgICAicHJvY2Vzc2VkX3NlcmllcyI6IHByb2Nlc3NlZF9zZXJpZXMsCiAgICAgICAgInZhbGlkX3NlcmllcyI6IGludChsZW4oZmVhdHVyZXNfYnlfc2VyaWVzKSksCiAgICAgICAgIm9taXR0ZWRfc2VyaWVzIjogZmFpbHVyZXMsCiAgICAgICAgIm9taXR0ZWRfc2VyaWVzX2NvdW50IjogbGVuKGZhaWx1cmVzKSwKICAgICAgICAicnVudGltZV9ndWFyZF90cmlnZ2VyZWQiOiBzdG9wcGVkX2Vhcmx5LAogICAgICAgICJ1bnByb2Nlc3NlZF9zZXJpZXNfYWZ0ZXJfcnVudGltZV9ndWFyZCI6IGludChsZW4oZWxpZ2libGVfc2VyaWVzKSAtIHByb2Nlc3NlZF9zZXJpZXMpLAogICAgICAgICJkZWdyYWRlZF9zdHVkaWVzIjogc3R1ZHlfZGlhZ25vc3RpY3MsCiAgICAgICAgImRlZ3JhZGVkX3N0dWR5X2NvdW50IjogbGVuKHN0dWR5X2RpYWdub3N0aWNzKSwKICAgICAgICAiaW50ZXJjZXB0X2ZhbGxiYWNrX3N0dWR5X2NvdW50IjogbGVuKG5vX3ZhbGlkX3NlcmllcyksCiAgICAgICAgInJhd19pZGVudGlmaWVyc193cml0dGVuIjogRmFsc2UsCiAgICB9CiAgICBkaWFnbm9zdGljc19wYXRoID0gb3V0cHV0X2RpciAvICJpbmZlcmVuY2VfZGlhZ25vc3RpY3MuanNvbiIKICAgIGRpYWdub3N0aWNzX3BhdGgud3JpdGVfdGV4dChqc29uLmR1bXBzKGRpYWdub3N0aWNzLCBpbmRlbnQ9Miwgc29ydF9rZXlzPVRydWUpICsgIlxuIiwgZW5jb2Rpbmc9InV0Zi04IikKCiAgICBzdW1tYXJ5ID0gewogICAgICAgICJzY2hlbWFfdmVyc2lvbiI6IDEsCiAgICAgICAgInN0YWdlIjogIkZJTkFMX1NJTFZFUl9PTkxZX1NJTkdMRV9NT0RFTF9NUklfSU5GRVJFTkNFIiwKICAgICAgICAic3RhdHVzIjogIkNPTVBMRVRFX1ZBTElEQVRFRF9TVUJNSVNTSU9OX0ZJTEVfQ1JFQVRFRF9OT1RfU1VCTUlUVEVEIiwKICAgICAgICAibW9kZWxfaWQiOiBtb2RlbF9tYW5pZmVzdFsibW9kZWxfaWQiXSwKICAgICAgICAic3R1ZGllcyI6IGxlbihzYW1wbGUpLAogICAgICAgICJzZXJpZXMiOiBsZW4oc2VyaWVzKSwKICAgICAgICAic2VsZWN0ZWRfc2xpY2VzIjogbGVuKGZlYXR1cmVzX2J5X3NlcmllcykgKiA1LAogICAgICAgICJsYWJlbHMiOiBsaXN0KEZJTkRJTkdTKSwKICAgICAgICAic3R1ZGVudF9tb2RlbHNfdXNlZCI6IDEsCiAgICAgICAgImZpdF9pZCI6IG1vZGVsX21hbmlmZXN0WyJmaXQiXVsiZml0X2lkIl0sCiAgICAgICAgIm1vZGVsX2lucHV0X21hbmlmZXN0X3NoYTI1NiI6IEVYUEVDVEVEX01PREVMX0lOUFVUX01BTklGRVNUX1NIQTI1NiwKICAgICAgICAibWlzc2luZ19zZXJpZXNfcG9saWN5IjogTUlTU0lOR19TRVJJRVNfUE9MSUNZLAogICAgICAgICJvbWl0dGVkX3NlcmllcyI6IGxlbihmYWlsdXJlcyksCiAgICAgICAgImRlZ3JhZGVkX3N0dWRpZXMiOiBsZW4oc3R1ZHlfZGlhZ25vc3RpY3MpLAogICAgICAgICJpbnRlcmNlcHRfZmFsbGJhY2tfc3R1ZGllcyI6IGxlbihub192YWxpZF9zZXJpZXMpLAogICAgICAgICJydW50aW1lX2d1YXJkX3RyaWdnZXJlZCI6IHN0b3BwZWRfZWFybHksCiAgICAgICAgImRpYWdub3N0aWNzX3NoYTI1NiI6IHNoYTI1Nl9maWxlKGRpYWdub3N0aWNzX3BhdGgpLAogICAgICAgICJNUklfb25seSI6IFRydWUsCiAgICAgICAgInJlcG9ydF90ZXh0X3JlYWQiOiBGYWxzZSwKICAgICAgICAidGVzdF9sYWJlbHNfcmVhZCI6IEZhbHNlLAogICAgICAgICJpbnRlcm5ldF9yZXF1aXJlZCI6IEZhbHNlLAogICAgICAgICJwcml2YXRlX2tlcm5lbF9yZXF1aXJlZCI6IFRydWUsCiAgICAgICAgImNvbXBldGl0aW9uX3N1Ym1pc3Npb25fcGVyZm9ybWVkIjogRmFsc2UsCiAgICAgICAgInN1Ym1pc3Npb25fc2hhMjU2Ijogc2hhMjU2X2ZpbGUoc3VibWlzc2lvbl9wYXRoKSwKICAgICAgICAicnVudGltZV9zZWNvbmRzIjogdGltZS5wZXJmX2NvdW50ZXIoKSAtIHN0YXJ0ZWQsCiAgICAgICAgImVudmlyb25tZW50IjogeyJweXRob24iOiBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpLCAibnVtcHkiOiBucC5fX3ZlcnNpb25fXywgInBhbmRhcyI6IHBkLl9fdmVyc2lvbl9fLCAidG9yY2giOiB0b3JjaC5fX3ZlcnNpb25fXywgImRldmljZSI6IGRldmljZSwgImFzc2lnbmVkX2dwdSI6IGFzc2lnbmVkX2dwdSwgImRldmljZV9mYWxsYmFja19yZWFzb24iOiBmYWxsYmFja19yZWFzb259LAogICAgfQogICAgKG91dHB1dF9kaXIgLyAiaW5mZXJlbmNlX3ZhbGlkYXRpb24uanNvbiIpLndyaXRlX3RleHQoanNvbi5kdW1wcyhzdW1tYXJ5LCBpbmRlbnQ9Miwgc29ydF9rZXlzPVRydWUpICsgIlxuIiwgZW5jb2Rpbmc9InV0Zi04IikKICAgIHByaW50KGpzb24uZHVtcHMoc3VtbWFyeSwgaW5kZW50PTIsIHNvcnRfa2V5cz1UcnVlKSkKCgpkZWYgcHJlZGljdF9jYWNoZWRfZmVhdHVyZXMoZmVhdHVyZXNfcGF0aDogUGF0aCwgZmVhdHVyZXNfc2hhMjU2OiBzdHIpIC0+IE5vbmU6CiAgICBvdXRwdXQgPSBQYXRoKE9VVFBVVF9ESVIpIC8gInByb2JhYmlsaXRpZXMubnB6IgogICAgaWYgbm90IFBhdGgoT1VUUFVUX0RJUikuaXNfZGlyKCkgb3Igb3V0cHV0LmV4aXN0cygpOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiZXhwbGljaXQgb3V0cHV0IGRpcmVjdG9yeSBtaXNzaW5nIG9yIG91dHB1dCBhbHJlYWR5IGV4aXN0cyIpCiAgICBpZiBzaGEyNTZfZmlsZShmZWF0dXJlc19wYXRoKSAhPSBmZWF0dXJlc19zaGEyNTY6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJleHBsaWNpdCBNUkkgZmVhdHVyZSBjaGVja3N1bSBtaXNtYXRjaCIpCiAgICByb290ID0gcmVzb2x2ZV9tb2RlbF9pbnB1dCgpCiAgICBtYW5pZmVzdCwgcGFyYW1ldGVycyA9IHZhbGlkYXRlX21vZGVsX2lucHV0KHJvb3QpCiAgICB3aXRoIG5wLmxvYWQoZmVhdHVyZXNfcGF0aCwgYWxsb3dfcGlja2xlPUZhbHNlKSBhcyBhcmNoaXZlOgogICAgICAgIGRhdGEgPSB7a2V5OiBhcmNoaXZlW2tleV0gZm9yIGtleSBpbiBhcmNoaXZlLmZpbGVzfQogICAgaWYgbm90IHsibXJpX2ZlYXR1cmVzIiwgInBhdGllbnRfaWRfc2hhMjU2In0uaXNzdWJzZXQoZGF0YSkgb3Igbm90IHNldChkYXRhKS5pc3N1YnNldCh7Im1yaV9mZWF0dXJlcyIsICJwYXRpZW50X2lkX3NoYTI1NiIsICJzdHVkeV9pZF9zaGEyNTYifSk6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJjYWNoZWQgcHJlZGljdGlvbiBhY2NlcHRzIE1SSSBmZWF0dXJlcyBhbmQgaWRlbnRpdGllcyBvbmx5IikKICAgIG4gPSBsZW4oZGF0YVsibXJpX2ZlYXR1cmVzIl0pCiAgICBmb3IgbmFtZSBpbiBbInBhdGllbnRfaWRfc2hhMjU2IiwgInN0dWR5X2lkX3NoYTI1NiJdOgogICAgICAgIGlmIG5hbWUgaW4gZGF0YSBhbmQgKGRhdGFbbmFtZV0uc2hhcGUgIT0gKG4sKSBvciBsZW4oc2V0KGRhdGFbbmFtZV0udG9saXN0KCkpKSAhPSBuKToKICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJNUkkgaWRlbnRpdHkgc2hhcGUgb3IgZHVwbGljYXRpb24iKQogICAgcmVzdWx0ID0gcHJlZGljdF9tb2RlbChwYXJhbWV0ZXJzLCBkYXRhWyJtcmlfZmVhdHVyZXMiXSkKICAgIHdpdGggb3V0cHV0Lm9wZW4oInhiIikgYXMgZjoKICAgICAgICBucC5zYXZlel9jb21wcmVzc2VkKGYsIHByb2JhYmlsaXRpZXM9cmVzdWx0LCBmaW5kaW5ncz1ucC5hc2FycmF5KEZJTkRJTkdTKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdF9pZD1ucC5hc2FycmF5KG1hbmlmZXN0WyJmaXQiXVsiZml0X2lkIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfaW5wdXRfbWFuaWZlc3Rfc2hhMjU2PW5wLmFzYXJyYXkoRVhQRUNURURfTU9ERUxfSU5QVVRfTUFOSUZFU1RfU0hBMjU2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqe2tleTogZGF0YVtrZXldIGZvciBrZXkgaW4gWyJwYXRpZW50X2lkX3NoYTI1NiIsICJzdHVkeV9pZF9zaGEyNTYiXSBpZiBrZXkgaW4gZGF0YX0pCgoKZGVmIGNsaSgpIC0+IE5vbmU6CiAgICBnbG9iYWwgTU9ERUxfUk9PVCwgT1VUUFVUX0RJUiwgRVhQRUNURURfTU9ERUxfSU5QVVRfTUFOSUZFU1RfU0hBMjU2CiAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj1fX2RvY19fKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1tb2RlbC1yb290IiwgdHlwZT1QYXRoLCByZXF1aXJlZD1UcnVlKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1tb2RlbC1pbnB1dC1tYW5pZmVzdC1zaGEyNTYiLCByZXF1aXJlZD1UcnVlKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1vdXRwdXQtZGlyIiwgdHlwZT1QYXRoLCByZXF1aXJlZD1UcnVlKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1mZWF0dXJlcyIsIHR5cGU9UGF0aCkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZmVhdHVyZXMtc2hhMjU2IikKICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAgICBpZiBsZW4oYXJncy5tb2RlbF9pbnB1dF9tYW5pZmVzdF9zaGEyNTYpICE9IDY0IG9yIGFueShjIG5vdCBpbiAiMDEyMzQ1Njc4OWFiY2RlZiIgZm9yIGMgaW4gYXJncy5tb2RlbF9pbnB1dF9tYW5pZmVzdF9zaGEyNTYpOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiZXhhY3QgZmluYWwgcGFja2FnZSBTSEEyNTYgcmVxdWlyZWQiKQogICAgTU9ERUxfUk9PVCA9IGFyZ3MubW9kZWxfcm9vdAogICAgT1VUUFVUX0RJUiA9IGFyZ3Mub3V0cHV0X2RpcgogICAgRVhQRUNURURfTU9ERUxfSU5QVVRfTUFOSUZFU1RfU0hBMjU2ID0gYXJncy5tb2RlbF9pbnB1dF9tYW5pZmVzdF9zaGEyNTYKICAgIGlmIGFyZ3MuZmVhdHVyZXMgaXMgbm90IE5vbmU6CiAgICAgICAgaWYgYXJncy5mZWF0dXJlc19zaGEyNTYgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJjYWNoZWQgTVJJIGZlYXR1cmUgU0hBMjU2IHJlcXVpcmVkIikKICAgICAgICBwcmVkaWN0X2NhY2hlZF9mZWF0dXJlcyhhcmdzLmZlYXR1cmVzLCBhcmdzLmZlYXR1cmVzX3NoYTI1NikKICAgIGVsc2U6CiAgICAgICAgaWYgYXJncy5mZWF0dXJlc19zaGEyNTYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiZmVhdHVyZSBjaGVja3N1bSBwcm92aWRlZCB3aXRob3V0IGZlYXR1cmUgaW5wdXQiKQogICAgICAgIG1haW4oKQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBjbGkoKQo=\",\"bytes\":21854,\"sha256\":\"5148b59c6baac5616c9222f40b403610742e8346a76591017ce52f02b45b838b\"},\"student_parameters.npz\":{\"base64\":\"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\",\"bytes\":56128,\"sha256\":\"4d7fefb5c921ee4b564f06b44e5cc459d78c25cc7bd9327ca5e6c0e915d5e04e\"}}')\nEXPECTED_INPUT_MANIFEST_SHA256='7f3eebfb96ee0dd55b59ac6f5df4cb95932d78216cd309fe14004f43bfb42690'\nEXPECTED_MODEL_SHA256='4d7fefb5c921ee4b564f06b44e5cc459d78c25cc7bd9327ca5e6c0e915d5e04e'\nEXPECTED_EXTRACTOR_SHA256='2f4e00016d064ce46e9034f1becf0a9f6fd88d541ab0ddffac2e924b9a64cad2'\nEXPECTED_POLICY='omit_failed_series_pool_valid_or_intercept_fallback_v2'\nKERNEL_ID='raymondodianfloyd/rsna-knee-silver4221-multisource-robust-submit-v2'\n\ndef sha(path):\n    h=hashlib.sha256()\n    with Path(path).open(\"rb\") as f:\n        for chunk in iter(lambda:f.read(1024*1024),b\"\"): h.update(chunk)\n    return h.hexdigest()\n\nworking=Path(\"/kaggle/working\")\npackage_root=working/\"exact_evaluated_package_v2\"\noutput_root=working/\"inference_output_v2\"\npackage_root.mkdir(parents=False,exist_ok=False)\noutput_root.mkdir(parents=False,exist_ok=False)\nfor name,item in PACKAGE.items():\n    data=base64.b64decode(item[\"base64\"],validate=True)\n    if len(data)!=item[\"bytes\"] or hashlib.sha256(data).hexdigest()!=item[\"sha256\"]: raise RuntimeError(\"embedded package validation failed\")\n    target=package_root/name\n    with target.open(\"xb\") as f: f.write(data)\n    if sha(target)!=item[\"sha256\"]: raise RuntimeError(\"reconstructed package validation failed\")\nif sha(package_root/\"input_manifest.json\")!=EXPECTED_INPUT_MANIFEST_SHA256: raise RuntimeError(\"input manifest changed\")\nif sha(package_root/\"student_parameters.npz\")!=EXPECTED_MODEL_SHA256: raise RuntimeError(\"evaluated weights changed\")\nif sha(package_root/\"frozen_e0_feature_extraction.py\")!=EXPECTED_EXTRACTOR_SHA256: raise RuntimeError(\"frozen extractor changed\")\n\npath=package_root/\"single_model_inference.py\"\nspec=importlib.util.spec_from_file_location(\"robust_v2_inference\",path)\nadapter=importlib.util.module_from_spec(spec); spec.loader.exec_module(adapter)\nadapter.MODEL_ROOT=package_root\nadapter.OUTPUT_DIR=output_root\nadapter.EXPECTED_MODEL_INPUT_MANIFEST_SHA256=EXPECTED_INPUT_MANIFEST_SHA256\nadapter.main()\n\nvalidation=json.loads((output_root/\"inference_validation.json\").read_text())\ndiagnostics=json.loads((output_root/\"inference_diagnostics.json\").read_text())\nsubmission=output_root/\"submission.csv\"\nif validation[\"status\"]!=\"COMPLETE_VALIDATED_SUBMISSION_FILE_CREATED_NOT_SUBMITTED\": raise RuntimeError(\"v2 inference incomplete\")\nif validation[\"missing_series_policy\"]!=EXPECTED_POLICY: raise RuntimeError(\"v2 policy changed\")\nif validation[\"submission_sha256\"]!=sha(submission): raise RuntimeError(\"submission checksum mismatch\")\nif diagnostics[\"raw_identifiers_written\"] is not False: raise RuntimeError(\"diagnostic privacy failure\")\n\nroot_submission=working/\"submission.csv\"\nwith submission.open(\"rb\") as source,root_submission.open(\"xb\") as target:\n    for chunk in iter(lambda:source.read(1024*1024),b\"\"): target.write(chunk)\nif sha(root_submission)!=validation[\"submission_sha256\"]: raise RuntimeError(\"root submission copy mismatch\")\nreceipt={\n \"schema_version\":2,\"status\":\"ROBUST_V2_VALIDATED_SUBMISSION_FILE_CREATED\",\n \"kernel_id\":KERNEL_ID,\"model_sha256\":EXPECTED_MODEL_SHA256,\"extractor_sha256\":EXPECTED_EXTRACTOR_SHA256,\n \"input_manifest_sha256\":EXPECTED_INPUT_MANIFEST_SHA256,\"submission_sha256\":sha(root_submission),\n \"studies\":validation[\"studies\"],\"series\":validation[\"series\"],\"selected_slices\":validation[\"selected_slices\"],\n \"omitted_series\":validation[\"omitted_series\"],\"degraded_studies\":validation[\"degraded_studies\"],\n \"intercept_fallback_studies\":validation[\"intercept_fallback_studies\"],\"runtime_guard_triggered\":validation[\"runtime_guard_triggered\"],\n \"runtime_seconds\":validation[\"runtime_seconds\"],\"environment\":validation[\"environment\"],\n \"competition_submission_performed_by_notebook\":False,\"MRI_only\":True,\"test_labels_read\":False,\"report_text_read\":False\n}\n(output_root/\"submission_receipt.json\").write_text(json.dumps(receipt,indent=2,sort_keys=True)+\"\\n\")\nprint(json.dumps(receipt,indent=2,sort_keys=True))\n"}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3"}},"nbformat":4,"nbformat_minor":5}