LyoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgpwYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nOwoKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKaW1wb3J0IGphdmEuaW8uV3JpdGVyOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwppbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CgovKioKICogPHA+CiAqIFByb3ZpZGVzIEhUTUwgYW5kIFhNTCBlbnRpdHkgdXRpbGl0aWVzLgogKiA8L3A+CiAqIAogKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly9ob3R3aXJlZC5seWNvcy5jb20vd2VibW9ua2V5L3JlZmVyZW5jZS9zcGVjaWFsX2NoYXJhY3RlcnMvIj5JU08gRW50aXRpZXM8L2E+CiAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWwzMiNsYXRpbjEiPkhUTUwgMy4yIENoYXJhY3RlciBFbnRpdGllcyBmb3IgSVNPIExhdGluLTE8L2E+CiAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9zZ21sL2VudGl0aWVzLmh0bWwiPkhUTUwgNC4wIENoYXJhY3RlciBlbnRpdHkgcmVmZXJlbmNlczwvYT4KICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxL2NoYXJzZXQuaHRtbCNoLTUuMyI+SFRNTCA0LjAxIENoYXJhY3RlciBSZWZlcmVuY2VzPC9hPgogKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0MDEvY2hhcnNldC5odG1sI2NvZGUtcG9zaXRpb24iPkhUTUwgNC4wMSBDb2RlIHBvc2l0aW9uczwvYT4KICogCiAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmFsZXhAcHVycGxldGVjaC5jb20iPkFsZXhhbmRlciBEYXkgQ2hhZmZlZTwvYT4KICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Z2dyZWdvcnlAc2VhZ3VsbHN3LmNvbSI+R2FyeSBHcmVnb3J5PC9hPgogKiBAc2luY2UgMi4wCiAqIEB2ZXJzaW9uICRJZCQKICovCmNsYXNzIEVudGl0aWVzIHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXVtdIEJBU0lDX0FSUkFZID0ge3sicXVvdCIsICIzNCJ9LCAvLyAiIC0gZG91YmxlLXF1b3RlCiAgICAgICAgeyJhbXAiLCAiMzgifSwgLy8gJiAtIGFtcGVyc2FuZAogICAgICAgIHsibHQiLCAiNjAifSwgLy8gPCAtIGxlc3MtdGhhbgogICAgICAgIHsiZ3QiLCAiNjIifSwgLy8gPiAtIGdyZWF0ZXItdGhhbgogICAgfTsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXVtdIEFQT1NfQVJSQVkgPSB7eyJhcG9zIiwgIjM5In0sIC8vIFhNTCBhcG9zdHJvcGhlCiAgICB9OwoKICAgIC8vIHBhY2thZ2Ugc2NvcGVkIGZvciB0ZXN0aW5nCiAgICBzdGF0aWMgZmluYWwgU3RyaW5nW11bXSBJU084ODU5XzFfQVJSQVkgPSB7eyJuYnNwIiwgIjE2MCJ9LCAvLyBub24tYnJlYWtpbmcgc3BhY2UKICAgICAgICB7ImlleGNsIiwgIjE2MSJ9LCAvLyBpbnZlcnRlZCBleGNsYW1hdGlvbiBtYXJrCiAgICAgICAgeyJjZW50IiwgIjE2MiJ9LCAvLyBjZW50IHNpZ24KICAgICAgICB7InBvdW5kIiwgIjE2MyJ9LCAvLyBwb3VuZCBzaWduCiAgICAgICAgeyJjdXJyZW4iLCAiMTY0In0sIC8vIGN1cnJlbmN5IHNpZ24KICAgICAgICB7InllbiIsICIxNjUifSwgLy8geWVuIHNpZ24gPSB5dWFuIHNpZ24KICAgICAgICB7ImJydmJhciIsICIxNjYifSwgLy8gYnJva2VuIGJhciA9IGJyb2tlbiB2ZXJ0aWNhbCBiYXIKICAgICAgICB7InNlY3QiLCAiMTY3In0sIC8vIHNlY3Rpb24gc2lnbgogICAgICAgIHsidW1sIiwgIjE2OCJ9LCAvLyBkaWFlcmVzaXMgPSBzcGFjaW5nIGRpYWVyZXNpcwogICAgICAgIHsiY29weSIsICIxNjkifSwgLy8gqSAtIGNvcHlyaWdodCBzaWduCiAgICAgICAgeyJvcmRmIiwgIjE3MCJ9LCAvLyBmZW1pbmluZSBvcmRpbmFsIGluZGljYXRvcgogICAgICAgIHsibGFxdW8iLCAiMTcxIn0sIC8vIGxlZnQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrID0gbGVmdCBwb2ludGluZyBndWlsbGVtZXQKICAgICAgICB7Im5vdCIsICIxNzIifSwgLy8gbm90IHNpZ24KICAgICAgICB7InNoeSIsICIxNzMifSwgLy8gc29mdCBoeXBoZW4gPSBkaXNjcmV0aW9uYXJ5IGh5cGhlbgogICAgICAgIHsicmVnIiwgIjE3NCJ9LCAvLyCuIC0gcmVnaXN0ZXJlZCB0cmFkZW1hcmsgc2lnbgogICAgICAgIHsibWFjciIsICIxNzUifSwgLy8gbWFjcm9uID0gc3BhY2luZyBtYWNyb24gPSBvdmVybGluZSA9IEFQTCBvdmVyYmFyCiAgICAgICAgeyJkZWciLCAiMTc2In0sIC8vIGRlZ3JlZSBzaWduCiAgICAgICAgeyJwbHVzbW4iLCAiMTc3In0sIC8vIHBsdXMtbWludXMgc2lnbiA9IHBsdXMtb3ItbWludXMgc2lnbgogICAgICAgIHsic3VwMiIsICIxNzgifSwgLy8gc3VwZXJzY3JpcHQgdHdvID0gc3VwZXJzY3JpcHQgZGlnaXQgdHdvID0gc3F1YXJlZAogICAgICAgIHsic3VwMyIsICIxNzkifSwgLy8gc3VwZXJzY3JpcHQgdGhyZWUgPSBzdXBlcnNjcmlwdCBkaWdpdCB0aHJlZSA9IGN1YmVkCiAgICAgICAgeyJhY3V0ZSIsICIxODAifSwgLy8gYWN1dGUgYWNjZW50ID0gc3BhY2luZyBhY3V0ZQogICAgICAgIHsibWljcm8iLCAiMTgxIn0sIC8vIG1pY3JvIHNpZ24KICAgICAgICB7InBhcmEiLCAiMTgyIn0sIC8vIHBpbGNyb3cgc2lnbiA9IHBhcmFncmFwaCBzaWduCiAgICAgICAgeyJtaWRkb3QiLCAiMTgzIn0sIC8vIG1pZGRsZSBkb3QgPSBHZW9yZ2lhbiBjb21tYSA9IEdyZWVrIG1pZGRsZSBkb3QKICAgICAgICB7ImNlZGlsIiwgIjE4NCJ9LCAvLyBjZWRpbGxhID0gc3BhY2luZyBjZWRpbGxhCiAgICAgICAgeyJzdXAxIiwgIjE4NSJ9LCAvLyBzdXBlcnNjcmlwdCBvbmUgPSBzdXBlcnNjcmlwdCBkaWdpdCBvbmUKICAgICAgICB7Im9yZG0iLCAiMTg2In0sIC8vIG1hc2N1bGluZSBvcmRpbmFsIGluZGljYXRvcgogICAgICAgIHsicmFxdW8iLCAiMTg3In0sIC8vIHJpZ2h0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyayA9IHJpZ2h0IHBvaW50aW5nIGd1aWxsZW1ldAogICAgICAgIHsiZnJhYzE0IiwgIjE4OCJ9LCAvLyB2dWxnYXIgZnJhY3Rpb24gb25lIHF1YXJ0ZXIgPSBmcmFjdGlvbiBvbmUgcXVhcnRlcgogICAgICAgIHsiZnJhYzEyIiwgIjE4OSJ9LCAvLyB2dWxnYXIgZnJhY3Rpb24gb25lIGhhbGYgPSBmcmFjdGlvbiBvbmUgaGFsZgogICAgICAgIHsiZnJhYzM0IiwgIjE5MCJ9LCAvLyB2dWxnYXIgZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMgPSBmcmFjdGlvbiB0aHJlZSBxdWFydGVycwogICAgICAgIHsiaXF1ZXN0IiwgIjE5MSJ9LCAvLyBpbnZlcnRlZCBxdWVzdGlvbiBtYXJrID0gdHVybmVkIHF1ZXN0aW9uIG1hcmsKICAgICAgICB7IkFncmF2ZSIsICIxOTIifSwgLy8gwCAtIHVwcGVyY2FzZSBBLCBncmF2ZSBhY2NlbnQKICAgICAgICB7IkFhY3V0ZSIsICIxOTMifSwgLy8gwSAtIHVwcGVyY2FzZSBBLCBhY3V0ZSBhY2NlbnQKICAgICAgICB7IkFjaXJjIiwgIjE5NCJ9LCAvLyDCIC0gdXBwZXJjYXNlIEEsIGNpcmN1bWZsZXggYWNjZW50CiAgICAgICAgeyJBdGlsZGUiLCAiMTk1In0sIC8vIMMgLSB1cHBlcmNhc2UgQSwgdGlsZGUKICAgICAgICB7IkF1bWwiLCAiMTk2In0sIC8vIMQgLSB1cHBlcmNhc2UgQSwgdW1sYXV0CiAgICAgICAgeyJBcmluZyIsICIxOTcifSwgLy8gxSAtIHVwcGVyY2FzZSBBLCByaW5nCiAgICAgICAgeyJBRWxpZyIsICIxOTgifSwgLy8gxiAtIHVwcGVyY2FzZSBBRQogICAgICAgIHsiQ2NlZGlsIiwgIjE5OSJ9LCAvLyDHIC0gdXBwZXJjYXNlIEMsIGNlZGlsbGEKICAgICAgICB7IkVncmF2ZSIsICIyMDAifSwgLy8gyCAtIHVwcGVyY2FzZSBFLCBncmF2ZSBhY2NlbnQKICAgICAgICB7IkVhY3V0ZSIsICIyMDEifSwgLy8gySAtIHVwcGVyY2FzZSBFLCBhY3V0ZSBhY2NlbnQKICAgICAgICB7IkVjaXJjIiwgIjIwMiJ9LCAvLyDKIC0gdXBwZXJjYXNlIEUsIGNpcmN1bWZsZXggYWNjZW50CiAgICAgICAgeyJFdW1sIiwgIjIwMyJ9LCAvLyDLIC0gdXBwZXJjYXNlIEUsIHVtbGF1dAogICAgICAgIHsiSWdyYXZlIiwgIjIwNCJ9LCAvLyDMIC0gdXBwZXJjYXNlIEksIGdyYXZlIGFjY2VudAogICAgICAgIHsiSWFjdXRlIiwgIjIwNSJ9LCAvLyDNIC0gdXBwZXJjYXNlIEksIGFjdXRlIGFjY2VudAogICAgICAgIHsiSWNpcmMiLCAiMjA2In0sIC8vIM4gLSB1cHBlcmNhc2UgSSwgY2lyY3VtZmxleCBhY2NlbnQKICAgICAgICB7Ikl1bWwiLCAiMjA3In0sIC8vIM8gLSB1cHBlcmNhc2UgSSwgdW1sYXV0CiAgICAgICAgeyJFVEgiLCAiMjA4In0sIC8vINAgLSB1cHBlcmNhc2UgRXRoLCBJY2VsYW5kaWMKICAgICAgICB7Ik50aWxkZSIsICIyMDkifSwgLy8g0SAtIHVwcGVyY2FzZSBOLCB0aWxkZQogICAgICAgIHsiT2dyYXZlIiwgIjIxMCJ9LCAvLyDSIC0gdXBwZXJjYXNlIE8sIGdyYXZlIGFjY2VudAogICAgICAgIHsiT2FjdXRlIiwgIjIxMSJ9LCAvLyDTIC0gdXBwZXJjYXNlIE8sIGFjdXRlIGFjY2VudAogICAgICAgIHsiT2NpcmMiLCAiMjEyIn0sIC8vINQgLSB1cHBlcmNhc2UgTywgY2lyY3VtZmxleCBhY2NlbnQKICAgICAgICB7Ik90aWxkZSIsICIyMTMifSwgLy8g1SAtIHVwcGVyY2FzZSBPLCB0aWxkZQogICAgICAgIHsiT3VtbCIsICIyMTQifSwgLy8g1iAtIHVwcGVyY2FzZSBPLCB1bWxhdXQKICAgICAgICB7InRpbWVzIiwgIjIxNSJ9LCAvLyBtdWx0aXBsaWNhdGlvbiBzaWduCiAgICAgICAgeyJPc2xhc2giLCAiMjE2In0sIC8vINggLSB1cHBlcmNhc2UgTywgc2xhc2gKICAgICAgICB7IlVncmF2ZSIsICIyMTcifSwgLy8g2SAtIHVwcGVyY2FzZSBVLCBncmF2ZSBhY2NlbnQKICAgICAgICB7IlVhY3V0ZSIsICIyMTgifSwgLy8g2iAtIHVwcGVyY2FzZSBVLCBhY3V0ZSBhY2NlbnQKICAgICAgICB7IlVjaXJjIiwgIjIxOSJ9LCAvLyDbIC0gdXBwZXJjYXNlIFUsIGNpcmN1bWZsZXggYWNjZW50CiAgICAgICAgeyJVdW1sIiwgIjIyMCJ9LCAvLyDcIC0gdXBwZXJjYXNlIFUsIHVtbGF1dAogICAgICAgIHsiWWFjdXRlIiwgIjIyMSJ9LCAvLyDdIC0gdXBwZXJjYXNlIFksIGFjdXRlIGFjY2VudAogICAgICAgIHsiVEhPUk4iLCAiMjIyIn0sIC8vIN4gLSB1cHBlcmNhc2UgVEhPUk4sIEljZWxhbmRpYwogICAgICAgIHsic3psaWciLCAiMjIzIn0sIC8vIN8gLSBsb3dlcmNhc2Ugc2hhcnBzLCBHZXJtYW4KICAgICAgICB7ImFncmF2ZSIsICIyMjQifSwgLy8g4CAtIGxvd2VyY2FzZSBhLCBncmF2ZSBhY2NlbnQKICAgICAgICB7ImFhY3V0ZSIsICIyMjUifSwgLy8g4SAtIGxvd2VyY2FzZSBhLCBhY3V0ZSBhY2NlbnQKICAgICAgICB7ImFjaXJjIiwgIjIyNiJ9LCAvLyDiIC0gbG93ZXJjYXNlIGEsIGNpcmN1bWZsZXggYWNjZW50CiAgICAgICAgeyJhdGlsZGUiLCAiMjI3In0sIC8vIOMgLSBsb3dlcmNhc2UgYSwgdGlsZGUKICAgICAgICB7ImF1bWwiLCAiMjI4In0sIC8vIOQgLSBsb3dlcmNhc2UgYSwgdW1sYXV0CiAgICAgICAgeyJhcmluZyIsICIyMjkifSwgLy8g5SAtIGxvd2VyY2FzZSBhLCByaW5nCiAgICAgICAgeyJhZWxpZyIsICIyMzAifSwgLy8g5iAtIGxvd2VyY2FzZSBhZQogICAgICAgIHsiY2NlZGlsIiwgIjIzMSJ9LCAvLyDnIC0gbG93ZXJjYXNlIGMsIGNlZGlsbGEKICAgICAgICB7ImVncmF2ZSIsICIyMzIifSwgLy8g6CAtIGxvd2VyY2FzZSBlLCBncmF2ZSBhY2NlbnQKICAgICAgICB7ImVhY3V0ZSIsICIyMzMifSwgLy8g6SAtIGxvd2VyY2FzZSBlLCBhY3V0ZSBhY2NlbnQKICAgICAgICB7ImVjaXJjIiwgIjIzNCJ9LCAvLyDqIC0gbG93ZXJjYXNlIGUsIGNpcmN1bWZsZXggYWNjZW50CiAgICAgICAgeyJldW1sIiwgIjIzNSJ9LCAvLyDrIC0gbG93ZXJjYXNlIGUsIHVtbGF1dAogICAgICAgIHsiaWdyYXZlIiwgIjIzNiJ9LCAvLyDsIC0gbG93ZXJjYXNlIGksIGdyYXZlIGFjY2VudAogICAgICAgIHsiaWFjdXRlIiwgIjIzNyJ9LCAvLyDtIC0gbG93ZXJjYXNlIGksIGFjdXRlIGFjY2VudAogICAgICAgIHsiaWNpcmMiLCAiMjM4In0sIC8vIO4gLSBsb3dlcmNhc2UgaSwgY2lyY3VtZmxleCBhY2NlbnQKICAgICAgICB7Iml1bWwiLCAiMjM5In0sIC8vIO8gLSBsb3dlcmNhc2UgaSwgdW1sYXV0CiAgICAgICAgeyJldGgiLCAiMjQwIn0sIC8vIPAgLSBsb3dlcmNhc2UgZXRoLCBJY2VsYW5kaWMKICAgICAgICB7Im50aWxkZSIsICIyNDEifSwgLy8g8SAtIGxvd2VyY2FzZSBuLCB0aWxkZQogICAgICAgIHsib2dyYXZlIiwgIjI0MiJ9LCAvLyDyIC0gbG93ZXJjYXNlIG8sIGdyYXZlIGFjY2VudAogICAgICAgIHsib2FjdXRlIiwgIjI0MyJ9LCAvLyDzIC0gbG93ZXJjYXNlIG8sIGFjdXRlIGFjY2VudAogICAgICAgIHsib2NpcmMiLCAiMjQ0In0sIC8vIPQgLSBsb3dlcmNhc2UgbywgY2lyY3VtZmxleCBhY2NlbnQKICAgICAgICB7Im90aWxkZSIsICIyNDUifSwgLy8g9SAtIGxvd2VyY2FzZSBvLCB0aWxkZQogICAgICAgIHsib3VtbCIsICIyNDYifSwgLy8g9iAtIGxvd2VyY2FzZSBvLCB1bWxhdXQKICAgICAgICB7ImRpdmlkZSIsICIyNDcifSwgLy8gZGl2aXNpb24gc2lnbgogICAgICAgIHsib3NsYXNoIiwgIjI0OCJ9LCAvLyD4IC0gbG93ZXJjYXNlIG8sIHNsYXNoCiAgICAgICAgeyJ1Z3JhdmUiLCAiMjQ5In0sIC8vIPkgLSBsb3dlcmNhc2UgdSwgZ3JhdmUgYWNjZW50CiAgICAgICAgeyJ1YWN1dGUiLCAiMjUwIn0sIC8vIPogLSBsb3dlcmNhc2UgdSwgYWN1dGUgYWNjZW50CiAgICAgICAgeyJ1Y2lyYyIsICIyNTEifSwgLy8g+yAtIGxvd2VyY2FzZSB1LCBjaXJjdW1mbGV4IGFjY2VudAogICAgICAgIHsidXVtbCIsICIyNTIifSwgLy8g/CAtIGxvd2VyY2FzZSB1LCB1bWxhdXQKICAgICAgICB7InlhY3V0ZSIsICIyNTMifSwgLy8g/SAtIGxvd2VyY2FzZSB5LCBhY3V0ZSBhY2NlbnQKICAgICAgICB7InRob3JuIiwgIjI1NCJ9LCAvLyD+IC0gbG93ZXJjYXNlIHRob3JuLCBJY2VsYW5kaWMKICAgICAgICB7Inl1bWwiLCAiMjU1In0sIC8vIP8gLSBsb3dlcmNhc2UgeSwgdW1sYXV0CiAgICB9OwoKICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvc2dtbC9lbnRpdGllcy5odG1sCiAgICAvLyBwYWNrYWdlIHNjb3BlZCBmb3IgdGVzdGluZwogICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdW10gSFRNTDQwX0FSUkFZID0gewogICAgLy8gPCEtLSBMYXRpbiBFeHRlbmRlZC1CIC0tPgogICAgICAgIHsiZm5vZiIsICI0MDIifSwgLy8gbGF0aW4gc21hbGwgZiB3aXRoIGhvb2sgPSBmdW5jdGlvbj0gZmxvcmluLCBVKzAxOTIgSVNPdGVjaCAtLT4KICAgICAgICAvLyA8IS0tIEdyZWVrIC0tPgogICAgICAgIHsiQWxwaGEiLCAiOTEzIn0sIC8vIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGFscGhhLCBVKzAzOTEgLS0+CiAgICAgICAgeyJCZXRhIiwgIjkxNCJ9LCAvLyBncmVlayBjYXBpdGFsIGxldHRlciBiZXRhLCBVKzAzOTIgLS0+CiAgICAgICAgeyJHYW1tYSIsICI5MTUifSwgLy8gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZ2FtbWEsVSswMzkzIElTT2dyazMgLS0+CiAgICAgICAgeyJEZWx0YSIsICI5MTYifSwgLy8gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZGVsdGEsVSswMzk0IElTT2dyazMgLS0+CiAgICAgICAgeyJFcHNpbG9uIiwgIjkxNyJ9LCAvLyBncmVlayBjYXBpdGFsIGxldHRlciBlcHNpbG9uLCBVKzAzOTUgLS0+CiAgICAgICAgeyJaZXRhIiwgIjkxOCJ9LCAvLyBncmVlayBjYXBpdGFsIGxldHRlciB6ZXRhLCBVKzAzOTYgLS0+CiAgICAgICAgeyJFdGEiLCAiOTE5In0sIC8vIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGV0YSwgVSswMzk3IC0tPgogICAgICAgIHsiVGhldGEiLCAiOTIwIn0sIC8vIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRoZXRhLFUrMDM5OCBJU09ncmszIC0tPgogICAgICAgIHsiSW90YSIsICI5MjEifSwgLy8gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgaW90YSwgVSswMzk5IC0tPgogICAgICAgIHsiS2FwcGEiLCAiOTIyIn0sIC8vIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGthcHBhLCBVKzAzOUEgLS0+CiAgICAgICAgeyJMYW1iZGEiLCAiOTIzIn0sIC8vIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGxhbWJkYSxVKzAzOUIgSVNPZ3JrMyAtLT4KICAgICAgICB7Ik11IiwgIjkyNCJ9LCAvLyBncmVlayBjYXBpdGFsIGxldHRlciBtdSwgVSswMzlDIC0tPgogICAgICAgIHsiTnUiLCAiOTI1In0sIC8vIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG51LCBVKzAzOUQgLS0+CiAgICAgICAgeyJYaSIsICI5MjYifSwgLy8gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgeGksIFUrMDM5RSBJU09ncmszIC0tPgogICAgICAgIHsiT21pY3JvbiIsICI5MjcifSwgLy8gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgb21pY3JvbiwgVSswMzlGIC0tPgogICAgICAgIHsiUGkiLCAiOTI4In0sIC8vIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBpLCBVKzAzQTAgSVNPZ3JrMyAtLT4KICAgICAgICB7IlJobyIsICI5MjkifSwgLy8gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcmhvLCBVKzAzQTEgLS0+CiAgICAgICAgLy8gPCEtLSB0aGVyZSBpcyBubyBTaWdtYWYsIGFuZCBubyBVKzAzQTIgY2hhcmFjdGVyIGVpdGhlciAtLT4KICAgICAgICB7IlNpZ21hIiwgIjkzMSJ9LCAvLyBncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYSxVKzAzQTMgSVNPZ3JrMyAtLT4KICAgICAgICB7IlRhdSIsICI5MzIifSwgLy8gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGF1LCBVKzAzQTQgLS0+CiAgICAgICAgeyJVcHNpbG9uIiwgIjkzMyJ9LCAvLyBncmVlayBjYXBpdGFsIGxldHRlciB1cHNpbG9uLFUrMDNBNSBJU09ncmszIC0tPgogICAgICAgIHsiUGhpIiwgIjkzNCJ9LCAvLyBncmVlayBjYXBpdGFsIGxldHRlciBwaGksVSswM0E2IElTT2dyazMgLS0+CiAgICAgICAgeyJDaGkiLCAiOTM1In0sIC8vIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGNoaSwgVSswM0E3IC0tPgogICAgICAgIHsiUHNpIiwgIjkzNiJ9LCAvLyBncmVlayBjYXBpdGFsIGxldHRlciBwc2ksVSswM0E4IElTT2dyazMgLS0+CiAgICAgICAgeyJPbWVnYSIsICI5MzcifSwgLy8gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgb21lZ2EsVSswM0E5IElTT2dyazMgLS0+CiAgICAgICAgeyJhbHBoYSIsICI5NDUifSwgLy8gZ3JlZWsgc21hbGwgbGV0dGVyIGFscGhhLFUrMDNCMSBJU09ncmszIC0tPgogICAgICAgIHsiYmV0YSIsICI5NDYifSwgLy8gZ3JlZWsgc21hbGwgbGV0dGVyIGJldGEsIFUrMDNCMiBJU09ncmszIC0tPgogICAgICAgIHsiZ2FtbWEiLCAiOTQ3In0sIC8vIGdyZWVrIHNtYWxsIGxldHRlciBnYW1tYSxVKzAzQjMgSVNPZ3JrMyAtLT4KICAgICAgICB7ImRlbHRhIiwgIjk0OCJ9LCAvLyBncmVlayBzbWFsbCBsZXR0ZXIgZGVsdGEsVSswM0I0IElTT2dyazMgLS0+CiAgICAgICAgeyJlcHNpbG9uIiwgIjk0OSJ9LCAvLyBncmVlayBzbWFsbCBsZXR0ZXIgZXBzaWxvbixVKzAzQjUgSVNPZ3JrMyAtLT4KICAgICAgICB7InpldGEiLCAiOTUwIn0sIC8vIGdyZWVrIHNtYWxsIGxldHRlciB6ZXRhLCBVKzAzQjYgSVNPZ3JrMyAtLT4KICAgICAgICB7ImV0YSIsICI5NTEifSwgLy8gZ3JlZWsgc21hbGwgbGV0dGVyIGV0YSwgVSswM0I3IElTT2dyazMgLS0+CiAgICAgICAgeyJ0aGV0YSIsICI5NTIifSwgLy8gZ3JlZWsgc21hbGwgbGV0dGVyIHRoZXRhLFUrMDNCOCBJU09ncmszIC0tPgogICAgICAgIHsiaW90YSIsICI5NTMifSwgLy8gZ3JlZWsgc21hbGwgbGV0dGVyIGlvdGEsIFUrMDNCOSBJU09ncmszIC0tPgogICAgICAgIHsia2FwcGEiLCAiOTU0In0sIC8vIGdyZWVrIHNtYWxsIGxldHRlciBrYXBwYSxVKzAzQkEgSVNPZ3JrMyAtLT4KICAgICAgICB7ImxhbWJkYSIsICI5NTUifSwgLy8gZ3JlZWsgc21hbGwgbGV0dGVyIGxhbWJkYSxVKzAzQkIgSVNPZ3JrMyAtLT4KICAgICAgICB7Im11IiwgIjk1NiJ9LCAvLyBncmVlayBzbWFsbCBsZXR0ZXIgbXUsIFUrMDNCQyBJU09ncmszIC0tPgogICAgICAgIHsibnUiLCAiOTU3In0sIC8vIGdyZWVrIHNtYWxsIGxldHRlciBudSwgVSswM0JEIElTT2dyazMgLS0+CiAgICAgICAgeyJ4aSIsICI5NTgifSwgLy8gZ3JlZWsgc21hbGwgbGV0dGVyIHhpLCBVKzAzQkUgSVNPZ3JrMyAtLT4KICAgICAgICB7Im9taWNyb24iLCAiOTU5In0sIC8vIGdyZWVrIHNtYWxsIGxldHRlciBvbWljcm9uLCBVKzAzQkYgTkVXIC0tPgogICAgICAgIHsicGkiLCAiOTYwIn0sIC8vIGdyZWVrIHNtYWxsIGxldHRlciBwaSwgVSswM0MwIElTT2dyazMgLS0+CiAgICAgICAgeyJyaG8iLCAiOTYxIn0sIC8vIGdyZWVrIHNtYWxsIGxldHRlciByaG8sIFUrMDNDMSBJU09ncmszIC0tPgogICAgICAgIHsic2lnbWFmIiwgIjk2MiJ9LCAvLyBncmVlayBzbWFsbCBsZXR0ZXIgZmluYWwgc2lnbWEsVSswM0MyIElTT2dyazMgLS0+CiAgICAgICAgeyJzaWdtYSIsICI5NjMifSwgLy8gZ3JlZWsgc21hbGwgbGV0dGVyIHNpZ21hLFUrMDNDMyBJU09ncmszIC0tPgogICAgICAgIHsidGF1IiwgIjk2NCJ9LCAvLyBncmVlayBzbWFsbCBsZXR0ZXIgdGF1LCBVKzAzQzQgSVNPZ3JrMyAtLT4KICAgICAgICB7InVwc2lsb24iLCAiOTY1In0sIC8vIGdyZWVrIHNtYWxsIGxldHRlciB1cHNpbG9uLFUrMDNDNSBJU09ncmszIC0tPgogICAgICAgIHsicGhpIiwgIjk2NiJ9LCAvLyBncmVlayBzbWFsbCBsZXR0ZXIgcGhpLCBVKzAzQzYgSVNPZ3JrMyAtLT4KICAgICAgICB7ImNoaSIsICI5NjcifSwgLy8gZ3JlZWsgc21hbGwgbGV0dGVyIGNoaSwgVSswM0M3IElTT2dyazMgLS0+CiAgICAgICAgeyJwc2kiLCAiOTY4In0sIC8vIGdyZWVrIHNtYWxsIGxldHRlciBwc2ksIFUrMDNDOCBJU09ncmszIC0tPgogICAgICAgIHsib21lZ2EiLCAiOTY5In0sIC8vIGdyZWVrIHNtYWxsIGxldHRlciBvbWVnYSxVKzAzQzkgSVNPZ3JrMyAtLT4KICAgICAgICB7InRoZXRhc3ltIiwgIjk3NyJ9LCAvLyBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEgc3ltYm9sLFUrMDNEMSBORVcgLS0+CiAgICAgICAgeyJ1cHNpaCIsICI5NzgifSwgLy8gZ3JlZWsgdXBzaWxvbiB3aXRoIGhvb2sgc3ltYm9sLFUrMDNEMiBORVcgLS0+CiAgICAgICAgeyJwaXYiLCAiOTgyIn0sIC8vIGdyZWVrIHBpIHN5bWJvbCwgVSswM0Q2IElTT2dyazMgLS0+CiAgICAgICAgLy8gPCEtLSBHZW5lcmFsIFB1bmN0dWF0aW9uIC0tPgogICAgICAgIHsiYnVsbCIsICI4MjI2In0sIC8vIGJ1bGxldCA9IGJsYWNrIHNtYWxsIGNpcmNsZSxVKzIwMjIgSVNPcHViIC0tPgogICAgICAgIC8vIDwhLS0gYnVsbGV0IGlzIE5PVCB0aGUgc2FtZSBhcyBidWxsZXQgb3BlcmF0b3IsIFUrMjIxOSAtLT4KICAgICAgICB7ImhlbGxpcCIsICI4MjMwIn0sIC8vIGhvcml6b250YWwgZWxsaXBzaXMgPSB0aHJlZSBkb3QgbGVhZGVyLFUrMjAyNiBJU09wdWIgLS0+CiAgICAgICAgeyJwcmltZSIsICI4MjQyIn0sIC8vIHByaW1lID0gbWludXRlcyA9IGZlZXQsIFUrMjAzMiBJU090ZWNoIC0tPgogICAgICAgIHsiUHJpbWUiLCAiODI0MyJ9LCAvLyBkb3VibGUgcHJpbWUgPSBzZWNvbmRzID0gaW5jaGVzLFUrMjAzMyBJU090ZWNoIC0tPgogICAgICAgIHsib2xpbmUiLCAiODI1NCJ9LCAvLyBvdmVybGluZSA9IHNwYWNpbmcgb3ZlcnNjb3JlLFUrMjAzRSBORVcgLS0+CiAgICAgICAgeyJmcmFzbCIsICI4MjYwIn0sIC8vIGZyYWN0aW9uIHNsYXNoLCBVKzIwNDQgTkVXIC0tPgogICAgICAgIC8vIDwhLS0gTGV0dGVybGlrZSBTeW1ib2xzIC0tPgogICAgICAgIHsid2VpZXJwIiwgIjg0NzIifSwgLy8gc2NyaXB0IGNhcGl0YWwgUCA9IHBvd2VyIHNldD0gV2VpZXJzdHJhc3MgcCwgVSsyMTE4IElTT2Ftc28gLS0+CiAgICAgICAgeyJpbWFnZSIsICI4NDY1In0sIC8vIGJsYWNrbGV0dGVyIGNhcGl0YWwgSSA9IGltYWdpbmFyeSBwYXJ0LFUrMjExMSBJU09hbXNvIC0tPgogICAgICAgIHsicmVhbCIsICI4NDc2In0sIC8vIGJsYWNrbGV0dGVyIGNhcGl0YWwgUiA9IHJlYWwgcGFydCBzeW1ib2wsVSsyMTFDIElTT2Ftc28gLS0+CiAgICAgICAgeyJ0cmFkZSIsICI4NDgyIn0sIC8vIHRyYWRlIG1hcmsgc2lnbiwgVSsyMTIyIElTT251bSAtLT4KICAgICAgICB7ImFsZWZzeW0iLCAiODUwMSJ9LCAvLyBhbGVmIHN5bWJvbCA9IGZpcnN0IHRyYW5zZmluaXRlIGNhcmRpbmFsLFUrMjEzNSBORVcgLS0+CiAgICAgICAgLy8gPCEtLSBhbGVmIHN5bWJvbCBpcyBOT1QgdGhlIHNhbWUgYXMgaGVicmV3IGxldHRlciBhbGVmLFUrMDVEMCBhbHRob3VnaCB0aGUKICAgICAgICAvLyBzYW1lIGdseXBoIGNvdWxkIGJlIHVzZWQgdG8gZGVwaWN0IGJvdGggY2hhcmFjdGVycyAtLT4KICAgICAgICAvLyA8IS0tIEFycm93cyAtLT4KICAgICAgICB7ImxhcnIiLCAiODU5MiJ9LCAvLyBsZWZ0d2FyZHMgYXJyb3csIFUrMjE5MCBJU09udW0gLS0+CiAgICAgICAgeyJ1YXJyIiwgIjg1OTMifSwgLy8gdXB3YXJkcyBhcnJvdywgVSsyMTkxIElTT251bS0tPgogICAgICAgIHsicmFyciIsICI4NTk0In0sIC8vIHJpZ2h0d2FyZHMgYXJyb3csIFUrMjE5MiBJU09udW0gLS0+CiAgICAgICAgeyJkYXJyIiwgIjg1OTUifSwgLy8gZG93bndhcmRzIGFycm93LCBVKzIxOTMgSVNPbnVtIC0tPgogICAgICAgIHsiaGFyciIsICI4NTk2In0sIC8vIGxlZnQgcmlnaHQgYXJyb3csIFUrMjE5NCBJU09hbXNhIC0tPgogICAgICAgIHsiY3JhcnIiLCAiODYyOSJ9LCAvLyBkb3dud2FyZHMgYXJyb3cgd2l0aCBjb3JuZXIgbGVmdHdhcmRzPSBjYXJyaWFnZSByZXR1cm4sIFUrMjFCNSBORVcgLS0+CiAgICAgICAgeyJsQXJyIiwgIjg2NTYifSwgLy8gbGVmdHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQwIElTT3RlY2ggLS0+CiAgICAgICAgLy8gPCEtLSBJU08gMTA2NDYgZG9lcyBub3Qgc2F5IHRoYXQgbEFyciBpcyB0aGUgc2FtZSBhcyB0aGUgJ2lzIGltcGxpZWQgYnknCiAgICAgICAgLy8gYXJyb3cgYnV0IGFsc28gZG9lcyBub3QgaGF2ZSBhbnkgb3RoZXIgY2hhcmFjdGVyIGZvciB0aGF0IGZ1bmN0aW9uLgogICAgICAgIC8vIFNvID8gbEFyciBjYW5iZSB1c2VkIGZvciAnaXMgaW1wbGllZCBieScgYXMgSVNPdGVjaCBzdWdnZXN0cyAtLT4KICAgICAgICB7InVBcnIiLCAiODY1NyJ9LCAvLyB1cHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQxIElTT2Ftc2EgLS0+CiAgICAgICAgeyJyQXJyIiwgIjg2NTgifSwgLy8gcmlnaHR3YXJkcyBkb3VibGUgYXJyb3csVSsyMUQyIElTT3RlY2ggLS0+CiAgICAgICAgLy8gPCEtLSBJU08gMTA2NDYgZG9lcyBub3Qgc2F5IHRoaXMgaXMgdGhlICdpbXBsaWVzJyBjaGFyYWN0ZXIgYnV0IGRvZXMgbm90CiAgICAgICAgLy8gaGF2ZSBhbm90aGVyIGNoYXJhY3RlciB3aXRoIHRoaXMgZnVuY3Rpb24gc28gP3JBcnIgY2FuIGJlIHVzZWQgZm9yCiAgICAgICAgLy8gJ2ltcGxpZXMnIGFzIElTT3RlY2ggc3VnZ2VzdHMgLS0+CiAgICAgICAgeyJkQXJyIiwgIjg2NTkifSwgLy8gZG93bndhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQzIElTT2Ftc2EgLS0+CiAgICAgICAgeyJoQXJyIiwgIjg2NjAifSwgLy8gbGVmdCByaWdodCBkb3VibGUgYXJyb3csVSsyMUQ0IElTT2Ftc2EgLS0+CiAgICAgICAgLy8gPCEtLSBNYXRoZW1hdGljYWwgT3BlcmF0b3JzIC0tPgogICAgICAgIHsiZm9yYWxsIiwgIjg3MDQifSwgLy8gZm9yIGFsbCwgVSsyMjAwIElTT3RlY2ggLS0+CiAgICAgICAgeyJwYXJ0IiwgIjg3MDYifSwgLy8gcGFydGlhbCBkaWZmZXJlbnRpYWwsIFUrMjIwMiBJU090ZWNoIC0tPgogICAgICAgIHsiZXhpc3QiLCAiODcwNyJ9LCAvLyB0aGVyZSBleGlzdHMsIFUrMjIwMyBJU090ZWNoIC0tPgogICAgICAgIHsiZW1wdHkiLCAiODcwOSJ9LCAvLyBlbXB0eSBzZXQgPSBudWxsIHNldCA9IGRpYW1ldGVyLFUrMjIwNSBJU09hbXNvIC0tPgogICAgICAgIHsibmFibGEiLCAiODcxMSJ9LCAvLyBuYWJsYSA9IGJhY2t3YXJkIGRpZmZlcmVuY2UsVSsyMjA3IElTT3RlY2ggLS0+CiAgICAgICAgeyJpc2luIiwgIjg3MTIifSwgLy8gZWxlbWVudCBvZiwgVSsyMjA4IElTT3RlY2ggLS0+CiAgICAgICAgeyJub3RpbiIsICI4NzEzIn0sIC8vIG5vdCBhbiBlbGVtZW50IG9mLCBVKzIyMDkgSVNPdGVjaCAtLT4KICAgICAgICB7Im5pIiwgIjg3MTUifSwgLy8gY29udGFpbnMgYXMgbWVtYmVyLCBVKzIyMEIgSVNPdGVjaCAtLT4KICAgICAgICAvLyA8IS0tIHNob3VsZCB0aGVyZSBiZSBhIG1vcmUgbWVtb3JhYmxlIG5hbWUgdGhhbiAnbmknPyAtLT4KICAgICAgICB7InByb2QiLCAiODcxOSJ9LCAvLyBuLWFyeSBwcm9kdWN0ID0gcHJvZHVjdCBzaWduLFUrMjIwRiBJU09hbXNiIC0tPgogICAgICAgIC8vIDwhLS0gcHJvZCBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDNBMCAnZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGknCiAgICAgICAgLy8gdGhvdWdoIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgZm9yIGJvdGggLS0+CiAgICAgICAgeyJzdW0iLCAiODcyMSJ9LCAvLyBuLWFyeSBzdW1tYXRpb24sIFUrMjIxMSBJU09hbXNiIC0tPgogICAgICAgIC8vIDwhLS0gc3VtIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswM0EzICdncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYScKICAgICAgICAvLyB0aG91Z2ggdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCBmb3IgYm90aCAtLT4KICAgICAgICB7Im1pbnVzIiwgIjg3MjIifSwgLy8gbWludXMgc2lnbiwgVSsyMjEyIElTT3RlY2ggLS0+CiAgICAgICAgeyJsb3dhc3QiLCAiODcyNyJ9LCAvLyBhc3RlcmlzayBvcGVyYXRvciwgVSsyMjE3IElTT3RlY2ggLS0+CiAgICAgICAgeyJyYWRpYyIsICI4NzMwIn0sIC8vIHNxdWFyZSByb290ID0gcmFkaWNhbCBzaWduLFUrMjIxQSBJU090ZWNoIC0tPgogICAgICAgIHsicHJvcCIsICI4NzMzIn0sIC8vIHByb3BvcnRpb25hbCB0bywgVSsyMjFEIElTT3RlY2ggLS0+CiAgICAgICAgeyJpbmZpbiIsICI4NzM0In0sIC8vIGluZmluaXR5LCBVKzIyMUUgSVNPdGVjaCAtLT4KICAgICAgICB7ImFuZyIsICI4NzM2In0sIC8vIGFuZ2xlLCBVKzIyMjAgSVNPYW1zbyAtLT4KICAgICAgICB7ImFuZCIsICI4NzQzIn0sIC8vIGxvZ2ljYWwgYW5kID0gd2VkZ2UsIFUrMjIyNyBJU090ZWNoIC0tPgogICAgICAgIHsib3IiLCAiODc0NCJ9LCAvLyBsb2dpY2FsIG9yID0gdmVlLCBVKzIyMjggSVNPdGVjaCAtLT4KICAgICAgICB7ImNhcCIsICI4NzQ1In0sIC8vIGludGVyc2VjdGlvbiA9IGNhcCwgVSsyMjI5IElTT3RlY2ggLS0+CiAgICAgICAgeyJjdXAiLCAiODc0NiJ9LCAvLyB1bmlvbiA9IGN1cCwgVSsyMjJBIElTT3RlY2ggLS0+CiAgICAgICAgeyJpbnQiLCAiODc0NyJ9LCAvLyBpbnRlZ3JhbCwgVSsyMjJCIElTT3RlY2ggLS0+CiAgICAgICAgeyJ0aGVyZTQiLCAiODc1NiJ9LCAvLyB0aGVyZWZvcmUsIFUrMjIzNCBJU090ZWNoIC0tPgogICAgICAgIHsic2ltIiwgIjg3NjQifSwgLy8gdGlsZGUgb3BlcmF0b3IgPSB2YXJpZXMgd2l0aCA9IHNpbWlsYXIgdG8sVSsyMjNDIElTT3RlY2ggLS0+CiAgICAgICAgLy8gPCEtLSB0aWxkZSBvcGVyYXRvciBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIHRoZSB0aWxkZSwgVSswMDdFLGFsdGhvdWdoCiAgICAgICAgLy8gdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCB0byByZXByZXNlbnQgYm90aCAtLT4KICAgICAgICB7ImNvbmciLCAiODc3MyJ9LCAvLyBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvLCBVKzIyNDUgSVNPdGVjaCAtLT4KICAgICAgICB7ImFzeW1wIiwgIjg3NzYifSwgLy8gYWxtb3N0IGVxdWFsIHRvID0gYXN5bXB0b3RpYyB0byxVKzIyNDggSVNPYW1zciAtLT4KICAgICAgICB7Im5lIiwgIjg4MDAifSwgLy8gbm90IGVxdWFsIHRvLCBVKzIyNjAgSVNPdGVjaCAtLT4KICAgICAgICB7ImVxdWl2IiwgIjg4MDEifSwgLy8gaWRlbnRpY2FsIHRvLCBVKzIyNjEgSVNPdGVjaCAtLT4KICAgICAgICB7ImxlIiwgIjg4MDQifSwgLy8gbGVzcy10aGFuIG9yIGVxdWFsIHRvLCBVKzIyNjQgSVNPdGVjaCAtLT4KICAgICAgICB7ImdlIiwgIjg4MDUifSwgLy8gZ3JlYXRlci10aGFuIG9yIGVxdWFsIHRvLFUrMjI2NSBJU090ZWNoIC0tPgogICAgICAgIHsic3ViIiwgIjg4MzQifSwgLy8gc3Vic2V0IG9mLCBVKzIyODIgSVNPdGVjaCAtLT4KICAgICAgICB7InN1cCIsICI4ODM1In0sIC8vIHN1cGVyc2V0IG9mLCBVKzIyODMgSVNPdGVjaCAtLT4KICAgICAgICAvLyA8IS0tIG5vdGUgdGhhdCBuc3VwLCAnbm90IGEgc3VwZXJzZXQgb2YsIFUrMjI4MycgaXMgbm90IGNvdmVyZWQgYnkgdGhlCiAgICAgICAgLy8gU3ltYm9sIGZvbnQgZW5jb2RpbmcgYW5kIGlzIG5vdCBpbmNsdWRlZC4gU2hvdWxkIGl0IGJlLCBmb3Igc3ltbWV0cnk/CiAgICAgICAgLy8gSXQgaXMgaW4gSVNPYW1zbiAtLT4gPCFFTlRJVFkgbnN1YiIsICI4ODM2In0sCiAgICAgICAgLy8gbm90IGEgc3Vic2V0IG9mLCBVKzIyODQgSVNPYW1zbiAtLT4KICAgICAgICB7InN1YmUiLCAiODgzOCJ9LCAvLyBzdWJzZXQgb2Ygb3IgZXF1YWwgdG8sIFUrMjI4NiBJU090ZWNoIC0tPgogICAgICAgIHsic3VwZSIsICI4ODM5In0sIC8vIHN1cGVyc2V0IG9mIG9yIGVxdWFsIHRvLFUrMjI4NyBJU090ZWNoIC0tPgogICAgICAgIHsib3BsdXMiLCAiODg1MyJ9LCAvLyBjaXJjbGVkIHBsdXMgPSBkaXJlY3Qgc3VtLFUrMjI5NSBJU09hbXNiIC0tPgogICAgICAgIHsib3RpbWVzIiwgIjg4NTUifSwgLy8gY2lyY2xlZCB0aW1lcyA9IHZlY3RvciBwcm9kdWN0LFUrMjI5NyBJU09hbXNiIC0tPgogICAgICAgIHsicGVycCIsICI4ODY5In0sIC8vIHVwIHRhY2sgPSBvcnRob2dvbmFsIHRvID0gcGVycGVuZGljdWxhcixVKzIyQTUgSVNPdGVjaCAtLT4KICAgICAgICB7InNkb3QiLCAiODkwMSJ9LCAvLyBkb3Qgb3BlcmF0b3IsIFUrMjJDNSBJU09hbXNiIC0tPgogICAgICAgIC8vIDwhLS0gZG90IG9wZXJhdG9yIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMEI3IG1pZGRsZSBkb3QgLS0+CiAgICAgICAgLy8gPCEtLSBNaXNjZWxsYW5lb3VzIFRlY2huaWNhbCAtLT4KICAgICAgICB7ImxjZWlsIiwgIjg5NjgifSwgLy8gbGVmdCBjZWlsaW5nID0gYXBsIHVwc3RpbGUsVSsyMzA4IElTT2Ftc2MgLS0+CiAgICAgICAgeyJyY2VpbCIsICI4OTY5In0sIC8vIHJpZ2h0IGNlaWxpbmcsIFUrMjMwOSBJU09hbXNjIC0tPgogICAgICAgIHsibGZsb29yIiwgIjg5NzAifSwgLy8gbGVmdCBmbG9vciA9IGFwbCBkb3duc3RpbGUsVSsyMzBBIElTT2Ftc2MgLS0+CiAgICAgICAgeyJyZmxvb3IiLCAiODk3MSJ9LCAvLyByaWdodCBmbG9vciwgVSsyMzBCIElTT2Ftc2MgLS0+CiAgICAgICAgeyJsYW5nIiwgIjkwMDEifSwgLy8gbGVmdC1wb2ludGluZyBhbmdsZSBicmFja2V0ID0gYnJhLFUrMjMyOSBJU090ZWNoIC0tPgogICAgICAgIC8vIDwhLS0gbGFuZyBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDAzQyAnbGVzcyB0aGFuJyBvciBVKzIwMzkgJ3NpbmdsZSBsZWZ0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbgogICAgICAgIC8vIG1hcmsnIC0tPgogICAgICAgIHsicmFuZyIsICI5MDAyIn0sIC8vIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBrZXQsVSsyMzJBIElTT3RlY2ggLS0+CiAgICAgICAgLy8gPCEtLSByYW5nIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMDNFICdncmVhdGVyIHRoYW4nIG9yIFUrMjAzQQogICAgICAgIC8vICdzaW5nbGUgcmlnaHQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnIC0tPgogICAgICAgIC8vIDwhLS0gR2VvbWV0cmljIFNoYXBlcyAtLT4KICAgICAgICB7ImxveiIsICI5Njc0In0sIC8vIGxvemVuZ2UsIFUrMjVDQSBJU09wdWIgLS0+CiAgICAgICAgLy8gPCEtLSBNaXNjZWxsYW5lb3VzIFN5bWJvbHMgLS0+CiAgICAgICAgeyJzcGFkZXMiLCAiOTgyNCJ9LCAvLyBibGFjayBzcGFkZSBzdWl0LCBVKzI2NjAgSVNPcHViIC0tPgogICAgICAgIC8vIDwhLS0gYmxhY2sgaGVyZSBzZWVtcyB0byBtZWFuIGZpbGxlZCBhcyBvcHBvc2VkIHRvIGhvbGxvdyAtLT4KICAgICAgICB7ImNsdWJzIiwgIjk4MjcifSwgLy8gYmxhY2sgY2x1YiBzdWl0ID0gc2hhbXJvY2ssVSsyNjYzIElTT3B1YiAtLT4KICAgICAgICB7ImhlYXJ0cyIsICI5ODI5In0sIC8vIGJsYWNrIGhlYXJ0IHN1aXQgPSB2YWxlbnRpbmUsVSsyNjY1IElTT3B1YiAtLT4KICAgICAgICB7ImRpYW1zIiwgIjk4MzAifSwgLy8gYmxhY2sgZGlhbW9uZCBzdWl0LCBVKzI2NjYgSVNPcHViIC0tPgoKICAgICAgICAvLyA8IS0tIExhdGluIEV4dGVuZGVkLUEgLS0+CiAgICAgICAgeyJPRWxpZyIsICIzMzgifSwgLy8gLS0gbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBPRSxVKzAxNTIgSVNPbGF0MiAtLT4KICAgICAgICB7Im9lbGlnIiwgIjMzOSJ9LCAvLyAtLSBsYXRpbiBzbWFsbCBsaWdhdHVyZSBvZSwgVSswMTUzIElTT2xhdDIgLS0+CiAgICAgICAgLy8gPCEtLSBsaWdhdHVyZSBpcyBhIG1pc25vbWVyLCB0aGlzIGlzIGEgc2VwYXJhdGUgY2hhcmFjdGVyIGluIHNvbWUgbGFuZ3VhZ2VzIC0tPgogICAgICAgIHsiU2Nhcm9uIiwgIjM1MiJ9LCAvLyAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBTIHdpdGggY2Fyb24sVSswMTYwIElTT2xhdDIgLS0+CiAgICAgICAgeyJzY2Fyb24iLCAiMzUzIn0sIC8vIC0tIGxhdGluIHNtYWxsIGxldHRlciBzIHdpdGggY2Fyb24sVSswMTYxIElTT2xhdDIgLS0+CiAgICAgICAgeyJZdW1sIiwgIjM3NiJ9LCAvLyAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBZIHdpdGggZGlhZXJlc2lzLFUrMDE3OCBJU09sYXQyIC0tPgogICAgICAgIC8vIDwhLS0gU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzIC0tPgogICAgICAgIHsiY2lyYyIsICI3MTAifSwgLy8gLS0gbW9kaWZpZXIgbGV0dGVyIGNpcmN1bWZsZXggYWNjZW50LFUrMDJDNiBJU09wdWIgLS0+CiAgICAgICAgeyJ0aWxkZSIsICI3MzIifSwgLy8gc21hbGwgdGlsZGUsIFUrMDJEQyBJU09kaWEgLS0+CiAgICAgICAgLy8gPCEtLSBHZW5lcmFsIFB1bmN0dWF0aW9uIC0tPgogICAgICAgIHsiZW5zcCIsICI4MTk0In0sIC8vIGVuIHNwYWNlLCBVKzIwMDIgSVNPcHViIC0tPgogICAgICAgIHsiZW1zcCIsICI4MTk1In0sIC8vIGVtIHNwYWNlLCBVKzIwMDMgSVNPcHViIC0tPgogICAgICAgIHsidGhpbnNwIiwgIjgyMDEifSwgLy8gdGhpbiBzcGFjZSwgVSsyMDA5IElTT3B1YiAtLT4KICAgICAgICB7Inp3bmoiLCAiODIwNCJ9LCAvLyB6ZXJvIHdpZHRoIG5vbi1qb2luZXIsVSsyMDBDIE5FVyBSRkMgMjA3MCAtLT4KICAgICAgICB7Inp3aiIsICI4MjA1In0sIC8vIHplcm8gd2lkdGggam9pbmVyLCBVKzIwMEQgTkVXIFJGQyAyMDcwIC0tPgogICAgICAgIHsibHJtIiwgIjgyMDYifSwgLy8gbGVmdC10by1yaWdodCBtYXJrLCBVKzIwMEUgTkVXIFJGQyAyMDcwIC0tPgogICAgICAgIHsicmxtIiwgIjgyMDcifSwgLy8gcmlnaHQtdG8tbGVmdCBtYXJrLCBVKzIwMEYgTkVXIFJGQyAyMDcwIC0tPgogICAgICAgIHsibmRhc2giLCAiODIxMSJ9LCAvLyBlbiBkYXNoLCBVKzIwMTMgSVNPcHViIC0tPgogICAgICAgIHsibWRhc2giLCAiODIxMiJ9LCAvLyBlbSBkYXNoLCBVKzIwMTQgSVNPcHViIC0tPgogICAgICAgIHsibHNxdW8iLCAiODIxNiJ9LCAvLyBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyayxVKzIwMTggSVNPbnVtIC0tPgogICAgICAgIHsicnNxdW8iLCAiODIxNyJ9LCAvLyByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmssVSsyMDE5IElTT251bSAtLT4KICAgICAgICB7InNicXVvIiwgIjgyMTgifSwgLy8gc2luZ2xlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUEgTkVXIC0tPgogICAgICAgIHsibGRxdW8iLCAiODIyMCJ9LCAvLyBsZWZ0IGRvdWJsZSBxdW90YXRpb24gbWFyayxVKzIwMUMgSVNPbnVtIC0tPgogICAgICAgIHsicmRxdW8iLCAiODIyMSJ9LCAvLyByaWdodCBkb3VibGUgcXVvdGF0aW9uIG1hcmssVSsyMDFEIElTT251bSAtLT4KICAgICAgICB7ImJkcXVvIiwgIjgyMjIifSwgLy8gZG91YmxlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUUgTkVXIC0tPgogICAgICAgIHsiZGFnZ2VyIiwgIjgyMjQifSwgLy8gZGFnZ2VyLCBVKzIwMjAgSVNPcHViIC0tPgogICAgICAgIHsiRGFnZ2VyIiwgIjgyMjUifSwgLy8gZG91YmxlIGRhZ2dlciwgVSsyMDIxIElTT3B1YiAtLT4KICAgICAgICB7InBlcm1pbCIsICI4MjQwIn0sIC8vIHBlciBtaWxsZSBzaWduLCBVKzIwMzAgSVNPdGVjaCAtLT4KICAgICAgICB7ImxzYXF1byIsICI4MjQ5In0sIC8vIHNpbmdsZSBsZWZ0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLFUrMjAzOSBJU08gcHJvcG9zZWQgLS0+CiAgICAgICAgLy8gPCEtLSBsc2FxdW8gaXMgcHJvcG9zZWQgYnV0IG5vdCB5ZXQgSVNPIHN0YW5kYXJkaXplZCAtLT4KICAgICAgICB7InJzYXF1byIsICI4MjUwIn0sIC8vIHNpbmdsZSByaWdodC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyayxVKzIwM0EgSVNPIHByb3Bvc2VkIC0tPgogICAgICAgIC8vIDwhLS0gcnNhcXVvIGlzIHByb3Bvc2VkIGJ1dCBub3QgeWV0IElTTyBzdGFuZGFyZGl6ZWQgLS0+CiAgICAgICAgeyJldXJvIiwgIjgzNjQifSwgLy8gLS0gZXVybyBzaWduLCBVKzIwQUMgTkVXIC0tPgogICAgfTsKCiAgICAvKioKICAgICAqIDxwPgogICAgICogVGhlIHNldCBvZiBlbnRpdGllcyBzdXBwb3J0ZWQgYnkgc3RhbmRhcmQgWE1MLgogICAgICogPC9wPgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0aWVzIFhNTDsKCiAgICAvKioKICAgICAqIDxwPgogICAgICogVGhlIHNldCBvZiBlbnRpdGllcyBzdXBwb3J0ZWQgYnkgSFRNTCAzLjIuCiAgICAgKiA8L3A+CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXRpZXMgSFRNTDMyOwoKICAgIC8qKgogICAgICogPHA+CiAgICAgKiBUaGUgc2V0IG9mIGVudGl0aWVzIHN1cHBvcnRlZCBieSBIVE1MIDQuMC4KICAgICAqIDwvcD4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdGllcyBIVE1MNDA7CgogICAgc3RhdGljIHsKICAgICAgICBYTUwgPSBuZXcgRW50aXRpZXMoKTsKICAgICAgICBYTUwuYWRkRW50aXRpZXMoQkFTSUNfQVJSQVkpOwogICAgICAgIFhNTC5hZGRFbnRpdGllcyhBUE9TX0FSUkFZKTsKICAgIH0KCiAgICBzdGF0aWMgewogICAgICAgIEhUTUwzMiA9IG5ldyBFbnRpdGllcygpOwogICAgICAgIEhUTUwzMi5hZGRFbnRpdGllcyhCQVNJQ19BUlJBWSk7CiAgICAgICAgSFRNTDMyLmFkZEVudGl0aWVzKElTTzg4NTlfMV9BUlJBWSk7CiAgICB9CgogICAgc3RhdGljIHsKICAgICAgICBIVE1MNDAgPSBuZXcgRW50aXRpZXMoKTsKICAgICAgICBmaWxsV2l0aEh0bWw0MEVudGl0aWVzKEhUTUw0MCk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8cD4KICAgICAqIEZpbGxzIHRoZSBzcGVjaWZpZWQgZW50aXRpZXMgaW5zdGFuY2Ugd2l0aCBIVE1MIDQwIGVudGl0aWVzLgogICAgICogPC9wPgogICAgICogCiAgICAgKiBAcGFyYW0gZW50aXRpZXMKICAgICAqICAgICAgICAgICAgdGhlIGluc3RhbmNlIHRvIGJlIGZpbGxlZC4KICAgICAqLwogICAgc3RhdGljIHZvaWQgZmlsbFdpdGhIdG1sNDBFbnRpdGllcyhFbnRpdGllcyBlbnRpdGllcykgewogICAgICAgIGVudGl0aWVzLmFkZEVudGl0aWVzKEJBU0lDX0FSUkFZKTsKICAgICAgICBlbnRpdGllcy5hZGRFbnRpdGllcyhJU084ODU5XzFfQVJSQVkpOwogICAgICAgIGVudGl0aWVzLmFkZEVudGl0aWVzKEhUTUw0MF9BUlJBWSk7CiAgICB9CgogICAgc3RhdGljIGludGVyZmFjZSBFbnRpdHlNYXAgewogICAgICAgIC8qKgogICAgICAgICAqIDxwPgogICAgICAgICAqIEFkZCBhbiBlbnRyeSB0byB0aGlzIGVudGl0eSBtYXAuCiAgICAgICAgICogPC9wPgogICAgICAgICAqIAogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogICAgICAgICAgICB0aGUgZW50aXR5IG5hbWUKICAgICAgICAgKiBAcGFyYW0gdmFsdWUKICAgICAgICAgKiAgICAgICAgICAgIHRoZSBlbnRpdHkgdmFsdWUKICAgICAgICAgKi8KICAgICAgICB2b2lkIGFkZChTdHJpbmcgbmFtZSwgaW50IHZhbHVlKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogPHA+CiAgICAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZW50aXR5IGlkZW50aWZpZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgICAgKiA8L3A+CiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIHZhbHVlCiAgICAgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gbG9jYXRlCiAgICAgICAgICogQHJldHVybiBlbnRpdHkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZQogICAgICAgICAqLwogICAgICAgIFN0cmluZyBuYW1lKGludCB2YWx1ZSk7CgogICAgICAgIC8qKgogICAgICAgICAqIDxwPgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBlbnRpdHkgaWRlbnRpZmllZCBieSB0aGUgc3BlY2lmaWVkIG5hbWUuCiAgICAgICAgICogPC9wPgogICAgICAgICAqIAogICAgICAgICAqIEBwYXJhbSBuYW1lCiAgICAgICAgICogICAgICAgICAgICB0aGUgbmFtZSB0byBsb2NhdGUKICAgICAgICAgKiBAcmV0dXJuIGVudGl0eSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCiAgICAgICAgICovCiAgICAgICAgaW50IHZhbHVlKFN0cmluZyBuYW1lKTsKICAgIH0KCiAgICBzdGF0aWMgY2xhc3MgUHJpbWl0aXZlRW50aXR5TWFwIGltcGxlbWVudHMgRW50aXR5TWFwIHsKICAgICAgICBwcml2YXRlIE1hcCBtYXBOYW1lVG9WYWx1ZSA9IG5ldyBIYXNoTWFwKCk7CgogICAgICAgIHByaXZhdGUgSW50SGFzaE1hcCBtYXBWYWx1ZVRvTmFtZSA9IG5ldyBJbnRIYXNoTWFwKCk7CgogICAgICAgIC8qKgogICAgICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewogICAgICAgICAgICBtYXBOYW1lVG9WYWx1ZS5wdXQobmFtZSwgbmV3IEludGVnZXIodmFsdWUpKTsKICAgICAgICAgICAgbWFwVmFsdWVUb05hbWUucHV0KHZhbHVlLCBuYW1lKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWUoaW50IHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBtYXBWYWx1ZVRvTmFtZS5nZXQodmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAgICAqLwogICAgICAgIHB1YmxpYyBpbnQgdmFsdWUoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbWFwTmFtZVRvVmFsdWUuZ2V0KG5hbWUpOwogICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgTWFwSW50TWFwIGltcGxlbWVudHMgRW50aXRpZXMuRW50aXR5TWFwIHsKICAgICAgICBwcm90ZWN0ZWQgTWFwIG1hcE5hbWVUb1ZhbHVlOwoKICAgICAgICBwcm90ZWN0ZWQgTWFwIG1hcFZhbHVlVG9OYW1lOwoKICAgICAgICAvKioKICAgICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICAgICovCiAgICAgICAgcHVibGljIHZvaWQgYWRkKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKICAgICAgICAgICAgbWFwTmFtZVRvVmFsdWUucHV0KG5hbWUsIG5ldyBJbnRlZ2VyKHZhbHVlKSk7CiAgICAgICAgICAgIG1hcFZhbHVlVG9OYW1lLnB1dChuZXcgSW50ZWdlcih2YWx1ZSksIG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAgICAqLwogICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZShpbnQgdmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIG1hcFZhbHVlVG9OYW1lLmdldChuZXcgSW50ZWdlcih2YWx1ZSkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAgICAqLwogICAgICAgIHB1YmxpYyBpbnQgdmFsdWUoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbWFwTmFtZVRvVmFsdWUuZ2V0KG5hbWUpOwogICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBzdGF0aWMgY2xhc3MgSGFzaEVudGl0eU1hcCBleHRlbmRzIE1hcEludE1hcCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiA8Y29kZT5IYXNoRW50aXR5TWFwPC9jb2RlPi4KICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgSGFzaEVudGl0eU1hcCgpIHsKICAgICAgICAgICAgbWFwTmFtZVRvVmFsdWUgPSBuZXcgSGFzaE1hcCgpOwogICAgICAgICAgICBtYXBWYWx1ZVRvTmFtZSA9IG5ldyBIYXNoTWFwKCk7CiAgICAgICAgfQogICAgfQoKICAgIHN0YXRpYyBjbGFzcyBUcmVlRW50aXR5TWFwIGV4dGVuZHMgTWFwSW50TWFwIHsKICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPlRyZWVFbnRpdHlNYXA8L2NvZGU+LgogICAgICAgICAqLwogICAgICAgIHB1YmxpYyBUcmVlRW50aXR5TWFwKCkgewogICAgICAgICAgICBtYXBOYW1lVG9WYWx1ZSA9IG5ldyBUcmVlTWFwKCk7CiAgICAgICAgICAgIG1hcFZhbHVlVG9OYW1lID0gbmV3IFRyZWVNYXAoKTsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGljIGNsYXNzIExvb2t1cEVudGl0eU1hcCBleHRlbmRzIFByaW1pdGl2ZUVudGl0eU1hcCB7CiAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBsb29rdXBUYWJsZTsKCiAgICAgICAgcHJpdmF0ZSBpbnQgTE9PS1VQX1RBQkxFX1NJWkUgPSAyNTY7CgogICAgICAgIC8qKgogICAgICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWUoaW50IHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZSA8IExPT0tVUF9UQUJMRV9TSVpFKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9va3VwVGFibGUoKVt2YWx1ZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm5hbWUodmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogPHA+CiAgICAgICAgICogUmV0dXJucyB0aGUgbG9va3VwIHRhYmxlIGZvciB0aGlzIGVudGl0eSBtYXAuIFRoZSBsb29rdXAgdGFibGUgaXMgY3JlYXRlZCBpZiBpdCBoYXMgbm90IGJlZW4gcHJldmlvdXNseS4KICAgICAgICAgKiA8L3A+CiAgICAgICAgICogCiAgICAgICAgICogQHJldHVybiB0aGUgbG9va3VwIHRhYmxlCiAgICAgICAgICovCiAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBsb29rdXBUYWJsZSgpIHsKICAgICAgICAgICAgaWYgKGxvb2t1cFRhYmxlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGNyZWF0ZUxvb2t1cFRhYmxlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxvb2t1cFRhYmxlOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogPHA+CiAgICAgICAgICogQ3JlYXRlcyBhbiBlbnRpdHkgbG9va3VwIHRhYmxlIG9mIExPT0tVUF9UQUJMRV9TSVpFIGVsZW1lbnRzLCBpbml0aWFsaXplZCB3aXRoIGVudGl0eSBuYW1lcy4KICAgICAgICAgKiA8L3A+CiAgICAgICAgICovCiAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUxvb2t1cFRhYmxlKCkgewogICAgICAgICAgICBsb29rdXBUYWJsZSA9IG5ldyBTdHJpbmdbTE9PS1VQX1RBQkxFX1NJWkVdOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IExPT0tVUF9UQUJMRV9TSVpFOyArK2kpIHsKICAgICAgICAgICAgICAgIGxvb2t1cFRhYmxlW2ldID0gc3VwZXIubmFtZShpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBzdGF0aWMgY2xhc3MgQXJyYXlFbnRpdHlNYXAgaW1wbGVtZW50cyBFbnRpdHlNYXAgewogICAgICAgIHByb3RlY3RlZCBpbnQgZ3Jvd0J5ID0gMTAwOwoKICAgICAgICBwcm90ZWN0ZWQgaW50IHNpemUgPSAwOwoKICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbmFtZXM7CgogICAgICAgIHByb3RlY3RlZCBpbnRbXSB2YWx1ZXM7CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+QXJyYXlFbnRpdHlNYXA8L2NvZGU+LgogICAgICAgICAqLwogICAgICAgIHB1YmxpYyBBcnJheUVudGl0eU1hcCgpIHsKICAgICAgICAgICAgbmFtZXMgPSBuZXcgU3RyaW5nW2dyb3dCeV07CiAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBpbnRbZ3Jvd0J5XTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+QXJyYXlFbnRpdHlNYXA8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIHNpemUgYnkgd2hpY2ggdGhlIGFycmF5IHNob3VsZAogICAgICAgICAqIGdyb3cuCiAgICAgICAgICogCiAgICAgICAgICogQHBhcmFtIGdyb3dCeQogICAgICAgICAqICAgICAgICAgICAgYXJyYXkgd2lsbCBiZSBpbml0aWFsaXplZCB0byBhbmQgd2lsbCBncm93IGJ5IHRoaXMgYW1vdW50CiAgICAgICAgICovCiAgICAgICAgcHVibGljIEFycmF5RW50aXR5TWFwKGludCBncm93QnkpIHsKICAgICAgICAgICAgdGhpcy5ncm93QnkgPSBncm93Qnk7CiAgICAgICAgICAgIG5hbWVzID0gbmV3IFN0cmluZ1tncm93QnldOwogICAgICAgICAgICB2YWx1ZXMgPSBuZXcgaW50W2dyb3dCeV07CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICAgICovCiAgICAgICAgcHVibGljIHZvaWQgYWRkKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKICAgICAgICAgICAgZW5zdXJlQ2FwYWNpdHkoc2l6ZSArIDEpOwogICAgICAgICAgICBuYW1lc1tzaXplXSA9IG5hbWU7CiAgICAgICAgICAgIHZhbHVlc1tzaXplXSA9IHZhbHVlOwogICAgICAgICAgICBzaXplKys7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBWZXJpZmllcyB0aGUgY2FwYWNpdHkgb2YgdGhlIGVudGl0eSBhcnJheSwgYWRqdXN0aW5nIHRoZSBzaXplIGlmIG5lY2Vzc2FyeS4KICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0gY2FwYWNpdHkKICAgICAgICAgKiAgICAgICAgICAgIHNpemUgdGhlIGFycmF5IHNob3VsZCBiZQogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCB2b2lkIGVuc3VyZUNhcGFjaXR5KGludCBjYXBhY2l0eSkgewogICAgICAgICAgICBpZiAoY2FwYWNpdHkgPiBuYW1lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGludCBuZXdTaXplID0gTWF0aC5tYXgoY2FwYWNpdHksIHNpemUgKyBncm93QnkpOwogICAgICAgICAgICAgICAgU3RyaW5nW10gbmV3TmFtZXMgPSBuZXcgU3RyaW5nW25ld1NpemVdOwogICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShuYW1lcywgMCwgbmV3TmFtZXMsIDAsIHNpemUpOwogICAgICAgICAgICAgICAgbmFtZXMgPSBuZXdOYW1lczsKICAgICAgICAgICAgICAgIGludFtdIG5ld1ZhbHVlcyA9IG5ldyBpbnRbbmV3U2l6ZV07CiAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHZhbHVlcywgMCwgbmV3VmFsdWVzLCAwLCBzaXplKTsKICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ld1ZhbHVlczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAgICAqLwogICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZShpbnQgdmFsdWUpIHsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gPT0gdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZXNbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICAgICovCiAgICAgICAgcHVibGljIGludCB2YWx1ZShTdHJpbmcgbmFtZSkgewogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgewogICAgICAgICAgICAgICAgaWYgKG5hbWVzW2ldLmVxdWFscyhuYW1lKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXNbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgIH0KCiAgICBzdGF0aWMgY2xhc3MgQmluYXJ5RW50aXR5TWFwIGV4dGVuZHMgQXJyYXlFbnRpdHlNYXAgewoKICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIDxjb2RlPkJpbmFyeUVudGl0eU1hcDwvY29kZT4uCiAgICAgICAgICovCiAgICAgICAgcHVibGljIEJpbmFyeUVudGl0eU1hcCgpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgPGNvZGU+QXJyYXlFbnRpdHlNYXA8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIHNpemUgYnkgd2hpY2ggdGhlIHVuZGVybHlpbmcgYXJyYXkKICAgICAgICAgKiBzaG91bGQgZ3Jvdy4KICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0gZ3Jvd0J5CiAgICAgICAgICogICAgICAgICAgICBhcnJheSB3aWxsIGJlIGluaXRpYWxpemVkIHRvIGFuZCB3aWxsIGdyb3cgYnkgdGhpcyBhbW91bnQKICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgQmluYXJ5RW50aXR5TWFwKGludCBncm93QnkpIHsKICAgICAgICAgICAgc3VwZXIoZ3Jvd0J5KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFBlcmZvcm1zIGEgYmluYXJ5IHNlYXJjaCBvZiB0aGUgZW50aXR5IGFycmF5IGZvciB0aGUgc3BlY2lmaWVkIGtleS4gVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gY29kZSBpbgogICAgICAgICAqIHtAbGluayBqYXZhLnV0aWwuQXJyYXlzfS4KICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0ga2V5CiAgICAgICAgICogICAgICAgICAgICB0aGUga2V5IHRvIGJlIGZvdW5kCiAgICAgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGVudGl0eSBhcnJheSBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIGtleQogICAgICAgICAqLwogICAgICAgIHByaXZhdGUgaW50IGJpbmFyeVNlYXJjaChpbnQga2V5KSB7CiAgICAgICAgICAgIGludCBsb3cgPSAwOwogICAgICAgICAgICBpbnQgaGlnaCA9IHNpemUgLSAxOwoKICAgICAgICAgICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgICAgICAgICAgICBpbnQgbWlkID0gKGxvdyArIGhpZ2gpID4+IDE7CiAgICAgICAgICAgICAgICBpbnQgbWlkVmFsID0gdmFsdWVzW21pZF07CgogICAgICAgICAgICAgICAgaWYgKG1pZFZhbCA8IGtleSkgewogICAgICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pZFZhbCA+IGtleSkgewogICAgICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQgLSAxOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWlkOyAvLyBrZXkgZm91bmQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gLShsb3cgKyAxKTsgLy8ga2V5IG5vdCBmb3VuZC4KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewogICAgICAgICAgICBlbnN1cmVDYXBhY2l0eShzaXplICsgMSk7CiAgICAgICAgICAgIGludCBpbnNlcnRBdCA9IGJpbmFyeVNlYXJjaCh2YWx1ZSk7CiAgICAgICAgICAgIGlmIChpbnNlcnRBdCA+IDApIHsKICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm90ZTogdGhpcyBtZWFucyB5b3UgY2FuJ3QgaW5zZXJ0IHRoZSBzYW1lIHZhbHVlIHR3aWNlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5zZXJ0QXQgPSAtKGluc2VydEF0ICsgMSk7IC8vIGJpbmFyeVNlYXJjaCByZXR1cm5zIGl0IG5lZ2F0aXZlIGFuZCBvZmYtYnktb25lCiAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodmFsdWVzLCBpbnNlcnRBdCwgdmFsdWVzLCBpbnNlcnRBdCArIDEsIHNpemUgLSBpbnNlcnRBdCk7CiAgICAgICAgICAgIHZhbHVlc1tpbnNlcnRBdF0gPSB2YWx1ZTsKICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShuYW1lcywgaW5zZXJ0QXQsIG5hbWVzLCBpbnNlcnRBdCArIDEsIHNpemUgLSBpbnNlcnRBdCk7CiAgICAgICAgICAgIG5hbWVzW2luc2VydEF0XSA9IG5hbWU7CiAgICAgICAgICAgIHNpemUrKzsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWUoaW50IHZhbHVlKSB7CiAgICAgICAgICAgIGludCBpbmRleCA9IGJpbmFyeVNlYXJjaCh2YWx1ZSk7CiAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuYW1lc1tpbmRleF07CiAgICAgICAgfQogICAgfQoKICAgIC8vIHBhY2thZ2Ugc2NvcGVkIGZvciB0ZXN0aW5nCiAgICBFbnRpdHlNYXAgbWFwID0gbmV3IEVudGl0aWVzLkxvb2t1cEVudGl0eU1hcCgpOwoKICAgIC8qKgogICAgICogPHA+CiAgICAgKiBBZGRzIGVudGl0aWVzIHRvIHRoaXMgZW50aXR5LgogICAgICogPC9wPgogICAgICogCiAgICAgKiBAcGFyYW0gZW50aXR5QXJyYXkKICAgICAqICAgICAgICAgICAgYXJyYXkgb2YgZW50aXRpZXMgdG8gYmUgYWRkZWQKICAgICAqLwogICAgcHVibGljIHZvaWQgYWRkRW50aXRpZXMoU3RyaW5nW11bXSBlbnRpdHlBcnJheSkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50aXR5QXJyYXkubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgYWRkRW50aXR5KGVudGl0eUFycmF5W2ldWzBdLCBJbnRlZ2VyLnBhcnNlSW50KGVudGl0eUFycmF5W2ldWzFdKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogPHA+CiAgICAgKiBBZGQgYW4gZW50aXR5IHRvIHRoaXMgZW50aXR5LgogICAgICogPC9wPgogICAgICogCiAgICAgKiBAcGFyYW0gbmFtZQogICAgICogICAgICAgICAgICBuYW1lIG9mIHRoZSBlbnRpdHkKICAgICAqIEBwYXJhbSB2YWx1ZQogICAgICogICAgICAgICAgICB2YWxlIG9mIHRoZSBlbnRpdHkKICAgICAqLwogICAgcHVibGljIHZvaWQgYWRkRW50aXR5KFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKICAgICAgICBtYXAuYWRkKG5hbWUsIHZhbHVlKTsKICAgIH0KCiAgICAvKioKICAgICAqIDxwPgogICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZW50aXR5IGlkZW50aWZpZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAqIDwvcD4KICAgICAqIAogICAgICogQHBhcmFtIHZhbHVlCiAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBsb2NhdGUKICAgICAqIEByZXR1cm4gZW50aXR5IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUKICAgICAqLwogICAgcHVibGljIFN0cmluZyBlbnRpdHlOYW1lKGludCB2YWx1ZSkgewogICAgICAgIHJldHVybiBtYXAubmFtZSh2YWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiA8cD4KICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBlbnRpdHkgaWRlbnRpZmllZCBieSB0aGUgc3BlY2lmaWVkIG5hbWUuCiAgICAgKiA8L3A+CiAgICAgKiAKICAgICAqIEBwYXJhbSBuYW1lCiAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIHRvIGxvY2F0ZQogICAgICogQHJldHVybiBlbnRpdHkgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQogICAgICovCiAgICBwdWJsaWMgaW50IGVudGl0eVZhbHVlKFN0cmluZyBuYW1lKSB7CiAgICAgICAgcmV0dXJuIG1hcC52YWx1ZShuYW1lKTsKICAgIH0KCiAgICAvKioKICAgICAqIDxwPgogICAgICogRXNjYXBlcyB0aGUgY2hhcmFjdGVycyBpbiBhIDxjb2RlPlN0cmluZzwvY29kZT4uCiAgICAgKiA8L3A+CiAgICAgKiAKICAgICAqIDxwPgogICAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGNhbGxlZCBhZGRFbnRpdHkoJnF1b3Q7Zm9vJnF1b3Q7LCAweEExKSwgZXNjYXBlKCZxdW90O1x1MDBBMSZxdW90Oykgd2lsbCByZXR1cm4KICAgICAqICZxdW90OyZhbXA7Zm9vOyZxdW90OwogICAgICogPC9wPgogICAgICogCiAgICAgKiBAcGFyYW0gc3RyCiAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGVzY2FwZS4KICAgICAqIEByZXR1cm4gQSBuZXcgZXNjYXBlZCA8Y29kZT5TdHJpbmc8L2NvZGU+LgogICAgICovCiAgICBwdWJsaWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgc3RyKSB7CiAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IGNyZWF0ZVN0cmluZ1dyaXRlcihzdHIpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRoaXMuZXNjYXBlKHN0cmluZ1dyaXRlciwgc3RyKTsKICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBiZWNhdXNlIEFMTCB0aGUgU3RyaW5nV3JpdGVyIG1ldGhvZHMgY2FsbGVkIGJ5ICNlc2NhcGUoV3JpdGVyLCBTdHJpbmcpIGRvIG5vdAogICAgICAgICAgICAvLyB0aHJvdyBJT0V4Y2VwdGlvbnMuCiAgICAgICAgICAgIHRocm93IG5ldyBVbmhhbmRsZWRFeGNlcHRpb24oZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKICAgIH0KCiAgICAvKioKICAgICAqIDxwPgogICAgICogRXNjYXBlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBwYXNzZWQgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IHRvIHRoZSA8Y29kZT5Xcml0ZXI8L2NvZGU+CiAgICAgKiBwYXNzZWQuCiAgICAgKiA8L3A+CiAgICAgKiAKICAgICAqIEBwYXJhbSB3cml0ZXIKICAgICAqICAgICAgICAgICAgVGhlIDxjb2RlPldyaXRlcjwvY29kZT4gdG8gd3JpdGUgdGhlIHJlc3VsdHMgb2YgdGhlIGVzY2FwaW5nIHRvLiBBc3N1bWVkIHRvIGJlIGEgbm9uLW51bGwgdmFsdWUuCiAgICAgKiBAcGFyYW0gc3RyCiAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGVzY2FwZS4gQXNzdW1lZCB0byBiZSBhIG5vbi1udWxsIHZhbHVlLgogICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgd2hlbiA8Y29kZT5Xcml0ZXI8L2NvZGU+IHBhc3NlZCB0aHJvd3MgdGhlIGV4Y2VwdGlvbiBmcm9tIGNhbGxzIHRvIHRoZSB7QGxpbmsgV3JpdGVyI3dyaXRlKGludCl9CiAgICAgKiAgICAgICAgICAgICBtZXRob2RzLgogICAgICogCiAgICAgKiBAc2VlICNlc2NhcGUoU3RyaW5nKQogICAgICogQHNlZSBXcml0ZXIKICAgICAqLwogICAgcHVibGljIHZvaWQgZXNjYXBlKFdyaXRlciB3cml0ZXIsIFN0cmluZyBzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgaW50IGxlbiA9IHN0ci5sZW5ndGgoKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGNoYXIgYyA9IHN0ci5jaGFyQXQoaSk7CiAgICAgICAgICAgIFN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5lbnRpdHlOYW1lKGMpOwogICAgICAgICAgICBpZiAoZW50aXR5TmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAoYyA+IDB4N0YpIHsKICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiYjIik7CiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKEludGVnZXIudG9TdHJpbmcoYywgMTApKTsKICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoJzsnKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCcmJyk7CiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoZW50aXR5TmFtZSk7CiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoJzsnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIDxwPgogICAgICogVW5lc2NhcGVzIHRoZSBlbnRpdGllcyBpbiBhIDxjb2RlPlN0cmluZzwvY29kZT4uCiAgICAgKiA8L3A+CiAgICAgKiAKICAgICAqIDxwPgogICAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGNhbGxlZCBhZGRFbnRpdHkoJnF1b3Q7Zm9vJnF1b3Q7LCAweEExKSwgdW5lc2NhcGUoJnF1b3Q7JmFtcDtmb287JnF1b3Q7KSB3aWxsIHJldHVybgogICAgICogJnF1b3Q7XHUwMEExJnF1b3Q7CiAgICAgKiA8L3A+CiAgICAgKiAKICAgICAqIEBwYXJhbSBzdHIKICAgICAqICAgICAgICAgICAgVGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gZXNjYXBlLgogICAgICogQHJldHVybiBBIG5ldyBlc2NhcGVkIDxjb2RlPlN0cmluZzwvY29kZT4uCiAgICAgKi8KICAgIHB1YmxpYyBTdHJpbmcgdW5lc2NhcGUoU3RyaW5nIHN0cikgewogICAgICAgIGludCBmaXJzdEFtcCA9IHN0ci5pbmRleE9mKCcmJyk7CiAgICAgICAgaWYgKGZpcnN0QW1wIDwgMCkgewogICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBjcmVhdGVTdHJpbmdXcml0ZXIoc3RyKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHRoaXMuZG9VbmVzY2FwZShzdHJpbmdXcml0ZXIsIHN0ciwgZmlyc3RBbXApOwogICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gYmVjYXVzZSBBTEwgdGhlIFN0cmluZ1dyaXRlciBtZXRob2RzIGNhbGxlZCBieSAjZXNjYXBlKFdyaXRlciwgU3RyaW5nKSAKICAgICAgICAgICAgICAgIC8vIGRvIG5vdCB0aHJvdyBJT0V4Y2VwdGlvbnMuCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5oYW5kbGVkRXhjZXB0aW9uKGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBNYWtlIHRoZSBTdHJpbmdXcml0ZXIgMTAlIGxhcmdlciB0aGFuIHRoZSBzb3VyY2UgU3RyaW5nIHRvIGF2b2lkIGdyb3dpbmcgdGhlIHdyaXRlcgogICAgICoKICAgICAqIEBwYXJhbSBzdHIgVGhlIHNvdXJjZSBzdHJpbmcKICAgICAqIEByZXR1cm4gQSBuZXdseSBjcmVhdGVkIFN0cmluZ1dyaXRlcgogICAgICovCiAgICBwcml2YXRlIFN0cmluZ1dyaXRlciBjcmVhdGVTdHJpbmdXcml0ZXIoU3RyaW5nIHN0cikgewogICAgICAgIHJldHVybiBuZXcgU3RyaW5nV3JpdGVyKChpbnQpIChzdHIubGVuZ3RoKCkgKyAoc3RyLmxlbmd0aCgpICogMC4xKSkpOwogICAgfQoKICAgIC8qKgogICAgICogPHA+CiAgICAgKiBVbmVzY2FwZXMgdGhlIGVzY2FwZWQgZW50aXRpZXMgaW4gdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gcGFzc2VkIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byB0aGUKICAgICAqIDxjb2RlPldyaXRlcjwvY29kZT4gcGFzc2VkLgogICAgICogPC9wPgogICAgICogCiAgICAgKiBAcGFyYW0gd3JpdGVyCiAgICAgKiAgICAgICAgICAgIFRoZSA8Y29kZT5Xcml0ZXI8L2NvZGU+IHRvIHdyaXRlIHRoZSByZXN1bHRzIHRvOyBhc3N1bWVkIHRvIGJlIG5vbi1udWxsLgogICAgICogQHBhcmFtIHN0cgogICAgICogICAgICAgICAgICBUaGUgc291cmNlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gdW5lc2NhcGU7IGFzc3VtZWQgdG8gYmUgbm9uLW51bGwuCiAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPldyaXRlcjwvY29kZT4gcGFzc2VkIHRocm93cyB0aGUgZXhjZXB0aW9uIGZyb20gY2FsbHMgdG8gdGhlIHtAbGluayBXcml0ZXIjd3JpdGUoaW50KX0KICAgICAqICAgICAgICAgICAgIG1ldGhvZHMuCiAgICAgKiAKICAgICAqIEBzZWUgI2VzY2FwZShTdHJpbmcpCiAgICAgKiBAc2VlIFdyaXRlcgogICAgICovCiAgICBwdWJsaWMgdm9pZCB1bmVzY2FwZShXcml0ZXIgd3JpdGVyLCBTdHJpbmcgc3RyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIGludCBmaXJzdEFtcCA9IHN0ci5pbmRleE9mKCcmJyk7CiAgICAgICAgaWYgKGZpcnN0QW1wIDwgMCkgewogICAgICAgICAgICB3cml0ZXIud3JpdGUoc3RyKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRvVW5lc2NhcGUod3JpdGVyLCBzdHIsIGZpcnN0QW1wKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBVbmRlcmx5aW5nIHVuZXNjYXBlIG1ldGhvZCB0aGF0IGFsbG93cyB0aGUgb3B0aW1pc2F0aW9uIG9mIG5vdCBzdGFydGluZyBmcm9tIHRoZSAwIGluZGV4IGFnYWluLgogICAgICoKICAgICAqIEBwYXJhbSB3cml0ZXIKICAgICAqICAgICAgICAgICAgVGhlIDxjb2RlPldyaXRlcjwvY29kZT4gdG8gd3JpdGUgdGhlIHJlc3VsdHMgdG87IGFzc3VtZWQgdG8gYmUgbm9uLW51bGwuCiAgICAgKiBAcGFyYW0gc3RyCiAgICAgKiAgICAgICAgICAgIFRoZSBzb3VyY2UgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byB1bmVzY2FwZTsgYXNzdW1lZCB0byBiZSBub24tbnVsbC4KICAgICAqIEBwYXJhbSBmaXJzdEFtcAogICAgICogICAgICAgICAgICBUaGUgPGNvZGU+aW50PC9jb2RlPiBpbmRleCBvZiB0aGUgZmlyc3QgYW1wZXJzYW5kIGluIHRoZSBzb3VyY2UgU3RyaW5nLgogICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICogICAgICAgICAgICAgd2hlbiA8Y29kZT5Xcml0ZXI8L2NvZGU+IHBhc3NlZCB0aHJvd3MgdGhlIGV4Y2VwdGlvbiBmcm9tIGNhbGxzIHRvIHRoZSB7QGxpbmsgV3JpdGVyI3dyaXRlKGludCl9CiAgICAgKiAgICAgICAgICAgICBtZXRob2RzLgogICAgICovCiAgICBwcml2YXRlIHZvaWQgZG9VbmVzY2FwZShXcml0ZXIgd3JpdGVyLCBTdHJpbmcgc3RyLCBpbnQgZmlyc3RBbXApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgd3JpdGVyLndyaXRlKHN0ciwgMCwgZmlyc3RBbXApOwogICAgICAgIGludCBsZW4gPSBzdHIubGVuZ3RoKCk7CiAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0QW1wOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgY2hhciBjID0gc3RyLmNoYXJBdChpKTsKICAgICAgICAgICAgaWYgKGMgPT0gJyYnKSB7CiAgICAgICAgICAgICAgICBpbnQgbmV4dElkeCA9IGkgKyAxOwogICAgICAgICAgICAgICAgaW50IHNlbWlDb2xvbklkeCA9IHN0ci5pbmRleE9mKCc7JywgbmV4dElkeCk7CiAgICAgICAgICAgICAgICBpZiAoc2VtaUNvbG9uSWR4ID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGMpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW50IGFtcGhlcnNhbmRJZHggPSBzdHIuaW5kZXhPZignJicsIGkgKyAxKTsKICAgICAgICAgICAgICAgIGlmIChhbXBoZXJzYW5kSWR4ICE9IC0xICYmIGFtcGhlcnNhbmRJZHggPCBzZW1pQ29sb25JZHgpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGVuIHRoZSB0ZXh0IGxvb2tzIGxpa2UgJi4uLiYuLi47CiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGMpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgU3RyaW5nIGVudGl0eUNvbnRlbnQgPSBzdHIuc3Vic3RyaW5nKG5leHRJZHgsIHNlbWlDb2xvbklkeCk7CiAgICAgICAgICAgICAgICBpbnQgZW50aXR5VmFsdWUgPSAtMTsKICAgICAgICAgICAgICAgIGludCBlbnRpdHlDb250ZW50TGVuID0gZW50aXR5Q29udGVudC5sZW5ndGgoKTsKICAgICAgICAgICAgICAgIGlmIChlbnRpdHlDb250ZW50TGVuID4gMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdHlDb250ZW50LmNoYXJBdCgwKSA9PSAnIycpIHsgLy8gZXNjYXBlZCB2YWx1ZSBjb250ZW50IGlzIGFuIGludGVnZXIgKGRlY2ltYWwgb3IKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGV4aWRlY2ltYWwpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdHlDb250ZW50TGVuID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBpc0hleENoYXIgPSBlbnRpdHlDb250ZW50LmNoYXJBdCgxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpc0hleENoYXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnWCcgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JyA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVZhbHVlID0gSW50ZWdlci5wYXJzZUludChlbnRpdHlDb250ZW50LnN1YnN0cmluZygyKSwgMTYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVZhbHVlID0gSW50ZWdlci5wYXJzZUludChlbnRpdHlDb250ZW50LnN1YnN0cmluZygxKSwgMTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdHlWYWx1ZSA+IDB4RkZGRikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlWYWx1ZSA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5VmFsdWUgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGVzY2FwZWQgdmFsdWUgY29udGVudCBpcyBhbiBlbnRpdHkgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlWYWx1ZSA9IHRoaXMuZW50aXR5VmFsdWUoZW50aXR5Q29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChlbnRpdHlWYWx1ZSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgnJicpOwogICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShlbnRpdHlDb250ZW50KTsKICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoJzsnKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGVudGl0eVZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGkgPSBzZW1pQ29sb25JZHg7IC8vIG1vdmUgaW5kZXggdXAgdG8gdGhlIHNlbWktY29sb24KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShjKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCn0K