From 28e80ef41f44afe3132be13c2c4d134ca649c94c Mon Sep 17 00:00:00 2001 From: Jonathan Daniel Date: Thu, 14 Dec 2023 13:53:58 +0200 Subject: [PATCH] Update parameter docstrings --- batch_inference_v2/batch_inference_v2.py | 9 ++++++++- batch_inference_v2/function.yaml | 17 +++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/batch_inference_v2/batch_inference_v2.py b/batch_inference_v2/batch_inference_v2.py index 932d36724..76596d87c 100644 --- a/batch_inference_v2/batch_inference_v2.py +++ b/batch_inference_v2/batch_inference_v2.py @@ -186,7 +186,14 @@ def infer( Can be provided as an input (DataItem) or as a parameter (e.g. string, list, DataFrame). The default chosen sample set will always be the one who is set in the model artifact itself. :param last_in_batch_set: Relevant only when `perform_drift_analysis` is `True`. - Whether to mark the monitoring window as completed and allow monitoring without extra inferences. + This flag can (and should only) be used when the model endpoint does not have + model-monitoring set. + If set to `True` (the default), this flag marks the current monitoring window + (on this monitoring endpoint) as completed - the data inferred so far is assumed + to be the complete data for this monitoring window. + You may want to set this flag to `False` if you want to record multiple results in + close time proximity ("batch set"). In this case, set this flag to `False` on all + but the last batch in the set. Defaults to `None`, which means use the `mlrun`'s default if the parameter exists. raises MLRunInvalidArgumentError: if both `model_path` and `endpoint_id` are not provided, or if `last_in_batch_set` is provided for an unsupported `mlrun` version. diff --git a/batch_inference_v2/function.yaml b/batch_inference_v2/function.yaml index 6363026ac..4f57c248c 100644 --- a/batch_inference_v2/function.yaml +++ b/batch_inference_v2/function.yaml @@ -2,7 +2,7 @@ kind: job metadata: name: batch-inference-v2 tag: '' - hash: 8c2ad570bf4b9c6e566be919e2ad4c44fe011b2c + hash: 2163eec76ea73c72c5d4debf4d13e514dfca0f1f project: '' labels: author: eyald @@ -15,7 +15,7 @@ spec: args: [] image: mlrun/mlrun build: - functionSourceCode: IyBDb3B5cmlnaHQgMjAyMyBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgpmcm9tIGluc3BlY3QgaW1wb3J0IHNpZ25hdHVyZQpmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBEaWN0LCBMaXN0LCBPcHRpb25hbCwgVW5pb24KCmltcG9ydCBtbHJ1bgoKdHJ5OgogICAgaW1wb3J0IG1scnVuLm1vZGVsX21vbml0b3JpbmcuYXBpCmV4Y2VwdCBNb2R1bGVOb3RGb3VuZEVycm9yOgogICAgcmFpc2UgbWxydW4uZXJyb3JzLk1MUnVuTm90Rm91bmRFcnJvcigKICAgICAgICBmIlBsZWFzZSB1cGRhdGUgeW91ciBgbWxydW5gIHZlcnNpb24gdG8gPj0xLjUuMCBvciB1c2UgYW4gIgogICAgICAgIGYib2xkZXIgdmVyc2lvbiBvZiB0aGUgYmF0Y2ggaW5mZXJlbmNlIGZ1bmN0aW9uLiIKICAgICkKCgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZApmcm9tIG1scnVuLmZyYW1ld29ya3MuYXV0b19tbHJ1biBpbXBvcnQgQXV0b01MUnVuCgoKZGVmIF9wcmVwYXJlX3Jlc3VsdF9zZXQoCiAgICB4OiBwZC5EYXRhRnJhbWUsIGxhYmVsX2NvbHVtbnM6IExpc3Rbc3RyXSwgeV9wcmVkOiBucC5uZGFycmF5CikgLT4gcGQuRGF0YUZyYW1lOgogICAgIiIiCiAgICBTZXQgZGVmYXVsdCBsYWJlbCBjb2x1bW4gbmFtZXMgYW5kIHZhbGlkYXRlIGdpdmVuIG5hbWVzIHRvIHByZXBhcmUgdGhlIHJlc3VsdCBzZXQgLSBhIGNvbmNhdGVuYXRpb24gb2YgdGhlIGlucHV0cwogICAgKHgpIGFuZCB0aGUgbW9kZWwgcHJlZGljdGlvbnMgKHlfcHJlZCkuCgogICAgOnBhcmFtIHg6ICAgICAgICAgICAgIFRoZSBpbnB1dHMuCiAgICA6cGFyYW0gbGFiZWxfY29sdW1uczogQSBsaXN0IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSB0YXJnZXQgY29sdW1uIG5hbWVzIHRvIGFkZCB0byB0aGUgcHJlZGljdGlvbnMuIERlZmF1bHQgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCBpbiBjYXNlIHRoZSBsaXN0IGlzIGVtcHR5IChwcmVkaWN0ZWRfbGFiZWxfe2l9KS4KICAgIDpwYXJhbSB5X3ByZWQ6ICAgICAgICBUaGUgbW9kZWwgcHJlZGljdGlvbnMgb24gdGhlIGlucHV0cy4KCiAgICA6cmV0dXJuczogVGhlIHJlc3VsdCBzZXQuCgogICAgcmFpc2VzIE1MUnVuSW52YWxpZEFyZ3VtZW50RXJyb3I6IElmIHRoZSBsYWJlbHMgY29sdW1ucyBhbW91bnQgZG8gbm90IG1hdGNoIHRoZSBvdXRwdXRzIG9yIGlmIG9uZSBvZiB0aGUgbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uIGFscmVhZHkgZXhpc3RzIGluIHRoZSBkYXRhc2V0LgogICAgIiIiCiAgICAjIFByZXBhcmUgZGVmYXVsdCB0YXJnZXQgY29sdW1ucyBuYW1lcyBpZiBub3QgcHJvdmlkZWQ6CiAgICBwcmVkaWN0aW9uX2NvbHVtbnNfYW1vdW50ID0gMSBpZiBsZW4oeV9wcmVkLnNoYXBlKSA9PSAxIGVsc2UgeV9wcmVkLnNoYXBlWzFdCiAgICBpZiBsZW4obGFiZWxfY29sdW1ucykgPT0gMDoKICAgICAgICAjIEFkZCBkZWZhdWx0IGxhYmVsIGNvbHVtbiBuYW1lczoKICAgICAgICBpZiBwcmVkaWN0aW9uX2NvbHVtbnNfYW1vdW50ID09IDE6CiAgICAgICAgICAgIGxhYmVsX2NvbHVtbnMgPSBbInByZWRpY3RlZF9sYWJlbCJdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbGFiZWxfY29sdW1ucyA9IFsKICAgICAgICAgICAgICAgIGYicHJlZGljdGVkX2xhYmVsX3tpfSIgZm9yIGkgaW4gcmFuZ2UocHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudCkKICAgICAgICAgICAgXQoKICAgICMgVmFsaWRhdGUgdGhlIGxhYmVsIGNvbHVtbnM6CiAgICBpZiBwcmVkaWN0aW9uX2NvbHVtbnNfYW1vdW50ICE9IGxlbihsYWJlbF9jb2x1bW5zKToKICAgICAgICAjIE5vIGVxdWFsaXR5IGJldHdlZW4gcHJvdmlkZWQgbGFiZWwgY29sdW1uIG5hbWVzIGFuZCBvdXRwdXRzIGFtb3VudDoKICAgICAgICByYWlzZSBtbHJ1bi5lcnJvcnMuTUxSdW5JbnZhbGlkQXJndW1lbnRFcnJvcigKICAgICAgICAgICAgZiJUaGUgbnVtYmVyIG9mIHByZWRpY3RlZCBsYWJlbHM6IHtwcmVkaWN0aW9uX2NvbHVtbnNfYW1vdW50fSAiCiAgICAgICAgICAgIGYiaXMgbm90IGVxdWFsIHRvIHRoZSBnaXZlbiBsYWJlbCBjb2x1bW5zOiB7bGVuKGxhYmVsX2NvbHVtbnMpfSIKICAgICAgICApCiAgICBjb21tb25fbGFiZWxzID0gc2V0KGxhYmVsX2NvbHVtbnMpICYgc2V0KHguY29sdW1ucy50b2xpc3QoKSkKICAgIGlmIGNvbW1vbl9sYWJlbHM6CiAgICAgICAgIyBMYWJlbCBjb2x1bW4gZXhpc3QgaW4gdGhlIG9yaWdpbmFsIGlucHV0czoKICAgICAgICByYWlzZSBtbHJ1bi5lcnJvcnMuTUxSdW5JbnZhbGlkQXJndW1lbnRFcnJvcigKICAgICAgICAgICAgZiJUaGUgbGFiZWxzOiB7Y29tbW9uX2xhYmVsc30gYXJlIGFscmVhZHkgZXhpc3RlZCBpbiB0aGUgZ2l2ZW4gZGF0YXNldC4iCiAgICAgICAgKQoKICAgIHJldHVybiBwZC5jb25jYXQoCiAgICAgICAgW3gsIHBkLkRhdGFGcmFtZSh5X3ByZWQsIGNvbHVtbnM9bGFiZWxfY29sdW1ucywgaW5kZXg9eC5pbmRleCldLCBheGlzPTEKICAgICkKCgpkZWYgX3BhcnNlX3JlY29yZF9yZXN1bHRzX2t3YXJnKAogICAgbGFzdF9pbl9iYXRjaF9zZXQ6IE9wdGlvbmFsW2Jvb2xdLAopIC0+IGRpY3Rbc3RyLCBib29sXToKICAgICIiIgogICAgQ2hlY2sgaWYgYGxhc3RfaW5fYmF0Y2hfc2V0YCBpcyBwcm92aWRlZCBhbmQgZXhwZWN0ZWQgYXMgYSBwYXJhbWV0ZXIuCiAgICBSZXR1cm4gaXQgYXMgYSBkaWN0aW9uYXJ5LgogICAgIiIiCiAgICBrd2FyZyA9ICJsYXN0X2luX2JhdGNoX3NldCIKICAgIGlmIGxhc3RfaW5fYmF0Y2hfc2V0IGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIHt9CiAgICBpZiAoCiAgICAgICAgc2lnbmF0dXJlKG1scnVuLm1vZGVsX21vbml0b3JpbmcuYXBpLnJlY29yZF9yZXN1bHRzKS5wYXJhbWV0ZXJzLmdldChrd2FyZykKICAgICAgICBpcyBOb25lCiAgICApOgogICAgICAgIHJhaXNlIG1scnVuLmVycm9ycy5NTFJ1bkludmFsaWRBcmd1bWVudEVycm9yKAogICAgICAgICAgICBmIlVuZXhwZWN0ZWQgcGFyYW1ldGVyIGB7a3dhcmd9YCBmb3IgZnVuY3Rpb246ICIKICAgICAgICAgICAgImBtbHJ1bi5tb2RlbF9tb25pdG9yaW5nLmFwaS5yZWNvcmRfcmVzdWx0c2AuICIKICAgICAgICAgICAgIlBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgYXJlIHVzaW5nIGBtbHJ1bj49MS42LjBgIHZlcnNpb24uIgogICAgICAgICkKICAgIHJldHVybiB7a3dhcmc6IGxhc3RfaW5fYmF0Y2hfc2V0fQoKCmRlZiBpbmZlcigKICAgIGNvbnRleHQ6IG1scnVuLk1MQ2xpZW50Q3R4LAogICAgZGF0YXNldDogVW5pb25bbWxydW4uRGF0YUl0ZW0sIGxpc3QsIGRpY3QsIHBkLkRhdGFGcmFtZSwgcGQuU2VyaWVzLCBucC5uZGFycmF5XSwKICAgIG1vZGVsX3BhdGg6IFVuaW9uW3N0ciwgbWxydW4uRGF0YUl0ZW1dLAogICAgZHJvcF9jb2x1bW5zOiBVbmlvbltzdHIsIExpc3Rbc3RyXSwgaW50LCBMaXN0W2ludF1dID0gTm9uZSwKICAgIGxhYmVsX2NvbHVtbnM6IFVuaW9uW3N0ciwgTGlzdFtzdHJdXSA9IE5vbmUsCiAgICBmZWF0dXJlX2NvbHVtbnM6IFVuaW9uW3N0ciwgTGlzdFtzdHJdXSA9IE5vbmUsCiAgICBsb2dfcmVzdWx0X3NldDogYm9vbCA9IFRydWUsCiAgICByZXN1bHRfc2V0X25hbWU6IHN0ciA9ICJwcmVkaWN0aW9uIiwKICAgIGJhdGNoX2lkOiBzdHIgPSBOb25lLAogICAgYXJ0aWZhY3RzX3RhZzogc3RyID0gIiIsCiAgICAjIERyaWZ0IGFuYWx5c2lzIHBhcmFtZXRlcnMKICAgIHBlcmZvcm1fZHJpZnRfYW5hbHlzaXM6IGJvb2wgPSBOb25lLAogICAgdHJpZ2dlcl9tb25pdG9yaW5nX2pvYjogYm9vbCA9IEZhbHNlLAogICAgYmF0Y2hfaW1hZ2Vfam9iOiBzdHIgPSAibWxydW4vbWxydW4iLAogICAgZW5kcG9pbnRfaWQ6IHN0ciA9ICIiLAogICAgIyBUaGUgZm9sbG93aW5nIG1vZGVsIGVuZHBvaW50IHBhcmFtZXRlcnMgYXJlIHJlbGV2YW50IG9ubHkgaWY6CiAgICAjIHBlcmZvcm0gZHJpZnQgYW5hbHlzaXMgaXMgbm90IGRpc2FibGVkCiAgICAjIGEgbmV3IG1vZGVsIGVuZHBvaW50IHJlY29yZCBpcyBnb2luZyB0byBiZSBnZW5lcmF0ZWQKICAgIG1vZGVsX2VuZHBvaW50X25hbWU6IHN0ciA9ICJiYXRjaC1pbmZlciIsCiAgICBtb2RlbF9lbmRwb2ludF9kcmlmdF90aHJlc2hvbGQ6IGZsb2F0ID0gMC43LAogICAgbW9kZWxfZW5kcG9pbnRfcG9zc2libGVfZHJpZnRfdGhyZXNob2xkOiBmbG9hdCA9IDAuNSwKICAgIG1vZGVsX2VuZHBvaW50X3NhbXBsZV9zZXQ6IFVuaW9uWwogICAgICAgIG1scnVuLkRhdGFJdGVtLCBsaXN0LCBkaWN0LCBwZC5EYXRhRnJhbWUsIHBkLlNlcmllcywgbnAubmRhcnJheQogICAgXSA9IE5vbmUsCiAgICBsYXN0X2luX2JhdGNoX3NldDogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgKipwcmVkaWN0X2t3YXJnczogRGljdFtzdHIsIEFueV0sCik6CiAgICAiIiIKICAgIFBlcmZvcm0gYSBwcmVkaWN0aW9uIG9uIGEgZ2l2ZW4gZGF0YXNldCB3aXRoIHRoZSBnaXZlbiBtb2RlbC4gUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGFscmVhZHkgbG9nZ2VkIHRoZSBtb2RlbAogICAgdW5kZXIgdGhlIGN1cnJlbnQgcHJvamVjdC4KICAgIENhbiBwZXJmb3JtIGRyaWZ0IGFuYWx5c2lzIGJldHdlZW4gdGhlIHNhbXBsZSBzZXQgc3RhdGlzdGljcyBzdG9yZWQgaW4gdGhlIG1vZGVsIHRvIHRoZSBjdXJyZW50IGlucHV0IGRhdGEuIFRoZQogICAgZHJpZnQgcnVsZSBpcyB0aGUgdmFsdWUgcGVyLWZlYXR1cmUgbWVhbiBvZiB0aGUgVFZEIGFuZCBIZWxsaW5nZXIgc2NvcmVzIGFjY29yZGluZyB0byB0aGUgdGhyZXNob2xkcyBjb25maWd1cmVzCiAgICBoZXJlLiBXaGVuIHBlcmZvcm1pbmcgZHJpZnQgYW5hbHlzaXMsIHRoaXMgZnVuY3Rpb24gZWl0aGVyIHVzZXMgYW4gZXhpc3RpbmcgbW9kZWwgZW5kcG9pbnQgcmVjb3JkIG9yIGNyZWF0ZXMKICAgIGEgbmV3IG9uZS4KICAgIEF0IHRoZSBtb21lbnQsIHRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIGZvciBgbWxydW4+PTEuNS4wYCB2ZXJzaW9ucy4KCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTFJ1biBjb250ZXh0LgogICAgOnBhcmFtIGRhdGFzZXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGFzZXQgdG8gaW5mZXIgdGhyb3VnaCB0aGUgbW9kZWwuIFByb3ZpZGVkIGFzIGFuIGlucHV0IChEYXRhSXRlbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcmVwcmVzZW50cyBEYXRhc2V0IGFydGlmYWN0IC8gRmVhdHVyZSB2ZWN0b3IgVVJJLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdXNpbmcgTUxSdW4gU0RLLCBgZGF0YXNldGAgY2FuIGFsc28gYmUgcHJvdmlkZWQgYXMgYSBsaXN0LCBkaWN0aW9uYXJ5IG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1weSBhcnJheS4KICAgIDpwYXJhbSBtb2RlbF9wYXRoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsIHN0b3JlIHVyaSAoc2hvdWxkIHN0YXJ0IHdpdGggc3RvcmU6Ly8pLiBQcm92aWRlZCBhcyBhbiBpbnB1dCAoRGF0YUl0ZW0pLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdXNpbmcgTUxSdW4gU0RLLCBgbW9kZWxfcGF0aGAgY2FuIGFsc28gYmUgcHJvdmlkZWQgYXMgYSBwYXJhbWV0ZXIgKHN0cmluZykuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbyBnZW5lcmF0ZSBhIHZhbGlkIG1vZGVsIHN0b3JlIFVSSSwgcGxlYXNlIGxvZyB0aGUgbW9kZWwgYmVmb3JlIHJ1bm5pbmcgdGhpcyBmdW5jdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGBlbmRwb2ludF9pZGAgb2YgZXhpc3RpbmcgbW9kZWwgZW5kcG9pbnQgaXMgcHJvdmlkZWQsIG1ha2Ugc3VyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBpdCBoYXMgYSBzaW1pbGFyIG1vZGVsIHN0b3JlIHBhdGgsIG90aGVyd2lzZSB0aGUgZHJpZnQgYW5hbHlzaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvbid0IGJlIHRyaWdnZXJlZC4KICAgIDpwYXJhbSBkcm9wX2NvbHVtbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgc3RyaW5nIC8gaW50ZWdlciBvciBhIGxpc3Qgb2Ygc3RyaW5ncyAvIGludGVnZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBjb2x1bW4gbmFtZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gaW5kaWNlcyB0byBkcm9wLiBXaGVuIHRoZSBkYXRhc2V0IGlzIGEgbGlzdCBvciBhIG51bXB5IGFycmF5IHRoaXMgcGFyYW1ldGVyIG11c3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlcHJlc2VudGVkIGJ5IGludGVnZXJzLgogICAgOnBhcmFtIGxhYmVsX2NvbHVtbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHRhcmdldCBsYWJlbChzKSBvZiB0aGUgY29sdW1uKHMpIGluIHRoZSBkYXRhc2V0IGZvciBSZWdyZXNzaW9uIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc2lmaWNhdGlvbiB0YXNrcy4gVGhlIGxhYmVsIGNvbHVtbiBjYW4gYmUgYWNjZXNzZWQgZnJvbSB0aGUgbW9kZWwgb2JqZWN0LCBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZlYXR1cmUgdmVjdG9yIHByb3ZpZGVkIGlmIGF2YWlsYWJsZS4KICAgIDpwYXJhbSBmZWF0dXJlX2NvbHVtbnM6ICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Qgb2YgZmVhdHVyZSBjb2x1bW5zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGJ1aWxkIHRoZSBkYXRhZnJhbWUgd2hlbiBkYXRhc2V0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHR5cGUgbGlzdCBvciBudW1weSBhcnJheS4KICAgIDpwYXJhbSBsb2dfcmVzdWx0X3NldDogICAgICAgICAgICAgICAgICAgICAgICAgIFdoZXRoZXIgdG8gbG9nIHRoZSByZXN1bHQgc2V0IC0gYSBEYXRhRnJhbWUgb2YgdGhlIGdpdmVuIGlucHV0cyBjb25jYXRlbmF0ZWQgd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByZWRpY3Rpb25zLiBEZWZhdWx0ZWQgdG8gVHJ1ZS4KICAgIDpwYXJhbSByZXN1bHRfc2V0X25hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkYiBrZXkgdG8gc2V0IG5hbWUgb2YgdGhlIHByZWRpY3Rpb24gcmVzdWx0IGFuZCB0aGUgZmlsZW5hbWUuIERlZmF1bHRlZCB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZWRpY3Rpb24nLgogICAgOnBhcmFtIGJhdGNoX2lkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBnaXZlbiBiYXRjaCAoaW5mZXJlbmNlIGRhdGFzZXQpLiBJZiBgTm9uZWAsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lsbCBiZSBsb2dnZWQgYXMgYSByZXN1bHQgb2YgdGhlIHJ1bi4KICAgIDpwYXJhbSBhcnRpZmFjdHNfdGFnOiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZyB0byB1c2UgZm9yIGFsbCB0aGUgYXJ0aWZhY3RzIHJlc3VsdGVkIGZyb20gdGhlIGZ1bmN0aW9uIChyZXN1bHQgc2V0IGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgbW9uaXRvcmluZyBhcnRpZmFjdHMpCiAgICA6cGFyYW0gcGVyZm9ybV9kcmlmdF9hbmFseXNpczogICAgICAgICAgICAgICAgICBXaGV0aGVyIHRvIHBlcmZvcm0gZHJpZnQgYW5hbHlzaXMgYmV0d2VlbiB0aGUgc2FtcGxlIHNldCBvZiB0aGUgbW9kZWwgb2JqZWN0IHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldCBnaXZlbi4gQnkgZGVmYXVsdCwgTm9uZSwgd2hpY2ggbWVhbnMgaXQgd2lsbCBwZXJmb3JtIGRyaWZ0IGFuYWx5c2lzIGlmIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgYWxyZWFkeSBoYXMgZmVhdHVyZSBzdGF0cyB0aGF0IGFyZSBjb25zaWRlcmVkIGFzIGEgcmVmZXJlbmNlIHNhbXBsZSBzZXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtaW5nIGRyaWZ0IGFuYWx5c2lzIG9uIGEgbmV3IGVuZHBvaW50IGlkIHdpbGwgZ2VuZXJhdGUgYSBuZXcgbW9kZWwgZW5kcG9pbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC4gUGxlYXNlIG5vdGUgdGhhdCBpbiBvcmRlciB0byB0cmlnZ2VyIHRoZSBkcmlmdCBhbmFseXNpcyBqb2IsIHlvdSBuZWVkIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgYHRyaWdnZXJfbW9uaXRvcmluZ19qb2I9VHJ1ZWAuIE90aGVyd2lzZSwgdGhlIGRyaWZ0IGFuYWx5c2lzIHdpbGwgYmUgdHJpZ2dlcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGFzIHBhcnQgdGhlIHNjaGVkdWxlZCBtb25pdG9yaW5nIGpvYiAoaWYgZXhpc3QgaW4gdGhlIGN1cnJlbnQgcHJvamVjdCkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRyaWdnZXJlZCBtYW51YWxseSBieSB0aGUgdXNlci4KICAgIDpwYXJhbSB0cmlnZ2VyX21vbml0b3Jpbmdfam9iOiAgICAgICAgICAgICAgICAgIFdoZXRoZXIgdG8gdHJpZ2dlciB0aGUgYmF0Y2ggZHJpZnQgYW5hbHlzaXMgYWZ0ZXIgdGhlIGluZmVyIGpvYi4KICAgIDpwYXJhbSBiYXRjaF9pbWFnZV9qb2I6ICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBpbWFnZSB0aGF0IHdpbGwgYmUgdXNlZCB0byByZWdpc3RlciB0aGUgbW9uaXRvcmluZyBiYXRjaCBqb2IgaWYgbm90IGV4aXN0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgdGhlIGltYWdlIGlzIG1scnVuL21scnVuLgogICAgOnBhcmFtIGVuZHBvaW50X2lkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWwgZW5kcG9pbnQgdW5pcXVlIElELiBJZiBgcGVyZm9ybV9kcmlmdF9hbmFseXNpc2Agd2FzIHNldCwgdGhlIGVuZHBvaW50X2lkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgZWl0aGVyIHRvIHBlcmZvcm0gdGhlIGFuYWx5c2lzIG9uIGV4aXN0aW5nIG1vZGVsIGVuZHBvaW50IG9yIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBhIG5ldyBtb2RlbCBlbmRwb2ludCByZWNvcmQuCiAgICA6cGFyYW0gbW9kZWxfZW5kcG9pbnRfbmFtZTogICAgICAgICAgICAgICAgICAgICBJZiBhIG5ldyBtb2RlbCBlbmRwb2ludCBpcyBnZW5lcmF0ZWQsIHRoZSBtb2RlbCBuYW1lIHdpbGwgYmUgcHJlc2VudGVkIHVuZGVyIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50LgogICAgOnBhcmFtIG1vZGVsX2VuZHBvaW50X2RyaWZ0X3RocmVzaG9sZDogICAgICAgICAgVGhlIHRocmVzaG9sZCBvZiB3aGljaCB0byBtYXJrIGRyaWZ0cy4gRGVmYXVsdGVkIHRvIDAuNy4KICAgIDpwYXJhbSBtb2RlbF9lbmRwb2ludF9wb3NzaWJsZV9kcmlmdF90aHJlc2hvbGQ6IFRoZSB0aHJlc2hvbGQgb2Ygd2hpY2ggdG8gbWFyayBwb3NzaWJsZSBkcmlmdHMuIERlZmF1bHRlZCB0byAwLjUuCiAgICA6cGFyYW0gbW9kZWxfZW5kcG9pbnRfc2FtcGxlX3NldDogICAgICAgICAgICAgICBBIHNhbXBsZSBkYXRhc2V0IHRvIGdpdmUgdG8gY29tcGFyZSB0aGUgaW5wdXRzIGluIHRoZSBkcmlmdCBhbmFseXNpcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBwcm92aWRlZCBhcyBhbiBpbnB1dCAoRGF0YUl0ZW0pIG9yIGFzIGEgcGFyYW1ldGVyIChlLmcuIHN0cmluZywgbGlzdCwgRGF0YUZyYW1lKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGNob3NlbiBzYW1wbGUgc2V0IHdpbGwgYWx3YXlzIGJlIHRoZSBvbmUgd2hvIGlzIHNldCBpbiB0aGUgbW9kZWwgYXJ0aWZhY3QgaXRzZWxmLgogICAgOnBhcmFtIGxhc3RfaW5fYmF0Y2hfc2V0OiAgICAgICAgICAgICAgICAgICAgICAgUmVsZXZhbnQgb25seSB3aGVuIGBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzYCBpcyBgVHJ1ZWAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGV0aGVyIHRvIG1hcmsgdGhlIG1vbml0b3Jpbmcgd2luZG93IGFzIGNvbXBsZXRlZCBhbmQgYWxsb3cgbW9uaXRvcmluZyB3aXRob3V0IGV4dHJhIGluZmVyZW5jZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBgTm9uZWAsIHdoaWNoIG1lYW5zIHVzZSB0aGUgYG1scnVuYCdzIGRlZmF1bHQgaWYgdGhlIHBhcmFtZXRlciBleGlzdHMuCiAgICByYWlzZXMgTUxSdW5JbnZhbGlkQXJndW1lbnRFcnJvcjogaWYgYm90aCBgbW9kZWxfcGF0aGAgYW5kIGBlbmRwb2ludF9pZGAgYXJlIG5vdCBwcm92aWRlZCwgb3IgaWYgYGxhc3RfaW5fYmF0Y2hfc2V0YCBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkIGZvciBhbiB1bnN1cHBvcnRlZCBgbWxydW5gIHZlcnNpb24uCiAgICAiIiIKCiAgICAjIExvYWRpbmcgdGhlIG1vZGVsOgogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmIkxvYWRpbmcgbW9kZWwuLi4iKQogICAgaWYgaXNpbnN0YW5jZShtb2RlbF9wYXRoLCBtbHJ1bi5EYXRhSXRlbSk6CiAgICAgICAgbW9kZWxfcGF0aCA9IG1vZGVsX3BhdGguYXJ0aWZhY3RfdXJsCiAgICBpZiBub3QgbWxydW4uZGF0YXN0b3JlLmlzX3N0b3JlX3VyaShtb2RlbF9wYXRoKToKICAgICAgICByYWlzZSBtbHJ1bi5lcnJvcnMuTUxSdW5JbnZhbGlkQXJndW1lbnRFcnJvcigKICAgICAgICAgICAgZiJUaGUgcHJvdmlkZWQgbW9kZWwgcGF0aCAoe21vZGVsX3BhdGh9KSBpcyBpbnZhbGlkIC0gc2hvdWxkIHN0YXJ0IHdpdGggYHN0b3JlOi8vYC4gIgogICAgICAgICAgICBmIlBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBsb2dnZWQgdGhlIG1vZGVsIHVzaW5nIGBwcm9qZWN0LmxvZ19tb2RlbCgpYCAiCiAgICAgICAgICAgIGYid2hpY2ggZ2VuZXJhdGVzIGEgdW5pcXVlIHN0b3JlIHVyaSBmb3IgdGhlIGxvZ2dlZCBtb2RlbC4iCiAgICAgICAgKQogICAgbW9kZWxfaGFuZGxlciA9IEF1dG9NTFJ1bi5sb2FkX21vZGVsKG1vZGVsX3BhdGg9bW9kZWxfcGF0aCwgY29udGV4dD1jb250ZXh0KQoKICAgIGlmIGxhYmVsX2NvbHVtbnMgaXMgTm9uZToKICAgICAgICBsYWJlbF9jb2x1bW5zID0gWwogICAgICAgICAgICBvdXRwdXQubmFtZSBmb3Igb3V0cHV0IGluIG1vZGVsX2hhbmRsZXIuX21vZGVsX2FydGlmYWN0LnNwZWMub3V0cHV0cwogICAgICAgIF0KCiAgICBpZiBmZWF0dXJlX2NvbHVtbnMgaXMgTm9uZToKICAgICAgICBmZWF0dXJlX2NvbHVtbnMgPSBbCiAgICAgICAgICAgIGlucHV0Lm5hbWUgZm9yIGlucHV0IGluIG1vZGVsX2hhbmRsZXIuX21vZGVsX2FydGlmYWN0LnNwZWMuaW5wdXRzCiAgICAgICAgXQoKICAgICMgR2V0IGRhdGFzZXQgYnkgb2JqZWN0LCBVUkwgb3IgYnkgRmVhdHVyZVZlY3RvcjoKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJMb2FkaW5nIGRhdGEuLi4iKQogICAgeCwgbGFiZWxfY29sdW1ucyA9IG1scnVuLm1vZGVsX21vbml0b3JpbmcuYXBpLnJlYWRfZGF0YXNldF9hc19kYXRhZnJhbWUoCiAgICAgICAgZGF0YXNldD1kYXRhc2V0LAogICAgICAgIGZlYXR1cmVfY29sdW1ucz1mZWF0dXJlX2NvbHVtbnMsCiAgICAgICAgbGFiZWxfY29sdW1ucz1sYWJlbF9jb2x1bW5zLAogICAgICAgIGRyb3BfY29sdW1ucz1kcm9wX2NvbHVtbnMsCiAgICApCgogICAgIyBQcmVkaWN0OgogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmIkNhbGN1bGF0aW5nIHByZWRpY3Rpb24uLi4iKQogICAgeV9wcmVkID0gbW9kZWxfaGFuZGxlci5tb2RlbC5wcmVkaWN0KHgsICoqcHJlZGljdF9rd2FyZ3MpCgogICAgIyBQcmVwYXJlIHRoZSByZXN1bHQgc2V0OgogICAgcmVzdWx0X3NldCA9IF9wcmVwYXJlX3Jlc3VsdF9zZXQoeD14LCBsYWJlbF9jb2x1bW5zPWxhYmVsX2NvbHVtbnMsIHlfcHJlZD15X3ByZWQpCgogICAgIyBDaGVjayBmb3IgbG9nZ2luZyB0aGUgcmVzdWx0IHNldDoKICAgIGlmIGxvZ19yZXN1bHRfc2V0OgogICAgICAgIG1scnVuLm1vZGVsX21vbml0b3JpbmcuYXBpLmxvZ19yZXN1bHQoCiAgICAgICAgICAgIGNvbnRleHQ9Y29udGV4dCwKICAgICAgICAgICAgcmVzdWx0X3NldF9uYW1lPXJlc3VsdF9zZXRfbmFtZSwKICAgICAgICAgICAgcmVzdWx0X3NldD1yZXN1bHRfc2V0LAogICAgICAgICAgICBhcnRpZmFjdHNfdGFnPWFydGlmYWN0c190YWcsCiAgICAgICAgICAgIGJhdGNoX2lkPWJhdGNoX2lkLAogICAgICAgICkKCiAgICAjIENoZWNrIGZvciBwZXJmb3JtaW5nIGRyaWZ0IGFuYWx5c2lzCiAgICBpZiAoCiAgICAgICAgcGVyZm9ybV9kcmlmdF9hbmFseXNpcyBpcyBOb25lCiAgICAgICAgYW5kIG1vZGVsX2hhbmRsZXIuX21vZGVsX2FydGlmYWN0LnNwZWMuZmVhdHVyZV9zdGF0cyBpcyBub3QgTm9uZQogICAgKToKICAgICAgICBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzID0gVHJ1ZQogICAgaWYgcGVyZm9ybV9kcmlmdF9hbmFseXNpczoKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKCJQZXJmb3JtaW5nIGRyaWZ0IGFuYWx5c2lzLi4uIikKICAgICAgICAjIEdldCB0aGUgc2FtcGxlIHNldCBzdGF0aXN0aWNzIChlaXRoZXIgZnJvbSB0aGUgc2FtcGxlIHNldCBvciBmcm9tIHRoZSBzdGF0aXN0aWNzIGxvZ2dlZCB3aXRoIHRoZSBtb2RlbCkKICAgICAgICBzYW1wbGVfc2V0X3N0YXRpc3RpY3MgPSBtbHJ1bi5tb2RlbF9tb25pdG9yaW5nLmFwaS5nZXRfc2FtcGxlX3NldF9zdGF0aXN0aWNzKAogICAgICAgICAgICBzYW1wbGVfc2V0PW1vZGVsX2VuZHBvaW50X3NhbXBsZV9zZXQsCiAgICAgICAgICAgIG1vZGVsX2FydGlmYWN0X2ZlYXR1cmVfc3RhdHM9bW9kZWxfaGFuZGxlci5fbW9kZWxfYXJ0aWZhY3Quc3BlYy5mZWF0dXJlX3N0YXRzLAogICAgICAgICkKICAgICAgICBtbHJ1bi5tb2RlbF9tb25pdG9yaW5nLmFwaS5yZWNvcmRfcmVzdWx0cygKICAgICAgICAgICAgcHJvamVjdD1jb250ZXh0LnByb2plY3QsCiAgICAgICAgICAgIGNvbnRleHQ9Y29udGV4dCwKICAgICAgICAgICAgZW5kcG9pbnRfaWQ9ZW5kcG9pbnRfaWQsCiAgICAgICAgICAgIG1vZGVsX3BhdGg9bW9kZWxfcGF0aCwKICAgICAgICAgICAgbW9kZWxfZW5kcG9pbnRfbmFtZT1tb2RlbF9lbmRwb2ludF9uYW1lLAogICAgICAgICAgICBpbmZlcl9yZXN1bHRzX2RmPXJlc3VsdF9zZXQuY29weSgpLAogICAgICAgICAgICBzYW1wbGVfc2V0X3N0YXRpc3RpY3M9c2FtcGxlX3NldF9zdGF0aXN0aWNzLAogICAgICAgICAgICBkcmlmdF90aHJlc2hvbGQ9bW9kZWxfZW5kcG9pbnRfZHJpZnRfdGhyZXNob2xkLAogICAgICAgICAgICBwb3NzaWJsZV9kcmlmdF90aHJlc2hvbGQ9bW9kZWxfZW5kcG9pbnRfcG9zc2libGVfZHJpZnRfdGhyZXNob2xkLAogICAgICAgICAgICBhcnRpZmFjdHNfdGFnPWFydGlmYWN0c190YWcsCiAgICAgICAgICAgIHRyaWdnZXJfbW9uaXRvcmluZ19qb2I9dHJpZ2dlcl9tb25pdG9yaW5nX2pvYiwKICAgICAgICAgICAgZGVmYXVsdF9iYXRjaF9pbWFnZT1iYXRjaF9pbWFnZV9qb2IsCiAgICAgICAgICAgICoqX3BhcnNlX3JlY29yZF9yZXN1bHRzX2t3YXJnKGxhc3RfaW5fYmF0Y2hfc2V0PWxhc3RfaW5fYmF0Y2hfc2V0KSwKICAgICAgICApCg== + functionSourceCode: IyBDb3B5cmlnaHQgMjAyMyBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgpmcm9tIGluc3BlY3QgaW1wb3J0IHNpZ25hdHVyZQpmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBEaWN0LCBMaXN0LCBPcHRpb25hbCwgVW5pb24KCmltcG9ydCBtbHJ1bgoKdHJ5OgogICAgaW1wb3J0IG1scnVuLm1vZGVsX21vbml0b3JpbmcuYXBpCmV4Y2VwdCBNb2R1bGVOb3RGb3VuZEVycm9yOgogICAgcmFpc2UgbWxydW4uZXJyb3JzLk1MUnVuTm90Rm91bmRFcnJvcigKICAgICAgICBmIlBsZWFzZSB1cGRhdGUgeW91ciBgbWxydW5gIHZlcnNpb24gdG8gPj0xLjUuMCBvciB1c2UgYW4gIgogICAgICAgIGYib2xkZXIgdmVyc2lvbiBvZiB0aGUgYmF0Y2ggaW5mZXJlbmNlIGZ1bmN0aW9uLiIKICAgICkKCgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZApmcm9tIG1scnVuLmZyYW1ld29ya3MuYXV0b19tbHJ1biBpbXBvcnQgQXV0b01MUnVuCgoKZGVmIF9wcmVwYXJlX3Jlc3VsdF9zZXQoCiAgICB4OiBwZC5EYXRhRnJhbWUsIGxhYmVsX2NvbHVtbnM6IExpc3Rbc3RyXSwgeV9wcmVkOiBucC5uZGFycmF5CikgLT4gcGQuRGF0YUZyYW1lOgogICAgIiIiCiAgICBTZXQgZGVmYXVsdCBsYWJlbCBjb2x1bW4gbmFtZXMgYW5kIHZhbGlkYXRlIGdpdmVuIG5hbWVzIHRvIHByZXBhcmUgdGhlIHJlc3VsdCBzZXQgLSBhIGNvbmNhdGVuYXRpb24gb2YgdGhlIGlucHV0cwogICAgKHgpIGFuZCB0aGUgbW9kZWwgcHJlZGljdGlvbnMgKHlfcHJlZCkuCgogICAgOnBhcmFtIHg6ICAgICAgICAgICAgIFRoZSBpbnB1dHMuCiAgICA6cGFyYW0gbGFiZWxfY29sdW1uczogQSBsaXN0IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSB0YXJnZXQgY29sdW1uIG5hbWVzIHRvIGFkZCB0byB0aGUgcHJlZGljdGlvbnMuIERlZmF1bHQgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCBpbiBjYXNlIHRoZSBsaXN0IGlzIGVtcHR5IChwcmVkaWN0ZWRfbGFiZWxfe2l9KS4KICAgIDpwYXJhbSB5X3ByZWQ6ICAgICAgICBUaGUgbW9kZWwgcHJlZGljdGlvbnMgb24gdGhlIGlucHV0cy4KCiAgICA6cmV0dXJuczogVGhlIHJlc3VsdCBzZXQuCgogICAgcmFpc2VzIE1MUnVuSW52YWxpZEFyZ3VtZW50RXJyb3I6IElmIHRoZSBsYWJlbHMgY29sdW1ucyBhbW91bnQgZG8gbm90IG1hdGNoIHRoZSBvdXRwdXRzIG9yIGlmIG9uZSBvZiB0aGUgbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uIGFscmVhZHkgZXhpc3RzIGluIHRoZSBkYXRhc2V0LgogICAgIiIiCiAgICAjIFByZXBhcmUgZGVmYXVsdCB0YXJnZXQgY29sdW1ucyBuYW1lcyBpZiBub3QgcHJvdmlkZWQ6CiAgICBwcmVkaWN0aW9uX2NvbHVtbnNfYW1vdW50ID0gMSBpZiBsZW4oeV9wcmVkLnNoYXBlKSA9PSAxIGVsc2UgeV9wcmVkLnNoYXBlWzFdCiAgICBpZiBsZW4obGFiZWxfY29sdW1ucykgPT0gMDoKICAgICAgICAjIEFkZCBkZWZhdWx0IGxhYmVsIGNvbHVtbiBuYW1lczoKICAgICAgICBpZiBwcmVkaWN0aW9uX2NvbHVtbnNfYW1vdW50ID09IDE6CiAgICAgICAgICAgIGxhYmVsX2NvbHVtbnMgPSBbInByZWRpY3RlZF9sYWJlbCJdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbGFiZWxfY29sdW1ucyA9IFsKICAgICAgICAgICAgICAgIGYicHJlZGljdGVkX2xhYmVsX3tpfSIgZm9yIGkgaW4gcmFuZ2UocHJlZGljdGlvbl9jb2x1bW5zX2Ftb3VudCkKICAgICAgICAgICAgXQoKICAgICMgVmFsaWRhdGUgdGhlIGxhYmVsIGNvbHVtbnM6CiAgICBpZiBwcmVkaWN0aW9uX2NvbHVtbnNfYW1vdW50ICE9IGxlbihsYWJlbF9jb2x1bW5zKToKICAgICAgICAjIE5vIGVxdWFsaXR5IGJldHdlZW4gcHJvdmlkZWQgbGFiZWwgY29sdW1uIG5hbWVzIGFuZCBvdXRwdXRzIGFtb3VudDoKICAgICAgICByYWlzZSBtbHJ1bi5lcnJvcnMuTUxSdW5JbnZhbGlkQXJndW1lbnRFcnJvcigKICAgICAgICAgICAgZiJUaGUgbnVtYmVyIG9mIHByZWRpY3RlZCBsYWJlbHM6IHtwcmVkaWN0aW9uX2NvbHVtbnNfYW1vdW50fSAiCiAgICAgICAgICAgIGYiaXMgbm90IGVxdWFsIHRvIHRoZSBnaXZlbiBsYWJlbCBjb2x1bW5zOiB7bGVuKGxhYmVsX2NvbHVtbnMpfSIKICAgICAgICApCiAgICBjb21tb25fbGFiZWxzID0gc2V0KGxhYmVsX2NvbHVtbnMpICYgc2V0KHguY29sdW1ucy50b2xpc3QoKSkKICAgIGlmIGNvbW1vbl9sYWJlbHM6CiAgICAgICAgIyBMYWJlbCBjb2x1bW4gZXhpc3QgaW4gdGhlIG9yaWdpbmFsIGlucHV0czoKICAgICAgICByYWlzZSBtbHJ1bi5lcnJvcnMuTUxSdW5JbnZhbGlkQXJndW1lbnRFcnJvcigKICAgICAgICAgICAgZiJUaGUgbGFiZWxzOiB7Y29tbW9uX2xhYmVsc30gYXJlIGFscmVhZHkgZXhpc3RlZCBpbiB0aGUgZ2l2ZW4gZGF0YXNldC4iCiAgICAgICAgKQoKICAgIHJldHVybiBwZC5jb25jYXQoCiAgICAgICAgW3gsIHBkLkRhdGFGcmFtZSh5X3ByZWQsIGNvbHVtbnM9bGFiZWxfY29sdW1ucywgaW5kZXg9eC5pbmRleCldLCBheGlzPTEKICAgICkKCgpkZWYgX3BhcnNlX3JlY29yZF9yZXN1bHRzX2t3YXJnKAogICAgbGFzdF9pbl9iYXRjaF9zZXQ6IE9wdGlvbmFsW2Jvb2xdLAopIC0+IGRpY3Rbc3RyLCBib29sXToKICAgICIiIgogICAgQ2hlY2sgaWYgYGxhc3RfaW5fYmF0Y2hfc2V0YCBpcyBwcm92aWRlZCBhbmQgZXhwZWN0ZWQgYXMgYSBwYXJhbWV0ZXIuCiAgICBSZXR1cm4gaXQgYXMgYSBkaWN0aW9uYXJ5LgogICAgIiIiCiAgICBrd2FyZyA9ICJsYXN0X2luX2JhdGNoX3NldCIKICAgIGlmIGxhc3RfaW5fYmF0Y2hfc2V0IGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIHt9CiAgICBpZiAoCiAgICAgICAgc2lnbmF0dXJlKG1scnVuLm1vZGVsX21vbml0b3JpbmcuYXBpLnJlY29yZF9yZXN1bHRzKS5wYXJhbWV0ZXJzLmdldChrd2FyZykKICAgICAgICBpcyBOb25lCiAgICApOgogICAgICAgIHJhaXNlIG1scnVuLmVycm9ycy5NTFJ1bkludmFsaWRBcmd1bWVudEVycm9yKAogICAgICAgICAgICBmIlVuZXhwZWN0ZWQgcGFyYW1ldGVyIGB7a3dhcmd9YCBmb3IgZnVuY3Rpb246ICIKICAgICAgICAgICAgImBtbHJ1bi5tb2RlbF9tb25pdG9yaW5nLmFwaS5yZWNvcmRfcmVzdWx0c2AuICIKICAgICAgICAgICAgIlBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgYXJlIHVzaW5nIGBtbHJ1bj49MS42LjBgIHZlcnNpb24uIgogICAgICAgICkKICAgIHJldHVybiB7a3dhcmc6IGxhc3RfaW5fYmF0Y2hfc2V0fQoKCmRlZiBpbmZlcigKICAgIGNvbnRleHQ6IG1scnVuLk1MQ2xpZW50Q3R4LAogICAgZGF0YXNldDogVW5pb25bbWxydW4uRGF0YUl0ZW0sIGxpc3QsIGRpY3QsIHBkLkRhdGFGcmFtZSwgcGQuU2VyaWVzLCBucC5uZGFycmF5XSwKICAgIG1vZGVsX3BhdGg6IFVuaW9uW3N0ciwgbWxydW4uRGF0YUl0ZW1dLAogICAgZHJvcF9jb2x1bW5zOiBVbmlvbltzdHIsIExpc3Rbc3RyXSwgaW50LCBMaXN0W2ludF1dID0gTm9uZSwKICAgIGxhYmVsX2NvbHVtbnM6IFVuaW9uW3N0ciwgTGlzdFtzdHJdXSA9IE5vbmUsCiAgICBmZWF0dXJlX2NvbHVtbnM6IFVuaW9uW3N0ciwgTGlzdFtzdHJdXSA9IE5vbmUsCiAgICBsb2dfcmVzdWx0X3NldDogYm9vbCA9IFRydWUsCiAgICByZXN1bHRfc2V0X25hbWU6IHN0ciA9ICJwcmVkaWN0aW9uIiwKICAgIGJhdGNoX2lkOiBzdHIgPSBOb25lLAogICAgYXJ0aWZhY3RzX3RhZzogc3RyID0gIiIsCiAgICAjIERyaWZ0IGFuYWx5c2lzIHBhcmFtZXRlcnMKICAgIHBlcmZvcm1fZHJpZnRfYW5hbHlzaXM6IGJvb2wgPSBOb25lLAogICAgdHJpZ2dlcl9tb25pdG9yaW5nX2pvYjogYm9vbCA9IEZhbHNlLAogICAgYmF0Y2hfaW1hZ2Vfam9iOiBzdHIgPSAibWxydW4vbWxydW4iLAogICAgZW5kcG9pbnRfaWQ6IHN0ciA9ICIiLAogICAgIyBUaGUgZm9sbG93aW5nIG1vZGVsIGVuZHBvaW50IHBhcmFtZXRlcnMgYXJlIHJlbGV2YW50IG9ubHkgaWY6CiAgICAjIHBlcmZvcm0gZHJpZnQgYW5hbHlzaXMgaXMgbm90IGRpc2FibGVkCiAgICAjIGEgbmV3IG1vZGVsIGVuZHBvaW50IHJlY29yZCBpcyBnb2luZyB0byBiZSBnZW5lcmF0ZWQKICAgIG1vZGVsX2VuZHBvaW50X25hbWU6IHN0ciA9ICJiYXRjaC1pbmZlciIsCiAgICBtb2RlbF9lbmRwb2ludF9kcmlmdF90aHJlc2hvbGQ6IGZsb2F0ID0gMC43LAogICAgbW9kZWxfZW5kcG9pbnRfcG9zc2libGVfZHJpZnRfdGhyZXNob2xkOiBmbG9hdCA9IDAuNSwKICAgIG1vZGVsX2VuZHBvaW50X3NhbXBsZV9zZXQ6IFVuaW9uWwogICAgICAgIG1scnVuLkRhdGFJdGVtLCBsaXN0LCBkaWN0LCBwZC5EYXRhRnJhbWUsIHBkLlNlcmllcywgbnAubmRhcnJheQogICAgXSA9IE5vbmUsCiAgICBsYXN0X2luX2JhdGNoX3NldDogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgKipwcmVkaWN0X2t3YXJnczogRGljdFtzdHIsIEFueV0sCik6CiAgICAiIiIKICAgIFBlcmZvcm0gYSBwcmVkaWN0aW9uIG9uIGEgZ2l2ZW4gZGF0YXNldCB3aXRoIHRoZSBnaXZlbiBtb2RlbC4gUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGFscmVhZHkgbG9nZ2VkIHRoZSBtb2RlbAogICAgdW5kZXIgdGhlIGN1cnJlbnQgcHJvamVjdC4KICAgIENhbiBwZXJmb3JtIGRyaWZ0IGFuYWx5c2lzIGJldHdlZW4gdGhlIHNhbXBsZSBzZXQgc3RhdGlzdGljcyBzdG9yZWQgaW4gdGhlIG1vZGVsIHRvIHRoZSBjdXJyZW50IGlucHV0IGRhdGEuIFRoZQogICAgZHJpZnQgcnVsZSBpcyB0aGUgdmFsdWUgcGVyLWZlYXR1cmUgbWVhbiBvZiB0aGUgVFZEIGFuZCBIZWxsaW5nZXIgc2NvcmVzIGFjY29yZGluZyB0byB0aGUgdGhyZXNob2xkcyBjb25maWd1cmVzCiAgICBoZXJlLiBXaGVuIHBlcmZvcm1pbmcgZHJpZnQgYW5hbHlzaXMsIHRoaXMgZnVuY3Rpb24gZWl0aGVyIHVzZXMgYW4gZXhpc3RpbmcgbW9kZWwgZW5kcG9pbnQgcmVjb3JkIG9yIGNyZWF0ZXMKICAgIGEgbmV3IG9uZS4KICAgIEF0IHRoZSBtb21lbnQsIHRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIGZvciBgbWxydW4+PTEuNS4wYCB2ZXJzaW9ucy4KCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTFJ1biBjb250ZXh0LgogICAgOnBhcmFtIGRhdGFzZXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGFzZXQgdG8gaW5mZXIgdGhyb3VnaCB0aGUgbW9kZWwuIFByb3ZpZGVkIGFzIGFuIGlucHV0IChEYXRhSXRlbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcmVwcmVzZW50cyBEYXRhc2V0IGFydGlmYWN0IC8gRmVhdHVyZSB2ZWN0b3IgVVJJLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdXNpbmcgTUxSdW4gU0RLLCBgZGF0YXNldGAgY2FuIGFsc28gYmUgcHJvdmlkZWQgYXMgYSBsaXN0LCBkaWN0aW9uYXJ5IG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1weSBhcnJheS4KICAgIDpwYXJhbSBtb2RlbF9wYXRoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsIHN0b3JlIHVyaSAoc2hvdWxkIHN0YXJ0IHdpdGggc3RvcmU6Ly8pLiBQcm92aWRlZCBhcyBhbiBpbnB1dCAoRGF0YUl0ZW0pLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdXNpbmcgTUxSdW4gU0RLLCBgbW9kZWxfcGF0aGAgY2FuIGFsc28gYmUgcHJvdmlkZWQgYXMgYSBwYXJhbWV0ZXIgKHN0cmluZykuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbyBnZW5lcmF0ZSBhIHZhbGlkIG1vZGVsIHN0b3JlIFVSSSwgcGxlYXNlIGxvZyB0aGUgbW9kZWwgYmVmb3JlIHJ1bm5pbmcgdGhpcyBmdW5jdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGBlbmRwb2ludF9pZGAgb2YgZXhpc3RpbmcgbW9kZWwgZW5kcG9pbnQgaXMgcHJvdmlkZWQsIG1ha2Ugc3VyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBpdCBoYXMgYSBzaW1pbGFyIG1vZGVsIHN0b3JlIHBhdGgsIG90aGVyd2lzZSB0aGUgZHJpZnQgYW5hbHlzaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvbid0IGJlIHRyaWdnZXJlZC4KICAgIDpwYXJhbSBkcm9wX2NvbHVtbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgc3RyaW5nIC8gaW50ZWdlciBvciBhIGxpc3Qgb2Ygc3RyaW5ncyAvIGludGVnZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBjb2x1bW4gbmFtZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gaW5kaWNlcyB0byBkcm9wLiBXaGVuIHRoZSBkYXRhc2V0IGlzIGEgbGlzdCBvciBhIG51bXB5IGFycmF5IHRoaXMgcGFyYW1ldGVyIG11c3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlcHJlc2VudGVkIGJ5IGludGVnZXJzLgogICAgOnBhcmFtIGxhYmVsX2NvbHVtbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHRhcmdldCBsYWJlbChzKSBvZiB0aGUgY29sdW1uKHMpIGluIHRoZSBkYXRhc2V0IGZvciBSZWdyZXNzaW9uIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc2lmaWNhdGlvbiB0YXNrcy4gVGhlIGxhYmVsIGNvbHVtbiBjYW4gYmUgYWNjZXNzZWQgZnJvbSB0aGUgbW9kZWwgb2JqZWN0LCBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZlYXR1cmUgdmVjdG9yIHByb3ZpZGVkIGlmIGF2YWlsYWJsZS4KICAgIDpwYXJhbSBmZWF0dXJlX2NvbHVtbnM6ICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Qgb2YgZmVhdHVyZSBjb2x1bW5zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGJ1aWxkIHRoZSBkYXRhZnJhbWUgd2hlbiBkYXRhc2V0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHR5cGUgbGlzdCBvciBudW1weSBhcnJheS4KICAgIDpwYXJhbSBsb2dfcmVzdWx0X3NldDogICAgICAgICAgICAgICAgICAgICAgICAgIFdoZXRoZXIgdG8gbG9nIHRoZSByZXN1bHQgc2V0IC0gYSBEYXRhRnJhbWUgb2YgdGhlIGdpdmVuIGlucHV0cyBjb25jYXRlbmF0ZWQgd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByZWRpY3Rpb25zLiBEZWZhdWx0ZWQgdG8gVHJ1ZS4KICAgIDpwYXJhbSByZXN1bHRfc2V0X25hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkYiBrZXkgdG8gc2V0IG5hbWUgb2YgdGhlIHByZWRpY3Rpb24gcmVzdWx0IGFuZCB0aGUgZmlsZW5hbWUuIERlZmF1bHRlZCB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZWRpY3Rpb24nLgogICAgOnBhcmFtIGJhdGNoX2lkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIElEIG9mIHRoZSBnaXZlbiBiYXRjaCAoaW5mZXJlbmNlIGRhdGFzZXQpLiBJZiBgTm9uZWAsIGl0IHdpbGwgYmUgZ2VuZXJhdGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lsbCBiZSBsb2dnZWQgYXMgYSByZXN1bHQgb2YgdGhlIHJ1bi4KICAgIDpwYXJhbSBhcnRpZmFjdHNfdGFnOiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZyB0byB1c2UgZm9yIGFsbCB0aGUgYXJ0aWZhY3RzIHJlc3VsdGVkIGZyb20gdGhlIGZ1bmN0aW9uIChyZXN1bHQgc2V0IGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgbW9uaXRvcmluZyBhcnRpZmFjdHMpCiAgICA6cGFyYW0gcGVyZm9ybV9kcmlmdF9hbmFseXNpczogICAgICAgICAgICAgICAgICBXaGV0aGVyIHRvIHBlcmZvcm0gZHJpZnQgYW5hbHlzaXMgYmV0d2VlbiB0aGUgc2FtcGxlIHNldCBvZiB0aGUgbW9kZWwgb2JqZWN0IHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldCBnaXZlbi4gQnkgZGVmYXVsdCwgTm9uZSwgd2hpY2ggbWVhbnMgaXQgd2lsbCBwZXJmb3JtIGRyaWZ0IGFuYWx5c2lzIGlmIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgYWxyZWFkeSBoYXMgZmVhdHVyZSBzdGF0cyB0aGF0IGFyZSBjb25zaWRlcmVkIGFzIGEgcmVmZXJlbmNlIHNhbXBsZSBzZXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtaW5nIGRyaWZ0IGFuYWx5c2lzIG9uIGEgbmV3IGVuZHBvaW50IGlkIHdpbGwgZ2VuZXJhdGUgYSBuZXcgbW9kZWwgZW5kcG9pbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC4gUGxlYXNlIG5vdGUgdGhhdCBpbiBvcmRlciB0byB0cmlnZ2VyIHRoZSBkcmlmdCBhbmFseXNpcyBqb2IsIHlvdSBuZWVkIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgYHRyaWdnZXJfbW9uaXRvcmluZ19qb2I9VHJ1ZWAuIE90aGVyd2lzZSwgdGhlIGRyaWZ0IGFuYWx5c2lzIHdpbGwgYmUgdHJpZ2dlcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGFzIHBhcnQgdGhlIHNjaGVkdWxlZCBtb25pdG9yaW5nIGpvYiAoaWYgZXhpc3QgaW4gdGhlIGN1cnJlbnQgcHJvamVjdCkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRyaWdnZXJlZCBtYW51YWxseSBieSB0aGUgdXNlci4KICAgIDpwYXJhbSB0cmlnZ2VyX21vbml0b3Jpbmdfam9iOiAgICAgICAgICAgICAgICAgIFdoZXRoZXIgdG8gdHJpZ2dlciB0aGUgYmF0Y2ggZHJpZnQgYW5hbHlzaXMgYWZ0ZXIgdGhlIGluZmVyIGpvYi4KICAgIDpwYXJhbSBiYXRjaF9pbWFnZV9qb2I6ICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBpbWFnZSB0aGF0IHdpbGwgYmUgdXNlZCB0byByZWdpc3RlciB0aGUgbW9uaXRvcmluZyBiYXRjaCBqb2IgaWYgbm90IGV4aXN0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgdGhlIGltYWdlIGlzIG1scnVuL21scnVuLgogICAgOnBhcmFtIGVuZHBvaW50X2lkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWwgZW5kcG9pbnQgdW5pcXVlIElELiBJZiBgcGVyZm9ybV9kcmlmdF9hbmFseXNpc2Agd2FzIHNldCwgdGhlIGVuZHBvaW50X2lkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgZWl0aGVyIHRvIHBlcmZvcm0gdGhlIGFuYWx5c2lzIG9uIGV4aXN0aW5nIG1vZGVsIGVuZHBvaW50IG9yIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBhIG5ldyBtb2RlbCBlbmRwb2ludCByZWNvcmQuCiAgICA6cGFyYW0gbW9kZWxfZW5kcG9pbnRfbmFtZTogICAgICAgICAgICAgICAgICAgICBJZiBhIG5ldyBtb2RlbCBlbmRwb2ludCBpcyBnZW5lcmF0ZWQsIHRoZSBtb2RlbCBuYW1lIHdpbGwgYmUgcHJlc2VudGVkIHVuZGVyIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50LgogICAgOnBhcmFtIG1vZGVsX2VuZHBvaW50X2RyaWZ0X3RocmVzaG9sZDogICAgICAgICAgVGhlIHRocmVzaG9sZCBvZiB3aGljaCB0byBtYXJrIGRyaWZ0cy4gRGVmYXVsdGVkIHRvIDAuNy4KICAgIDpwYXJhbSBtb2RlbF9lbmRwb2ludF9wb3NzaWJsZV9kcmlmdF90aHJlc2hvbGQ6IFRoZSB0aHJlc2hvbGQgb2Ygd2hpY2ggdG8gbWFyayBwb3NzaWJsZSBkcmlmdHMuIERlZmF1bHRlZCB0byAwLjUuCiAgICA6cGFyYW0gbW9kZWxfZW5kcG9pbnRfc2FtcGxlX3NldDogICAgICAgICAgICAgICBBIHNhbXBsZSBkYXRhc2V0IHRvIGdpdmUgdG8gY29tcGFyZSB0aGUgaW5wdXRzIGluIHRoZSBkcmlmdCBhbmFseXNpcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBwcm92aWRlZCBhcyBhbiBpbnB1dCAoRGF0YUl0ZW0pIG9yIGFzIGEgcGFyYW1ldGVyIChlLmcuIHN0cmluZywgbGlzdCwgRGF0YUZyYW1lKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGNob3NlbiBzYW1wbGUgc2V0IHdpbGwgYWx3YXlzIGJlIHRoZSBvbmUgd2hvIGlzIHNldCBpbiB0aGUgbW9kZWwgYXJ0aWZhY3QgaXRzZWxmLgogICAgOnBhcmFtIGxhc3RfaW5fYmF0Y2hfc2V0OiAgICAgICAgICAgICAgICAgICAgICAgUmVsZXZhbnQgb25seSB3aGVuIGBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzYCBpcyBgVHJ1ZWAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZsYWcgY2FuIChhbmQgc2hvdWxkIG9ubHkpIGJlIHVzZWQgd2hlbiB0aGUgbW9kZWwgZW5kcG9pbnQgZG9lcyBub3QgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwtbW9uaXRvcmluZyBzZXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gYFRydWVgICh0aGUgZGVmYXVsdCksIHRoaXMgZmxhZyBtYXJrcyB0aGUgY3VycmVudCBtb25pdG9yaW5nIHdpbmRvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uIHRoaXMgbW9uaXRvcmluZyBlbmRwb2ludCkgYXMgY29tcGxldGVkIC0gdGhlIGRhdGEgaW5mZXJyZWQgc28gZmFyIGlzIGFzc3VtZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHRoZSBjb21wbGV0ZSBkYXRhIGZvciB0aGlzIG1vbml0b3Jpbmcgd2luZG93LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IG1heSB3YW50IHRvIHNldCB0aGlzIGZsYWcgdG8gYEZhbHNlYCBpZiB5b3Ugd2FudCB0byByZWNvcmQgbXVsdGlwbGUgcmVzdWx0cyBpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UgdGltZSBwcm94aW1pdHkgKCJiYXRjaCBzZXQiKS4gSW4gdGhpcyBjYXNlLCBzZXQgdGhpcyBmbGFnIHRvIGBGYWxzZWAgb24gYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgdGhlIGxhc3QgYmF0Y2ggaW4gdGhlIHNldC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIGBOb25lYCwgd2hpY2ggbWVhbnMgdXNlIHRoZSBgbWxydW5gJ3MgZGVmYXVsdCBpZiB0aGUgcGFyYW1ldGVyIGV4aXN0cy4KICAgIHJhaXNlcyBNTFJ1bkludmFsaWRBcmd1bWVudEVycm9yOiBpZiBib3RoIGBtb2RlbF9wYXRoYCBhbmQgYGVuZHBvaW50X2lkYCBhcmUgbm90IHByb3ZpZGVkLCBvciBpZiBgbGFzdF9pbl9iYXRjaF9zZXRgIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgZm9yIGFuIHVuc3VwcG9ydGVkIGBtbHJ1bmAgdmVyc2lvbi4KICAgICIiIgoKICAgICMgTG9hZGluZyB0aGUgbW9kZWw6CiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiTG9hZGluZyBtb2RlbC4uLiIpCiAgICBpZiBpc2luc3RhbmNlKG1vZGVsX3BhdGgsIG1scnVuLkRhdGFJdGVtKToKICAgICAgICBtb2RlbF9wYXRoID0gbW9kZWxfcGF0aC5hcnRpZmFjdF91cmwKICAgIGlmIG5vdCBtbHJ1bi5kYXRhc3RvcmUuaXNfc3RvcmVfdXJpKG1vZGVsX3BhdGgpOgogICAgICAgIHJhaXNlIG1scnVuLmVycm9ycy5NTFJ1bkludmFsaWRBcmd1bWVudEVycm9yKAogICAgICAgICAgICBmIlRoZSBwcm92aWRlZCBtb2RlbCBwYXRoICh7bW9kZWxfcGF0aH0pIGlzIGludmFsaWQgLSBzaG91bGQgc3RhcnQgd2l0aCBgc3RvcmU6Ly9gLiAiCiAgICAgICAgICAgIGYiUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGxvZ2dlZCB0aGUgbW9kZWwgdXNpbmcgYHByb2plY3QubG9nX21vZGVsKClgICIKICAgICAgICAgICAgZiJ3aGljaCBnZW5lcmF0ZXMgYSB1bmlxdWUgc3RvcmUgdXJpIGZvciB0aGUgbG9nZ2VkIG1vZGVsLiIKICAgICAgICApCiAgICBtb2RlbF9oYW5kbGVyID0gQXV0b01MUnVuLmxvYWRfbW9kZWwobW9kZWxfcGF0aD1tb2RlbF9wYXRoLCBjb250ZXh0PWNvbnRleHQpCgogICAgaWYgbGFiZWxfY29sdW1ucyBpcyBOb25lOgogICAgICAgIGxhYmVsX2NvbHVtbnMgPSBbCiAgICAgICAgICAgIG91dHB1dC5uYW1lIGZvciBvdXRwdXQgaW4gbW9kZWxfaGFuZGxlci5fbW9kZWxfYXJ0aWZhY3Quc3BlYy5vdXRwdXRzCiAgICAgICAgXQoKICAgIGlmIGZlYXR1cmVfY29sdW1ucyBpcyBOb25lOgogICAgICAgIGZlYXR1cmVfY29sdW1ucyA9IFsKICAgICAgICAgICAgaW5wdXQubmFtZSBmb3IgaW5wdXQgaW4gbW9kZWxfaGFuZGxlci5fbW9kZWxfYXJ0aWZhY3Quc3BlYy5pbnB1dHMKICAgICAgICBdCgogICAgIyBHZXQgZGF0YXNldCBieSBvYmplY3QsIFVSTCBvciBieSBGZWF0dXJlVmVjdG9yOgogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmIkxvYWRpbmcgZGF0YS4uLiIpCiAgICB4LCBsYWJlbF9jb2x1bW5zID0gbWxydW4ubW9kZWxfbW9uaXRvcmluZy5hcGkucmVhZF9kYXRhc2V0X2FzX2RhdGFmcmFtZSgKICAgICAgICBkYXRhc2V0PWRhdGFzZXQsCiAgICAgICAgZmVhdHVyZV9jb2x1bW5zPWZlYXR1cmVfY29sdW1ucywKICAgICAgICBsYWJlbF9jb2x1bW5zPWxhYmVsX2NvbHVtbnMsCiAgICAgICAgZHJvcF9jb2x1bW5zPWRyb3BfY29sdW1ucywKICAgICkKCiAgICAjIFByZWRpY3Q6CiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiQ2FsY3VsYXRpbmcgcHJlZGljdGlvbi4uLiIpCiAgICB5X3ByZWQgPSBtb2RlbF9oYW5kbGVyLm1vZGVsLnByZWRpY3QoeCwgKipwcmVkaWN0X2t3YXJncykKCiAgICAjIFByZXBhcmUgdGhlIHJlc3VsdCBzZXQ6CiAgICByZXN1bHRfc2V0ID0gX3ByZXBhcmVfcmVzdWx0X3NldCh4PXgsIGxhYmVsX2NvbHVtbnM9bGFiZWxfY29sdW1ucywgeV9wcmVkPXlfcHJlZCkKCiAgICAjIENoZWNrIGZvciBsb2dnaW5nIHRoZSByZXN1bHQgc2V0OgogICAgaWYgbG9nX3Jlc3VsdF9zZXQ6CiAgICAgICAgbWxydW4ubW9kZWxfbW9uaXRvcmluZy5hcGkubG9nX3Jlc3VsdCgKICAgICAgICAgICAgY29udGV4dD1jb250ZXh0LAogICAgICAgICAgICByZXN1bHRfc2V0X25hbWU9cmVzdWx0X3NldF9uYW1lLAogICAgICAgICAgICByZXN1bHRfc2V0PXJlc3VsdF9zZXQsCiAgICAgICAgICAgIGFydGlmYWN0c190YWc9YXJ0aWZhY3RzX3RhZywKICAgICAgICAgICAgYmF0Y2hfaWQ9YmF0Y2hfaWQsCiAgICAgICAgKQoKICAgICMgQ2hlY2sgZm9yIHBlcmZvcm1pbmcgZHJpZnQgYW5hbHlzaXMKICAgIGlmICgKICAgICAgICBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzIGlzIE5vbmUKICAgICAgICBhbmQgbW9kZWxfaGFuZGxlci5fbW9kZWxfYXJ0aWZhY3Quc3BlYy5mZWF0dXJlX3N0YXRzIGlzIG5vdCBOb25lCiAgICApOgogICAgICAgIHBlcmZvcm1fZHJpZnRfYW5hbHlzaXMgPSBUcnVlCiAgICBpZiBwZXJmb3JtX2RyaWZ0X2FuYWx5c2lzOgogICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oIlBlcmZvcm1pbmcgZHJpZnQgYW5hbHlzaXMuLi4iKQogICAgICAgICMgR2V0IHRoZSBzYW1wbGUgc2V0IHN0YXRpc3RpY3MgKGVpdGhlciBmcm9tIHRoZSBzYW1wbGUgc2V0IG9yIGZyb20gdGhlIHN0YXRpc3RpY3MgbG9nZ2VkIHdpdGggdGhlIG1vZGVsKQogICAgICAgIHNhbXBsZV9zZXRfc3RhdGlzdGljcyA9IG1scnVuLm1vZGVsX21vbml0b3JpbmcuYXBpLmdldF9zYW1wbGVfc2V0X3N0YXRpc3RpY3MoCiAgICAgICAgICAgIHNhbXBsZV9zZXQ9bW9kZWxfZW5kcG9pbnRfc2FtcGxlX3NldCwKICAgICAgICAgICAgbW9kZWxfYXJ0aWZhY3RfZmVhdHVyZV9zdGF0cz1tb2RlbF9oYW5kbGVyLl9tb2RlbF9hcnRpZmFjdC5zcGVjLmZlYXR1cmVfc3RhdHMsCiAgICAgICAgKQogICAgICAgIG1scnVuLm1vZGVsX21vbml0b3JpbmcuYXBpLnJlY29yZF9yZXN1bHRzKAogICAgICAgICAgICBwcm9qZWN0PWNvbnRleHQucHJvamVjdCwKICAgICAgICAgICAgY29udGV4dD1jb250ZXh0LAogICAgICAgICAgICBlbmRwb2ludF9pZD1lbmRwb2ludF9pZCwKICAgICAgICAgICAgbW9kZWxfcGF0aD1tb2RlbF9wYXRoLAogICAgICAgICAgICBtb2RlbF9lbmRwb2ludF9uYW1lPW1vZGVsX2VuZHBvaW50X25hbWUsCiAgICAgICAgICAgIGluZmVyX3Jlc3VsdHNfZGY9cmVzdWx0X3NldC5jb3B5KCksCiAgICAgICAgICAgIHNhbXBsZV9zZXRfc3RhdGlzdGljcz1zYW1wbGVfc2V0X3N0YXRpc3RpY3MsCiAgICAgICAgICAgIGRyaWZ0X3RocmVzaG9sZD1tb2RlbF9lbmRwb2ludF9kcmlmdF90aHJlc2hvbGQsCiAgICAgICAgICAgIHBvc3NpYmxlX2RyaWZ0X3RocmVzaG9sZD1tb2RlbF9lbmRwb2ludF9wb3NzaWJsZV9kcmlmdF90aHJlc2hvbGQsCiAgICAgICAgICAgIGFydGlmYWN0c190YWc9YXJ0aWZhY3RzX3RhZywKICAgICAgICAgICAgdHJpZ2dlcl9tb25pdG9yaW5nX2pvYj10cmlnZ2VyX21vbml0b3Jpbmdfam9iLAogICAgICAgICAgICBkZWZhdWx0X2JhdGNoX2ltYWdlPWJhdGNoX2ltYWdlX2pvYiwKICAgICAgICAgICAgKipfcGFyc2VfcmVjb3JkX3Jlc3VsdHNfa3dhcmcobGFzdF9pbl9iYXRjaF9zZXQ9bGFzdF9pbl9iYXRjaF9zZXQpLAogICAgICAgICkK commands: [] code_origin: '' origin_filename: '' @@ -145,10 +145,15 @@ spec: default: null - name: last_in_batch_set type: Optional[bool] - doc: Relevant only when `perform_drift_analysis` is `True`. Whether to mark - the monitoring window as completed and allow monitoring without extra inferences. - Defaults to `None`, which means use the `mlrun`'s default if the parameter - exists. + doc: Relevant only when `perform_drift_analysis` is `True`. This flag can + (and should only) be used when the model endpoint does not have model-monitoring + set. If set to `True` (the default), this flag marks the current monitoring + window (on this monitoring endpoint) as completed - the data inferred so + far is assumed to be the complete data for this monitoring window. You may + want to set this flag to `False` if you want to record multiple results + in close time proximity ("batch set"). In this case, set this flag to `False` + on all but the last batch in the set. Defaults to `None`, which means use + the `mlrun`'s default if the parameter exists. default: null outputs: - default: ''