IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMKIyBEb2NNYWtlciBpcyBhIHZlcnkgc2ltcGxlIHByb2dyYW0gdXNlZCB0byBnZW5lcmF0ZSBIVE1MIGRvY3VtZW50YXRpb24KIyBmcm9tIHRoZSBzb3VyY2UgZmlsZXMgb2YgdGhlIEZyZWVUeXBlIHBhY2thZ2VzLgojCiMgSSBzaG91bGQgcmVhbGx5IGJlIHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gZG8gdGhpcywgYnV0IGhleSwKIyBpJ20gdG9vIGxhenkgcmlnaHQgbm93LCBhbmQgdGhlIGRhbW4gdGhpbmcgc2VlbXMgdG8gd29yayA6LSkKIyAgIC0gRGF2aWQKIwoKaW1wb3J0IGZpbGVpbnB1dCwgc3lzLCBzdHJpbmcKCmh0bWxfaGVhZGVyID0gIiIiCjxodG1sPgo8aGVhZGVyPgo8dGl0bGU+RnJlZVR5cGUgMiBBUEkgUmVmZXJlbmNlPC90aXRsZT4KPGJhc2Vmb250IGZhY2U9Ikdlb3JnaWEsIEFyaWFsLCBIZWx2ZXRpY2EsIEdlbmV2YSI+CjxzdHlsZSBjb250ZW50PSJ0ZXh0L2NzcyI+CiAgUCB7IHRleHQtYWxpZ249anVzdGlmeSB9CiAgSDEgeyB0ZXh0LWFsaWduPWNlbnRlciB9CiAgSDIgeyB0ZXh0LWFsaWduPWNlbnRlciB9CiAgTEkgeyB0ZXh0LWFsaWduPWp1c3RpZnkgfQo8L3N0eWxlPgo8L2hlYWRlcj4KPGJvZHkgdGV4dD0iIzAwMDAwMCIKICAgICAgYmdjb2xvcj0iI0ZGRkZGRiIKICAgICAgbGluaz0iIzAwMDBFRiIKICAgICAgdmxpbms9IiM1MTE4OEUiCiAgICAgIGFsaW5rPSIjRkYwMDAwIj4KPGNlbnRlcj48aDE+RnJlZVR5cGUgMiBBUEkgUmVmZXJlbmNlPC9oMT48L2NlbnRlcj4KIiIiCgpodG1sX2Zvb3RlciA9ICIiIgo8L2JvZHk+CjwvaHRtbD4KIiIiCgpjb2RlX2hlYWRlciA9ICIiIgo8Zm9udCBjb2xvcj1ibHVlPjxwcmU+CiIiIgoKY29kZV9mb290ZXIgPSAiIiIKPC9wcmU+PC9mb250PgoiIiIKCnBhcmFfaGVhZGVyID0gIjxwPiIKcGFyYV9mb290ZXIgPSAiPC9wPiIKCmJsb2NrX2hlYWRlciA9ICIiIjxjZW50ZXI+PGhyIHdpZHRoPSI1NTAiPjx0YWJsZSB3aWR0aD0iNTUwIj48dHI+PHRkPiIiIgpibG9ja19mb290ZXIgPSAiPC90YWJsZT48L2NlbnRlcj4iCgpzb3VyY2VfaGVhZGVyID0gIiIiPGNlbnRlcj48dGFibGUgd2lkdGg9IjU1MCI+PHRyIGJnY29sb3I9IiNENkU4RkYiIHdpZHRoPSIxMDAlIj48dGQ+PHByZT4KIiIiCnNvdXJjZV9mb290ZXIgPSAiIiI8L3ByZT48L3RhYmxlPjwvY2VudGVyPgo8YnI+PGJyPgoiIiIKCiMgVGhlIEZyZWVUeXBlIDIgcmVmZXJlbmNlIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBzb3VyY2UgZmlsZXMuIFRoZXNlIGNvbnRhaW4KIyB2YXJpb3VzIGNvbW1lbnQgYmxvY2tzIHRoYXQgZm9sbG93IG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6CiMKIyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqCiMgICAqCiMgICAqICBGT1JNQVQxCiMgICAqCiMgICAqCiMgICAqCiMgICAqCiMgICAqKioqKioqKioqKioqKioqKioqKioqKioqLwojCiMgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIyAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwojICAvKiAgRk9STUFUMiAgICAgICAgICAgICAgICovCiMgIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi8KIyAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwojICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovCiMgIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi8KIwojICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiMgIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi8KIyAgLyogIEZPUk1BVDMgICAgICAgICAgICAgICAqLwojICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovCiMgIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi8KIyAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwojICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovCiMgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KIwojIEVhY2ggYmxvY2sgY29udGFpbnMgYSBsaXN0IG9mIG1hcmtlcnMsIGVhY2ggb25lIGNhbiBiZSBmb2xsb3dlZCBieQojIHNvbWUgYXJiaXRyYXJ5IHRleHQgb3IgYSBsaXN0IG9mIGZpZWxkcy4gSGVyZSdzIGFuIGV4YW1wbGU6CiMKIyAgICA8U3RydWN0PgojICAgICAgIE15U3RydWN0CiMKIyAgICA8RGVzY3JpcHRpb24+CiMgICAgICAgdGhpcyBzdHJ1Y3R1cmUgaG9sZHMgc29tZSBkYXRhCiMKIyAgICA8RmllbGRzPgojICAgICAgIHggOjogaG9yaXpvbnRhbCBjb29yZGluYXRlCiMgICAgICAgeSA6OiB2ZXJ0aWNhbCBjb29yZGluYXRlCiMKIwojIFRoaXMgZXhhbXBsZSBkZWZpbmVzIHRocmVlIG1hcmtlcnM6ICdTdHJ1Y3QnLCAnRGVzY3JpcHRpb24nICYgJ0ZpZWxkcycKIyBUaGUgZmlyc3QgdHdvIG1hcmtlcnMgY29udGFpbiBhcmJpdHJhcnkgdGV4dCwgd2hpbGUgdGhlIGxhc3Qgb25lIGNvbnRhaW5zCiMgYSBsaXN0IG9mIGZpZWxkCiMKIyBlYWNoIGZpZWxkIGlzIHNpbXBsZSBvZiB0aGUgZm9ybWF0OiAgV09SRCA6OiBURVhULi4uLgojCiMgTm90ZSB0aGF0IHR5cGljYWxseSwgZWFjaCBjb21tZW50IGJsb2NrIGlzIGZvbGxvd2VkIGJ5IHNvbWUgc291cmNlCiMgY29kZSBkZWNsYXJhdGlvbiB0aGF0IG1heSBuZWVkIHRvIGJlIGtlcHQgaW4gdGhlIHJlZmVyZW5jZS4uCiMKIyBOb3RlIHRoYXQgbWFya2VycyBjYW4gYWx0ZXJuYXRpdmVseSBiZSB3cml0dGVuIGFzICJATUFSS0VSOiIKIyBpbnN0ZWFkIG9mICI8TUFLUkVSPiIuIEFsbCBtYXJrZXIgaWRlbnRpZmllcnMgYXJlIGNvbnZlcnRlZCB0bwojIGxvd2VyIGNhc2UgZHVyaW5nIHBhcnNpbmcsIGluIG9yZGVyIHRvIHNpbXBseSBzb3J0aW5nLi4KIwojIFdlIGFzc29jaWF0ZSB3aXRoIGVhY2ggYmxvY2sgdGhlIGZvbGxvd2luZyBzb3VyY2UgbGluZXMgdGhhdCBkbyBub3QKIyBiZWdpbiB3aXRoIGEgY29tbWVudC4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmc6CiMKIyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiMgICAgKgojICAgICogPG15dGFnPiAgYmxhYmxhCiMgICAgKgojICAgICovCiMKIyAgICBibGFfYmxhX2JsYQojICAgICBiaWxpcF9iaWxpcAojCiMgICAvKiAtIHRoaXMgY29tbWVudCBhY3RzIGFzIGEgc2VwYXJhdG9yIC0gKi8KIwojICAgICBibG9fYmxvX2JsbwojCiMKIyAgd2lsbCBvbmx5IGtlZXAgdGhlIGZpcnN0IHR3byBsaW5lcyBvZiBzb3VyY2VzIHdpdGgKIyAgdGhlICJibGFibGEiIGJsb2NrCiMKIyAgSG93ZXZlciwgdGhlIGNvbW1lbnQgd2lsbCBiZSBrZXB0LCB3aXRoIGZvbGxvd2luZyBzb3VyY2UgbGluZXMKIyAgaWYgaXQgY29udGFpbnMgYSBzdGFydGluZyAnIycgb3IgJ0AnIGFzIGluOgojCiMgICAgIC8qQC4uLi4uKi8KIyAgICAgLyojLi4uLi4qLwojICAgICAvKiBALi4uLi4qLwojICAgICAvKiAjLi4uLi4qLwojCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojCiMgVGhlIERvY0NvZGUgY2xhc3MgaXMgdXNlZCB0byBzdG9yZSBzb3VyY2UgY29kZSBsaW5lcwojCiMgICBzZWxmLmxpbmVzIGNvbnRhaW5zIGEgc2V0IG9mIHNvdXJjZSBjb2RlIGxpbmVzIHRoYXQgd2lsbAojICAgYmUgZHVtcGVkIGFzIEhUTUwgaW4gYSA8UFJFPiB0YWcuCiMKIyAgIHRoZSBvYmplY3QgaXMgZmlsbGVkIGxpbmUgYnkgbGluZSBieSB0aGUgcGFyc2VyLCBpdCBzdHJpcHMgdGhlCiMgICBsZWFkaW5nICJtYXJnaW4iIHNwYWNlIGZyb20gZWFjaCBpbnB1dCBsaW5lIGJlZm9yZSBzdG9yaW5nIGl0CiMgICBpbiBzZWxmLmxpbmVzCiMKY2xhc3MgRG9jQ29kZToKCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hcmdpbiA9IDAgKToKICAgICAgICBzZWxmLmxpbmVzICA9IFtdCiAgICAgICAgc2VsZi5tYXJnaW4gPSBtYXJnaW4KCiAgICBkZWYgYWRkKCBzZWxmLCBsaW5lICk6CiAgICAgICAgIyByZW1vdmUgbWFyZ2luIHdoaXRlc3BhY2UKICAgICAgICBpZiBzdHJpbmcuc3RyaXAoIGxpbmVbOiBzZWxmLm1hcmdpbl0gKSA9PSAiIjoKICAgICAgICAgICAgbGluZSA9IGxpbmVbc2VsZi5tYXJnaW4gOl0KICAgICAgICBzZWxmLmxpbmVzLmFwcGVuZCggbGluZSApCgoKICAgIGRlZiBkdW1wKCBzZWxmICk6CiAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5saW5lczoKICAgICAgICAgICAgcHJpbnQgIi0tIiArIGxpbmUKICAgICAgICBwcmludCAiIgoKICAgIGRlZiBnZXRfaWRlbnRpZmllciggc2VsZiApOgogICAgICAgICMgdGhpcyBmdW5jdGlvbiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkCiAgICAgICAgcmV0dXJuICJVTktOT1dOX0NPREVfSURFTlRJRklFUiEhIgoKICAgIGRlZiBkdW1wX2h0bWwoIHNlbGYgKToKCiAgICAgICAgIyBjbGVhbiB0aGUgbGFzdCBlbXB0eSBsaW5lcwogICAgICAgIGwgPSBsZW4oIHNlbGYubGluZXMgKSAtIDEKICAgICAgICB3aGlsZSBsID4gMCBhbmQgc3RyaW5nLnN0cmlwKCBzZWxmLmxpbmVzW2wgLSAxXSApID09ICIiOgogICAgICAgICAgICBsID0gbCAtIDEKCiAgICAgICAgcHJpbnQgY29kZV9oZWFkZXIKICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmxpbmVzWzAgOiBsXToKICAgICAgICAgICAgcHJpbnQgbGluZQogICAgICAgIHByaW50IGNvZGVfZm9vdGVyCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMKIyBUaGUgRG9jUGFyYWdyYXBoIGlzIHVzZWQgdG8gc3RvcmUgdGV4dCBwYXJhZ3JhcGhzCiMgc2VsZi53b3JkcyBpcyBzaW1wbHkgYSBsaXN0IG9mIHdvcmRzIGZvciB0aGUgcGFyYWdyYXBoCiMKIyB0aGUgcGFyYWdyYXBoIGlzIGZpbGxlZCBsaW5lIGJ5IGxpbmUgYnkgdGhlIHBhcnNlci4uCiMKY2xhc3MgRG9jUGFyYWdyYXBoOgoKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAgICAgIHNlbGYud29yZHMgPSBbXQoKICAgIGRlZiBhZGQoIHNlbGYsIGxpbmUgKToKICAgICAgICAjIGdldCByaWQgb2YgdW53YW50ZWQgc3BhY2VzIGluIHRoZSBwYXJhZ3JhcGgKICAgICAgICAjCiAgICAgICAgIyB0aGUgZm9sbG93aW5nIGxpbmUgaXMgdGhlIHNhbWUgYXMKICAgICAgICAjCiAgICAgICAgIyAgIHNlbGYud29yZHMuZXh0ZW5kKCBzdHJpbmcuc3BsaXQoIGxpbmUgKSApCiAgICAgICAgIwogICAgICAgICMgYnV0IG9sZGVyIFB5dGhvbiB2ZXJzaW9ucyBkb24ndCBoYXZlIHRoZSBgZXh0ZW5kJyBhdHRyaWJ1dGUKICAgICAgICAjCiAgICAgICAgbGFzdCA9IGxlbihzZWxmLndvcmRzKQogICAgICAgIHNlbGYud29yZHNbbGFzdDpsYXN0XSA9IHN0cmluZy5zcGxpdCggbGluZSApCgogICAgIyB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGZpcnN0IHdvcmQgb2YgYSBnaXZlbgogICAgIyBwYXJhZ3JhcGguLgogICAgZGVmIGdldF9pZGVudGlmaWVyKCBzZWxmICk6CiAgICAgICAgaWYgc2VsZi53b3JkczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYud29yZHNbMF0KCiAgICAgICAgIyBzaG91bGQgbmV2ZXIgaGFwcGVuCiAgICAgICAgcmV0dXJuICJVTktOT1dOX1BBUkFfSURFTlRJRklFUiEhIgoKCiAgICBkZWYgZHVtcCggc2VsZiApOgoKICAgICAgICBtYXhfd2lkdGggPSA1MAogICAgICAgIGN1cnNvciAgICA9IDAKICAgICAgICBsaW5lICAgICAgPSAiIgoKICAgICAgICBmb3Igd29yZCBpbiBzZWxmLndvcmRzOgoKICAgICAgICAgICAgaWYgY3Vyc29yICsgbGVuKCB3b3JkICkgKyAxID4gbWF4X3dpZHRoOgogICAgICAgICAgICAgICAgcHJpbnQgbGluZQogICAgICAgICAgICAgICAgY3Vyc29yID0gMAogICAgICAgICAgICAgICAgbGluZSA9ICIiCgogICAgICAgICAgICBsaW5lICAgPSBsaW5lICsgd29yZCArICIgIgogICAgICAgICAgICBjdXJzb3IgPSBjdXJzb3IgKyBsZW4oIHdvcmQgKSArIDEKCiAgICAgICAgaWYgY3Vyc29yID4gMDoKICAgICAgICAgICAgcHJpbnQgbGluZQoKICAgICAgICAjcHJpbnQgIqciICNmb3IgZGVidWdnaW5nIG9ubHkKCgogICAgZGVmIGR1bXBfaHRtbCggc2VsZiApOgoKICAgICAgICBwcmludCBwYXJhX2hlYWRlcgogICAgICAgIHNlbGYuZHVtcCgpCiAgICAgICAgcHJpbnQgcGFyYV9mb290ZXIKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIwojIERvY0NvbnRlbnQgaXMgdXNlZCB0byBzdG9yZSB0aGUgY29udGVudCBvZiBhIGdpdmVuIG1hcmtlci4KIwojIHRoZSAic2VsZi5pdGVtcyIgbGlzdCBjb250YWlucyAoZmllbGQsZWxlbWVudHMpIHJlY29yZCwgd2hlcmUKIyAiZmllbGQiIGNvcnJlc3BvbmRzIHRvIGEgZ2l2ZW4gc3RydWN0dXJlIGZpZWxkcyBvciBmdW5jdGlvbgojIHBhcmFtZXRlciAoaW5kaWNhdGVkIGJ5IGEgIjo6IiksIG9yIE5VTEwgZm9yIGEgbm9ybWFsIHNlY3Rpb24KIyBvZiB0ZXh0L2NvZGUKIwojIGhlbmNlLCB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CiMKIyAgIDxNeU1hcmtlcj4KIyAgICAgIHRoaXMgaXMgYW4gZXhhbXBsZSBvZiB3aGF0IGNhbiBiZSBwdXQgaW4gYSBjb250ZW50IHNlY3Rpb24sCiMKIyAgICAgIGEgc2Vjb25kIGxpbmUgb2YgZXhhbXBsZSB0ZXh0CiMKIyAgICAgIHggOjogYSBzaW1wbGUgdGVzdCBmaWVsZCwgd2l0aCBzb21lIGNvbnRlbnQKIyAgICAgIHkgOjogZXZlbiBiZWZvcmUsIHRoaXMgZmllbGQgaGFzIHNvbWUgY29kZSBjb250ZW50CiMgICAgICAgICAgIHsKIyAgICAgICAgICAgICB5ID0geCsyOwojICAgICAgICAgICB9CiMKIyBzaG91bGQgYmUgc3RvcmVkIGFzCiMgICAgIFsgKCBOb25lLCBbIERvY1BhcmFncmFwaCwgRG9jUGFyYWdyYXBoXSApLAojICAgICAgICggIngiLCAgWyBEb2NQYXJhZ3JhcGggXSApLAojICAgICAgICggInkiLCAgWyBEb2NQYXJhZ3JhcGgsIERvY0NvZGUgXSApIF0KIwojIGluIHNlbGYuaXRlbXMKIwojIHRoZSBEb2NDb250ZW50IG9iamVjdCBpcyBlbnRpcmVseSBidWlsdCBhdCBjcmVhdGlvbiB0aW1lLCB5b3UgbXVzdAojIHBhc3MgYSBsaXN0IG9mIGlucHV0IHRleHQgbGluZXMgbGluIHRoZSAibGluZXNfbGlzdCIgcGFyYW1ldGVyLi4KIwojCmNsYXNzIERvY0NvbnRlbnQ6CgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBsaW5lc19saXN0ICk6CiAgICAgICAgc2VsZi5pdGVtcyAgPSBbXQogICAgICAgIGNvZGVfbW9kZSAgID0gMAogICAgICAgIGNvZGVfbWFyZ2luID0gMAogICAgICAgIHRleHQgICAgICAgID0gW10KICAgICAgICBwYXJhZ3JhcGggICA9IE5vbmUgICAjIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgRG9jUGFyYWdyYXBoCiAgICAgICAgY29kZSAgICAgICAgPSBOb25lICAgIyByZXByZXNlbnRzIHRoZSBjdXJyZW50IERvY0NvZGUKCiAgICAgICAgZWxlbWVudHMgICAgPSBbXSAgICAgIyB0aGUgbGlzdCBvZiBlbGVtZW50cyBmb3IgdGhlIGN1cnJlbnQgZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb250YWlucyBEb2NQYXJhZ3JhcGggb3IgRG9jQ29kZSBvYmplY3RzCgogICAgICAgIGZpZWxkICAgICAgID0gTm9uZSAgICMgdGhlIGN1cnJlbnQgZmllbGQKCiAgICAgICAgZm9yIGFsaW5lIGluIGxpbmVzX2xpc3Q6CgogICAgICAgICAgICBpZiBjb2RlX21vZGUgPT0gMDoKICAgICAgICAgICAgICAgIGxpbmUgICA9IHN0cmluZy5sc3RyaXAoIGFsaW5lICkKICAgICAgICAgICAgICAgIGwgICAgICA9IGxlbiggbGluZSApCiAgICAgICAgICAgICAgICBtYXJnaW4gPSBsZW4oIGFsaW5lICkgLSBsCgogICAgICAgICAgICAgICAgIyBpZiB0aGUgbGluZSBpcyBlbXB0eSwgdGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBjdXJyZW50CiAgICAgICAgICAgICAgICAjIHBhcmFncmFwaAogICAgICAgICAgICAgICAgaWYgbCA9PSAwIG9yIGxpbmUgPT0gJ3snOgoKICAgICAgICAgICAgICAgICAgICBpZiBwYXJhZ3JhcGg6CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFwcGVuZCggcGFyYWdyYXBoICkKICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoID0gTm9uZQoKICAgICAgICAgICAgICAgICAgICBpZiBsaW5lID09ICIiOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgICAgICBjb2RlX21vZGUgICA9IDEKICAgICAgICAgICAgICAgICAgICBjb2RlX21hcmdpbiA9IG1hcmdpbgogICAgICAgICAgICAgICAgICAgIGNvZGUgICAgICAgID0gTm9uZQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgd29yZHMgPSBzdHJpbmcuc3BsaXQoIGxpbmUgKQoKICAgICAgICAgICAgICAgICMgdGVzdCBmb3IgYSBmaWVsZCBkZWxpbWl0ZXIgb24gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLCBpLmUuCiAgICAgICAgICAgICAgICAjIHRoZSB0b2tlbiBgOjonCiAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICBpZiBsZW4oIHdvcmRzICkgPj0gMiBhbmQgd29yZHNbMV0gPT0gIjo6IjoKCiAgICAgICAgICAgICAgICAgICAgIyBzdGFydCBhIG5ldyBmaWVsZCAtIGNvbXBsZXRlIGN1cnJlbnQgcGFyYWdyYXBoIGlmIGFueQogICAgICAgICAgICAgICAgICAgIGlmIHBhcmFncmFwaDoKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuYXBwZW5kKCBwYXJhZ3JhcGggKQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGggPSBOb25lCgogICAgICAgICAgICAgICAgICAgICMgYXBwZW5kIHByZXZpb3VzICJmaWVsZCIgdG8gc2VsZi5pdGVtcwogICAgICAgICAgICAgICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKCAoIGZpZWxkLCBlbGVtZW50cyApICkKCiAgICAgICAgICAgICAgICAgICAgIyBzdGFydCBuZXcgZmllbGQgYW5kIGVsZW1lbnRzIGxpc3QKICAgICAgICAgICAgICAgICAgICBmaWVsZCAgICA9IHdvcmRzWzBdCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgPSBbXQogICAgICAgICAgICAgICAgICAgIHdvcmRzICAgID0gd29yZHNbMiA6XQoKICAgICAgICAgICAgICAgICMgYXBwZW5kIHJlbWFpbmluZyB3b3JkcyB0byBjdXJyZW50IHBhcmFncmFwaAogICAgICAgICAgICAgICAgaWYgbGVuKCB3b3JkcyApID4gMDoKICAgICAgICAgICAgICAgICAgICBsaW5lID0gc3RyaW5nLmpvaW4oIHdvcmRzICkKICAgICAgICAgICAgICAgICAgICBpZiBub3QgcGFyYWdyYXBoOgogICAgICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGggPSBEb2NQYXJhZ3JhcGgoKQogICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaC5hZGQoIGxpbmUgKQoKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgd2UncmUgaW4gY29kZSBtb2RlLi4KICAgICAgICAgICAgICAgIGxpbmUgPSBhbGluZQoKICAgICAgICAgICAgICAgICMgdGhlIGNvZGUgYmxvY2sgZW5kcyB3aXRoIGEgbGluZSB0aGF0IGhhcyBhIHNpbmdsZSAnfScgb24gaXQKICAgICAgICAgICAgICAgICMgdGhhdCBpcyBsb2NhdGVkIGF0IHRoZSBzYW1lIGNvbHVtbiB0aGF0IHRoZSBvcGVuaW5nCiAgICAgICAgICAgICAgICAjIGFjY29sYWRlLi4KICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gIiAiICogY29kZV9tYXJnaW4gKyAnfSc6CgogICAgICAgICAgICAgICAgICAgIGlmIGNvZGU6CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFwcGVuZCggY29kZSApCiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBOb25lCgogICAgICAgICAgICAgICAgICAgIGNvZGVfbW9kZSAgID0gMAogICAgICAgICAgICAgICAgICAgIGNvZGVfbWFyZ2luID0gMAoKICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlLCBhZGQgdGhlIGxpbmUgdG8gdGhlIGN1cnJlbnQgcGFyYWdyYXBoCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjb2RlOgogICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gRG9jQ29kZSgpCiAgICAgICAgICAgICAgICAgICAgY29kZS5hZGQoIGxpbmUgKQoKICAgICAgICBpZiBwYXJhZ3JhcGg6CiAgICAgICAgICAgIGVsZW1lbnRzLmFwcGVuZCggcGFyYWdyYXBoICkKCiAgICAgICAgaWYgY29kZToKICAgICAgICAgICAgZWxlbWVudHMuYXBwZW5kKCBjb2RlICkKCiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoICggZmllbGQsIGVsZW1lbnRzICkgKQoKCiAgICBkZWYgZ2V0X2lkZW50aWZpZXIoIHNlbGYgKToKICAgICAgICBpZiBzZWxmLml0ZW1zOgogICAgICAgICAgICBpdGVtID0gc2VsZi5pdGVtc1swXQogICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVtWzFdOgogICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0X2lkZW50aWZpZXIoKQoKICAgICAgICAjIHNob3VsZCBuZXZlciBoYXBwZW4KICAgICAgICByZXR1cm4gIlVOS05PV05fQ09OVEVOVF9JREVOVElGSUVSISEiCgoKICAgIGRlZiBkdW1wKCBzZWxmICk6CiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5pdGVtczoKICAgICAgICAgICAgZmllbGQgPSBpdGVtWzBdCiAgICAgICAgICAgIGlmIGZpZWxkOgogICAgICAgICAgICAgICAgcHJpbnQgIjxmaWVsZCAiICsgZmllbGQgKyAiPiIKCiAgICAgICAgICAgIGZvciBlbGVtZW50IGluIGl0ZW1bMV06CiAgICAgICAgICAgICAgICBlbGVtZW50LmR1bXAoKQoKICAgICAgICAgICAgaWYgZmllbGQ6CiAgICAgICAgICAgICAgICBwcmludCAiPC9maWVsZD4gICAgICAgICIKCiAgICBkZWYgZHVtcF9odG1sKCBzZWxmICk6CgogICAgICAgIG4gICAgICAgID0gbGVuKCBzZWxmLml0ZW1zICkKICAgICAgICBpbl90YWJsZSA9IDAKCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoIG4gKToKICAgICAgICAgICAgaXRlbSAgPSBzZWxmLml0ZW1zW2ldCiAgICAgICAgICAgIGZpZWxkID0gaXRlbVswXQoKICAgICAgICAgICAgaWYgbm90IGZpZWxkOgoKICAgICAgICAgICAgICAgIGlmIGluX3RhYmxlOgogICAgICAgICAgICAgICAgICAgIHByaW50ICI8L3RkPjwvdHI+PC90YWJsZT4iCiAgICAgICAgICAgICAgICAgICAgaW5fdGFibGUgPSAwCgogICAgICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlbVsxXToKICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmR1bXBfaHRtbCgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBub3QgaW5fdGFibGU6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgIjx0YWJsZSBjZWxscGFkZGluZz00Pjx0ciB2YWxpZ249dG9wPjx0ZD4iCiAgICAgICAgICAgICAgICAgICAgaW5fdGFibGUgPSAxCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHByaW50ICI8L3RkPjwvdHI+PHRyIHZhbGlnbj10b3A+PHRkPiIKCiAgICAgICAgICAgICAgICBwcmludCAiPGI+IiArIGZpZWxkICsgIjwvYj48L3RkPjx0ZD4iCgogICAgICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlbVsxXToKICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmR1bXBfaHRtbCgpCgogICAgICAgIGlmIGluX3RhYmxlOgogICAgICAgICAgICBwcmludCAiPC90ZD48L3RyPjwvdGFibGU+IgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMKIwojIFRoZSBEb2NCbG9jayBjbGFzcyBpcyB1c2VkIHRvIHN0b3JlIGEgZ2l2ZW4gY29tbWVudCBibG9jay4gSXQgY29udGFpbnMKIyBhIGxpc3Qgb2YgbWFya2VycywgYXMgd2VsbCBhcyBhIGxpc3Qgb2YgY29udGVudHMgZm9yIGVhY2ggbWFya2VyLgojCiMgICAic2VsZi5pdGVtcyIgaXMgYSBsaXN0IG9mICggbWFya2VyLCBjb250ZW50cyApIGVsZW1lbnRzLCB3aGVyZQojICAgJ21hcmtlcicgaXMgYSBsb3dlcmNhc2UgbWFya2VyIHN0cmluZywgYW5kICdjb250ZW50cycgaXMgYSBEb2NDb250ZW50CiMgICBvYmplY3QKIwojICAgInNlbGYuc291cmNlIiBpcyBzaW1wbHkgYSBsaXN0IG9mIHRleHQgbGluZXMgdGFrZW4gZnJvbSB0aGUKIyAgIHVuY29tbWVudGVkIHNvdXJjZSBpdHNlbGYuLgojCiMgICBmaW5hbGx5LCAic2VsZi5pZGVudGlmaWVyIiBpcyAgYSBzaW1wbGUgaWRlbnRpZmllciB1c2VkIHRvCiMgICB1bmlxdWVseSBpZGVudGlmeSB0aGUgYmxvY2sKIwpjbGFzcyBEb2NCbG9jazoKCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGJsb2NrX2xpbmVfbGlzdCA9IFtdLCBzb3VyY2VfbGluZV9saXN0ID0gW10gKToKICAgICAgICBzZWxmLml0ZW1zICA9IFtdICAgICAgICAgICAgICAgICAjIGN1cnJlbnQgKCBtYXJrZXIsIGNvbnRlbnRzICkgbGlzdAogICAgICAgIHNlbGYuaWRlbnRpZmllciA9IE5vbmUKICAgICAgICBtYXJrZXIgICAgICA9IE5vbmUgICAgICAgICAgICAgICAjIGN1cnJlbnQgbWFya2VyCiAgICAgICAgY29udGVudCAgICAgPSBbXSAgICAgICAgICAgICAgICAgIyBjdXJyZW50IGNvbnRlbnQgbGluZXMgbGlzdAogICAgICAgIGFscGhhbnVtICAgID0gc3RyaW5nLmxldHRlcnMgKyBzdHJpbmcuZGlnaXRzICsgIl8iCgogICAgICAgIGZvciBsaW5lIGluIGJsb2NrX2xpbmVfbGlzdDoKICAgICAgICAgICAgbGluZTIgID0gc3RyaW5nLmxzdHJpcCggbGluZSApCiAgICAgICAgICAgIGwgICAgICA9IGxlbiggbGluZTIgKQogICAgICAgICAgICBtYXJnaW4gPSBsZW4oIGxpbmUgKSAtIGwKCiAgICAgICAgICAgIGlmIGwgPiAzOgogICAgICAgICAgICAgICAgZW5kZXIgPSBOb25lCiAgICAgICAgICAgICAgICBpZiBsaW5lMlswXSA9PSAnPCc6CiAgICAgICAgICAgICAgICAgICAgZW5kZXIgPSAnPicKICAgICAgICAgICAgICAgIGVsaWYgbGluZTJbMF0gPT0gJ0AnOgogICAgICAgICAgICAgICAgICAgIGVuZGVyID0gJzonCgogICAgICAgICAgICAgICAgaWYgZW5kZXI6CiAgICAgICAgICAgICAgICAgICAgaSA9IDEKICAgICAgICAgICAgICAgICAgICB3aGlsZSBpIDwgbCBhbmQgbGluZTJbaV0gaW4gYWxwaGFudW06CiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQogICAgICAgICAgICAgICAgICAgIGlmIGkgPCBsIGFuZCBsaW5lMltpXSA9PSBlbmRlcjoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWFya2VyIGFuZCBjb250ZW50OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGQoIG1hcmtlciwgY29udGVudCApCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciAgPSBsaW5lMlsxIDogaV0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IFtdCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyICAgPSBzdHJpbmcubHN0cmlwKCBsaW5lMltpICsgMSA6XSApCiAgICAgICAgICAgICAgICAgICAgICAgIGwgICAgICAgPSBsZW4oIGxpbmUyICkKICAgICAgICAgICAgICAgICAgICAgICAgbGluZSAgICA9ICIgIiAqIG1hcmdpbiArIGxpbmUyCgogICAgICAgICAgICBjb250ZW50LmFwcGVuZCggbGluZSApCgogICAgICAgIGlmIG1hcmtlciBhbmQgY29udGVudDoKICAgICAgICAgICAgc2VsZi5hZGQoIG1hcmtlciwgY29udGVudCApCgogICAgICAgIHNlbGYuc291cmNlID0gW10KICAgICAgICBpZiBzZWxmLml0ZW1zOgogICAgICAgICAgICBzZWxmLnNvdXJjZSA9IHNvdXJjZV9saW5lX2xpc3QKCgogICAgIyB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIGEgbmV3IGVsZW1lbnQgdG8gc2VsZi5pdGVtcwogICAgIyAgJ21hcmtlcicgaXMgYSBtYXJrZXIgc3RyaW5nLCBvciBOb25lCiAgICAjICAnbGluZXMnIGlzIGEgbGlzdCBvZiB0ZXh0IGxpbmVzIHVzZWQgdG8gY29tcHV0ZSBhIGxpc3Qgb2YKICAgICMgICAgICAgICAgRG9jQ29udGVudCBvYmplY3RzCiAgICAjCiAgICBkZWYgYWRkKCBzZWxmLCBtYXJrZXIsIGxpbmVzICk6CgogICAgICAgICMgcmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBlbXB0eSBsaW5lcyBmcm9tIHRoZSBjb250ZW50IGxpc3QKICAgICAgICBsID0gbGVuKCBsaW5lcyApCiAgICAgICAgaWYgbCA+IDA6CiAgICAgICAgICAgIGkgPSAwCiAgICAgICAgICAgIHdoaWxlIGwgPiAwIGFuZCBzdHJpbmcuc3RyaXAoIGxpbmVzW2wgLSAxXSApID09ICIiOgogICAgICAgICAgICAgICAgbCA9IGwgLSAxCiAgICAgICAgICAgIHdoaWxlIGkgPCBsIGFuZCBzdHJpbmcuc3RyaXAoIGxpbmVzW2ldICkgPT0gIiI6CiAgICAgICAgICAgICAgICBpID0gaSArIDEKICAgICAgICAgICAgbGluZXMgPSBsaW5lc1tpIDogbF0KICAgICAgICAgICAgbCAgICAgPSBsZW4oIGxpbmVzICkKCiAgICAgICAgIyBhZGQgYSBuZXcgbWFya2VyIG9ubHkgaWYgaXRzIG1hcmtlciBhbmQgaXRzIGNvbnRlbnQgbGlzdCBhcmVuJ3QgZW1wdHkKICAgICAgICBpZiBsID4gMCBhbmQgbWFya2VyOgogICAgICAgICAgICBjb250ZW50ID0gRG9jQ29udGVudChsaW5lcykKICAgICAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoICggc3RyaW5nLmxvd2VyKG1hcmtlciksIGNvbnRlbnQgKSApCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlkZW50aWZpZXI6CiAgICAgICAgICAgICAgICBzZWxmLmlkZW50aWZpZXIgPSBjb250ZW50LmdldF9pZGVudGlmaWVyKCkKCgoKICAgIGRlZiBkdW1wKCBzZWxmICk6CiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoIGxlbiggc2VsZi5pdGVtcyApICk6CiAgICAgICAgICAgIHByaW50ICJbIiArIHNlbGYuaXRlbXNbaV1bMF0gKyAiXSIKICAgICAgICAgICAgY29udGVudCA9IHNlbGYuaXRlbXNbaV1bMV0KICAgICAgICAgICAgY29udGVudC5kdW1wKCkKCiAgICBkZWYgZHVtcF9odG1sKCBzZWxmICk6CgoJdHlwZXMgPSBbICd0eXBlJywgJ3N0cnVjdCcsICdmdW5jdHlwZScsICdmdW5jdGlvbicsICdjb25zdGFudCcsCiAgICAgICAgICAgICAgICAgICdlbnVtJywgJ21hY3JvJyBdCgogICAgICAgIGlmIG5vdCBzZWxmLml0ZW1zOgogICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIHN0YXJ0IG9mIGEgYmxvY2sKICAgICAgICBwcmludCBibG9ja19oZWFkZXIKCiAgICAgICAgcHJpbnQgIjxoMj4iICsgc2VsZi5pZGVudGlmaWVyICsgIjwvaDI+IgoKICAgICAgICAjIHByaW50IHNvdXJjZSBjb2RlCiAgICAgICAgaWYgbm90IHNlbGYuc291cmNlOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgbGluZXMgPSBzZWxmLnNvdXJjZQogICAgICAgIGwgICAgID0gbGVuKCBsaW5lcyApIC0gMQogICAgICAgIHdoaWxlIGwgPj0gMCBhbmQgc3RyaW5nLnN0cmlwKCBsaW5lc1tsXSApID09ICIiOgogICAgICAgICAgICBsID0gbCAtIDEKICAgICAgICBwcmludCBzb3VyY2VfaGVhZGVyCiAgICAgICAgZm9yIGxpbmUgaW4gbGluZXNbMCA6IGwgKyAxXToKICAgICAgICAgICAgcHJpbnQgIGxpbmUKICAgICAgICBwcmludCBzb3VyY2VfZm9vdGVyCgogICAgICAgICMgZHVtcCBlYWNoIChtYXJrZXIsY29udGVudCkgZWxlbWVudAogICAgICAgIGZvciBlbGVtZW50IGluIHNlbGYuaXRlbXM6CgogICAgICAgICAgICBtYXJrZXIgID0gZWxlbWVudFswXQogICAgICAgICAgICBjb250ZW50ID0gZWxlbWVudFsxXQoKICAgICAgICAgICAgaWYgbWFya2VyID09ICJkZXNjcmlwdGlvbiI6CiAgICAgICAgICAgICAgICBwcmludCAiPHVsPiIKICAgICAgICAgICAgICAgIGNvbnRlbnQuZHVtcF9odG1sKCkKICAgICAgICAgICAgICAgIHByaW50ICI8L3VsPiIKCiAgICAgICAgICAgIGVsaWYgbm90IChtYXJrZXIgaW4gdHlwZXMpOgogICAgICAgICAgICAgICAgcHJpbnQgIjxoND4iICsgbWFya2VyICsgIjwvaDQ+IgogICAgICAgICAgICAgICAgcHJpbnQgIjx1bD4iCiAgICAgICAgICAgICAgICBjb250ZW50LmR1bXBfaHRtbCgpCiAgICAgICAgICAgICAgICBwcmludCAiPC91bD4iCgogICAgICAgICAgICBwcmludCAiIgoKICAgICAgICBwcmludCBibG9ja19mb290ZXIKCgojIGZpbHRlciBhIGdpdmVuIGxpc3Qgb2YgRG9jQmxvY2tzLiBSZXR1cm5zIGEgbmV3IGxpc3QKIyBvZiBEb2NCbG9jayBvYmplY3RzIHRoYXQgb25seSBjb250YWlucyBlbGVtZW50IHdob3NlCiMgInR5cGUiIChpLmUuIGZpcnN0IG1hcmtlcikgaXMgaW4gdGhlICJ0eXBlcyIgcGFyYW1ldGVyCiMKZGVmIGZpbHRlcl9ibG9ja3MoIGJsb2NrX2xpc3QsIHR5cGVzICk6CgogICAgbmV3X2xpc3QgPSBbXQogICAgZm9yIGJsb2NrIGluIGJsb2NrX2xpc3Q6CiAgICAgICAgaWYgYmxvY2suaXRlbXM6CiAgICAgICAgICAgIGVsZW1lbnQgPSBibG9jay5pdGVtc1swXQogICAgICAgICAgICBtYXJrZXIgID0gZWxlbWVudFswXQogICAgICAgICAgICBpZiBtYXJrZXIgaW4gdHlwZXM6CiAgICAgICAgICAgICAgICBuZXdfbGlzdC5hcHBlbmQoIGJsb2NrICkKCiAgICByZXR1cm4gbmV3X2xpc3QKCgojIHBlcmZvcm0gYSBsZXhpY29ncmFwaGljYWwgY29tcGFyaXNvbiBvZiB0d28gRG9jQmxvY2sKIyBvYmplY3RzLiBSZXR1cm5zIC0xLCAwIG9yIDEKIwpkZWYgYmxvY2tfbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoIGIxLCBiMiApOgogICAgaWYgbm90IGIxLmlkZW50aWZpZXI6CiAgICAgICAgcmV0dXJuIC0xCiAgICBpZiBub3QgYjIuaWRlbnRpZmllcjoKICAgICAgICByZXR1cm4gMQoKICAgIGlkMSA9IHN0cmluZy5sb3dlcihiMS5pZGVudGlmaWVyKQogICAgaWQyID0gc3RyaW5nLmxvd2VyKGIyLmlkZW50aWZpZXIpCiAgICBpZiBpZDEgPCBpZDI6CiAgICAgICAgcmV0dXJuIC0xCiAgICBlbGlmIGlkMSA9PSBpZDI6CiAgICAgICAgcmV0dXJuIDAKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIDEKCgpkZWYgYmxvY2tfbWFrZV9saXN0KCBzb3VyY2VfYmxvY2tfbGlzdCApOgogICAgbGlzdCA9IFtdCgogICAgZm9yIGJsb2NrIGluIHNvdXJjZV9ibG9ja19saXN0OgogICAgICAgIGRvY2Jsb2NrID0gRG9jQmxvY2soIGJsb2NrWzBdLCBibG9ja1sxXSApCiAgICAgICAgbGlzdC5hcHBlbmQoIGRvY2Jsb2NrICkKCiAgICByZXR1cm4gbGlzdAoKCiMgZHVtcCBhIGxpc3QgYmxvY2sgYXMgYSBzaW5nbGUgSFRNTCBwYWdlCiMKZGVmIGR1bXBfaHRtbF8xKCBibG9ja19saXN0ICk6CgogICAgcHJpbnQgaHRtbF9oZWFkZXIKCiAgICBmb3IgYmxvY2sgaW4gYmxvY2tfbGlzdDoKICAgICAgICBibG9jay5kdW1wX2h0bWwoKQoKICAgIHByaW50IGh0bWxfZm9vdGVyCgoKCgpkZWYgbWFrZV9ibG9ja19saXN0KCk6CiAgICAiIiJwYXJzZSBhIGZpbGUgYW5kIGV4dHJhY3QgY29tbWVudHMgYmxvY2tzIGZyb20gaXQiIiIKCiAgICBsaXN0ICAgPSBbXQogICAgYmxvY2sgID0gW10KICAgIGZvcm1hdCA9IDAKCiAgICAjIHdlIHVzZSAiZm9ybWF0IiB0byBzdG9yZSB0aGUgc3RhdGUgb2Ygb3VyIHBhcnNlcjoKICAgICMKICAgICMgIDAgLSB3YWl0IGZvciBiZWdpbm5pbmcgb2YgY29tbWVudAogICAgIyAgMSAtIHBhcnNlIGNvbW1lbnQgZm9ybWF0IDEKICAgICMgIDIgLSBwYXJzZSBjb21tZW50IGZvcm1hdCAyCiAgICAjCiAgICAjICA0IC0gd2FpdCBmb3IgYmVnaW5uaW5nIG9mIHNvdXJjZSAob3IgY29tbWVudCA/PykKICAgICMgIDUgLSBwcm9jZXNzIHNvdXJjZQogICAgIwoKICAgIGNvbW1lbnQgICAgID0gW10KICAgIHNvdXJjZSAgICAgID0gW10KICAgIHN0YXRlICAgICAgID0gMAoKICAgIGZvciBsaW5lIGluIGZpbGVpbnB1dC5pbnB1dCgpOgoKICAgICAgICBsID0gbGVuKCBsaW5lICkKICAgICAgICBpZiBsID4gMCBhbmQgbGluZVtsIC0gMV0gPT0gJ1wwMTInOgogICAgICAgICAgICBsaW5lID0gbGluZVswIDogbCAtIDFdCgogICAgICAgICMgc3RyaXBwZWQgdmVyc2lvbiBvZiB0aGUgbGluZQogICAgICAgIGxpbmUyID0gc3RyaW5nLnN0cmlwKCBsaW5lICkKICAgICAgICBsICAgICA9IGxlbiggbGluZTIgKQoKICAgICAgICAjIGlmIHRoaXMgbGluZSBiZWdpbnMgd2l0aCBhIGNvbW1lbnQgYW5kIHdlIGFyZSBwcm9jZXNzaW5nIHNvbWUKICAgICAgICAjIHNvdXJjZSwgZXhpdCB0byBzdGF0ZSAwCiAgICAgICAgIwogICAgICAgICMgdW5sZXNzIHdlIGVuY291bnRlciBzb21ldGhpbmcgbGlrZToKICAgICAgICAjCiAgICAgICAgIyAgICAvKkAuLi4uLgogICAgICAgICMgICAgLyojLi4uLi4KICAgICAgICAjCiAgICAgICAgIyAgICAvKiBALi4uLi4KICAgICAgICAjICAgIC8qICMuLi4uLgogICAgICAgICMKICAgICAgICBpZiBmb3JtYXQgPj0gNCBhbmQgbCA+IDIgYW5kIGxpbmUyWzAgOiAyXSA9PSAnLyonOgogICAgICAgICAgICBpZiBsIDwgNCBvciAoIGxpbmUyWzNdICE9ICdAJyBhbmQgbGluZTJbMzo0XSAhPSAnIEAnIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyWzNdICE9ICcjJyBhbmQgbGluZTJbMzo0XSAhPSAnICMnKToKICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKCAoIGJsb2NrLCBzb3VyY2UgKSApCiAgICAgICAgICAgICAgICBmb3JtYXQgPSAwCgogICAgICAgIGlmIGZvcm1hdCA9PSAwOiAgIyMjIyB3YWl0IGZvciBiZWdpbm5pbmcgb2YgY29tbWVudCAjIyMjCgogICAgICAgICAgICBpZiBsID4gMyBhbmQgbGluZTJbMCA6IDNdID09ICcvKionOgogICAgICAgICAgICAgICAgaSA9IDMKICAgICAgICAgICAgICAgIHdoaWxlIGkgPCBsIGFuZCBsaW5lMltpXSA9PSAnKic6CiAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxCgogICAgICAgICAgICAgICAgaWYgaSA9PSBsOgogICAgICAgICAgICAgICAgICAgICMgdGhpcyBpcyAnLyoqJyBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mICcqJywgdGhlCiAgICAgICAgICAgICAgICAgICAgIyBiZWdpbm5pbmcgb2YgYSBGb3JtYXQgMSBibG9jawogICAgICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICAgICBibG9jayAgPSBbXQogICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IFtdCiAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gMQoKICAgICAgICAgICAgICAgIGVsaWYgaSA9PSBsIC0gMSBhbmQgbGluZTJbaV0gPT0gJy8nOgogICAgICAgICAgICAgICAgICAgICMgdGhpcyBpcyAnLyoqJyBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mICcqJywgZm9sbG93ZWQKICAgICAgICAgICAgICAgICAgICAjIGJ5IGEgJy8nLCBpLmUuIHRoZSBiZWdpbm5pbmcgb2YgYSBGb3JtYXQgMiBvciAzIGJsb2NrCiAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgICAgIGJsb2NrICA9IFtdCiAgICAgICAgICAgICAgICAgICAgc291cmNlID0gW10KICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAyCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIwogICAgICAgICMgRk9STUFUIDEKICAgICAgICAjCiAgICAgICAgZWxpZiBmb3JtYXQgPT0gMToKCiAgICAgICAgICAgICMgaWYgdGhlIGxpbmUgZG9lc24ndCBiZWdpbiB3aXRoIGEgIioiLCBzb21ldGhpbmcgd2VudAogICAgICAgICAgICAjIHdyb25nLCBhbmQgd2UgbXVzdCBleGl0LCBhbmQgZm9yZ2V0IHRoZSBjdXJyZW50IGJsb2NrLi4KICAgICAgICAgICAgaWYgbCA9PSAwIG9yIGxpbmUyWzBdICE9ICcqJzoKICAgICAgICAgICAgICAgIGJsb2NrICA9IFtdCiAgICAgICAgICAgICAgICBmb3JtYXQgPSAwCgogICAgICAgICAgICAjIG90aGVyd2lzZSwgd2UgdGVzdCBmb3IgYW4gZW5kIG9mIGJsb2NrLCB3aGljaCBpcyBhbgogICAgICAgICAgICAjIGFyYml0cmFyeSBudW1iZXIgb2YgJyonLCBmb2xsb3dlZCBieSAnLycKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGkgPSAxCiAgICAgICAgICAgICAgICB3aGlsZSBpIDwgbCBhbmQgbGluZTJbaV0gPT0gJyonOgogICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQoKICAgICAgICAgICAgICAgICMgdGVzdCBmb3IgdGhlIGVuZCBvZiB0aGUgYmxvY2sKICAgICAgICAgICAgICAgIGlmIGkgPCBsIGFuZCBsaW5lMltpXSA9PSAnLyc6CiAgICAgICAgICAgICAgICAgICAgaWYgYmxvY2sgIT0gW106CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDQKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAwCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlIHNpbXBseSBhcHBlbmQgbGluZSB0byBjdXJyZW50IGJsb2NrCiAgICAgICAgICAgICAgICAgICAgYmxvY2suYXBwZW5kKCBsaW5lMltpOl0gKQoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgIwogICAgICAgICMgRk9STUFUIDIKICAgICAgICAjCiAgICAgICAgZWxpZiBmb3JtYXQgPT0gMjoKCiAgICAgICAgICAgICMgaWYgdGhlIGxpbmUgZG9lc24ndCBiZWdpbiB3aXRoICcvKicgYW5kIGVuZCB3aXRoICcqLycsCiAgICAgICAgICAgICMgdGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBmb3JtYXQgMiBmb3JtYXQKICAgICAgICAgICAgaWYgbCA8IDQgb3IgbGluZTJbOiAyXSAhPSAnLyonIG9yIGxpbmUyWy0yIDpdICE9ICcqLyc6CiAgICAgICAgICAgICAgICBpZiBibG9jayAhPSBbXToKICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSA0CiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDAKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgcmVtb3ZlIHRoZSBzdGFydCBhbmQgZW5kIGNvbW1lbnQgZGVsaW1pdGVycywgdGhlbgogICAgICAgICAgICAgICAgIyByaWdodC1zdHJpcCB0aGUgbGluZQogICAgICAgICAgICAgICAgbGluZTIgPSBzdHJpbmcucnN0cmlwKCBsaW5lMlsyIDogLTJdICkKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBlbmQgb2YgYSBmb3JtYXQyIGJsb2NrLCBpLmUuIGEgcnVuIG9mICcqJwogICAgICAgICAgICAgICAgaWYgc3RyaW5nLmNvdW50KCBsaW5lMiwgJyonICkgPT0gbCAtIDQ6CiAgICAgICAgICAgICAgICAgICAgaWYgYmxvY2sgIT0gW106CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDQKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAwCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlLCBhZGQgdGhlIGxpbmUgdG8gdGhlIGN1cnJlbnQgYmxvY2sKICAgICAgICAgICAgICAgICAgICBibG9jay5hcHBlbmQoIGxpbmUyICkKCiAgICAgICAgICAgICAgICBjb250aW51ZQoKCgogICAgICAgIGlmIGZvcm1hdCA+PSA0OiAgIyMjIyBzb3VyY2UgcHJvY2Vzc2luZyAjIyMjCgogICAgICAgICAgICBpZiBsID4gMDoKICAgICAgICAgICAgICAgIGZvcm1hdCA9IDUKCiAgICAgICAgICAgIGlmIGZvcm1hdCA9PSA1OgogICAgICAgICAgICAgICAgc291cmNlLmFwcGVuZCggbGluZSApCgoKICAgIGlmIGZvcm1hdCA+PSA0OgogICAgICAgIGxpc3QuYXBwZW5kKCBbYmxvY2ssIHNvdXJjZV0gKQoKICAgIHJldHVybiBsaXN0CgoKCiMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZwojCmRlZiBkdW1wX2Jsb2NrX2xpc3QoIGxpc3QgKToKICAgICIiImR1bXAgYSBjb21tZW50IGJsb2NrIGxpc3QiIiIKICAgIGZvciBibG9jayBpbiBsaXN0OgogICAgICAgIHByaW50ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgogICAgICAgIGZvciBsaW5lIGluIGJsb2NrWzBdOgogICAgICAgICAgICBwcmludCBsaW5lCiAgICAgICAgZm9yIGxpbmUgaW4gYmxvY2tbMV06CiAgICAgICAgICAgIHByaW50IGxpbmUKCiAgICBwcmludCAiLS0tLS0tLS0tdGhlIGVuZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgoKCgpkZWYgbWFpbiggYXJndiApOgogICAgIiIibWFpbiBwcm9ncmFtIGxvb3AiIiIKICAgIHN5cy5zdGRlcnIud3JpdGUoICJleHRyYWN0aW5nIGNvbW1lbnQgYmxvY2tzIGZyb20gc291cmNlcy4uLlxuIiApCiAgICBsaXN0ID0gbWFrZV9ibG9ja19saXN0KCkKICAgIGxpc3QgPSBibG9ja19tYWtlX2xpc3QobGlzdCkKCiAgICBsaXN0MiA9IGZpbHRlcl9ibG9ja3MoIGxpc3QsIFsndHlwZScsJ21hY3JvJywnZW51bScsJ2NvbnN0YW50JywgJ2Z1bmN0eXBlJ10gKQogICAgI2xpc3QyID0gbGlzdAogICAgbGlzdDIuc29ydCggYmxvY2tfbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUgKQoKICAgIGR1bXBfaHRtbF8xKCBsaXN0MiApCiAgICAjZHVtcF9kb2NfYmxvY2tzKCBsaXN0ICkKICAgICNkdW1wX2Jsb2NrX2xpc3RzKCBsaXN0ICkKICAgICNkdW1wX2h0bWxfMSggbGlzdCApCgoKIyBJZiBjYWxsZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluKCBzeXMuYXJndiApCgoKIyBlb2YK