PCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBDRiBNVVNJQyBQTEFZRVIg4oCUIFBhc3RlIGVudGlyZSBibG9jayBpbnRvIFNhbGllbnQKICAgICBDdXN0b20gSFRNTCBibG9jayAoQXBwZWFyYW5jZSA+IFdpZGdldHMsIG9yIFBhZ2UgQnVpbGRlcikKCiAgICAg4pqgIElNUE9SVEFOVCDigJQgUkVBRCBUSElTIEZJUlNUOgogICAgIEdvb2dsZSBEcml2ZSBsaW5rcyBvZnRlbiBibG9jayBicm93c2VyIGF1ZGlvIHBsYXliYWNrCiAgICAgZHVlIHRvIENPUlMgcmVzdHJpY3Rpb25zLiBJZiB0aGUgcGxheWVyIGxvYWRzIGJ1dAogICAgIHByb2R1Y2VzIG5vIHNvdW5kLCB1cGxvYWQgeW91ciBNUDMgdG8geW91ciBXb3JkUHJlc3MKICAgICBNZWRpYSBMaWJyYXJ5IGluc3RlYWQgYW5kIHN3YXAgaW4gdGhhdCBVUkwuCgogICAgIFFVSUNLLUNIQU5HRSBHVUlERSAoc2VhcmNoIGZvciDihpAgc3ltYm9scyk6CiAgICAgMS4gTVAzIFVSTCAgICAg4oaSIGluc2lkZSA8c291cmNlIHNyYz0iLi4uIj4KICAgICAyLiBTb25nIHRpdGxlICDihpIgaW5zaWRlIDxwIGNsYXNzPSJjZm1wLXRpdGxlIj4KICAgICAzLiBBcnRpc3QgbmFtZSDihpIgaW5zaWRlIDxwIGNsYXNzPSJjZm1wLWFydGlzdCI+CiAgICAgNC4gRG90IGNvbG9yICAg4oaSIC0tY2ZtcC1hY2NlbnQgQ1NTIHZhcmlhYmxlCiAgICAgNS4gVGV4dCBjb2xvciAg4oaSIC0tY2ZtcC10ZXh0IENTUyB2YXJpYWJsZQogICAgIDYuIEJ1dHRvbiBzaXplIOKGkiAuY2ZtcC1idG4tcHJldi9uZXh0L3BsYXkgc3ZnIHNpemVzCiAgICAgNy4gQmFyIGhlaWdodCAg4oaSIC5jZm1wLXRyYWNrIGhlaWdodCB2YWx1ZQogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KCgo8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgU0VDVElPTiAxIOKAlCBTVFlMRVMKICAgICBBbGwgdmlzdWFsIGRlc2lnbiBsaXZlcyBoZXJlLiBTYWZlIHRvIGVkaXQgYW55dGhpbmcKICAgICBiZXR3ZWVuIHRoZSA8c3R5bGU+IHRhZ3MuCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CjxzdHlsZT4KCiAgLyog4pSA4pSAIFJPT1QgQ09OVEFJTkVSIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgIFRoZSBvdXRlciB3cmFwcGVyIGZvciB0aGUgZW50aXJlIHBsYXllci4KICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCBtZWFucyB0aGUgU2FsaWVudCBzZWN0aW9uCiAgICAgYmFja2dyb3VuZCBjb2xvciAvIGltYWdlIHdpbGwgc2hvdyB0aHJvdWdoLiAgICAgICAgICAgICovCiAgLmNmbXAtcm9vdCB7CgogICAgLyogQ09MT1IgVE9LRU5TIOKAlCBjaGFuZ2UgdGhlc2UgdG8gcmVzdHlsZSB0aGUgcGxheWVyIHF1aWNrbHkgKi8KICAgIC0tY2ZtcC1hY2NlbnQgIDogI2UwMzAzMDsgICAgICAgICAgICAgIC8qIOKGkCBzY3J1YmJlciBkb3QgY29sb3IgKHJlZCkgICAgICovCiAgICAtLWNmbXAtdGV4dCAgICA6IHJnYmEoMjU1LDI1NSwyNTUsMC45NSk7IC8qIOKGkCB0aXRsZSAvIGJ1dHRvbiBjb2xvciAod2hpdGUpICovCiAgICAtLWNmbXAtc3VidGV4dCA6IHJnYmEoMjU1LDI1NSwyNTUsMC42KTsgIC8qIOKGkCBhcnRpc3QgLyB0aW1lIGNvbG9yIChkaW0pICAgKi8KICAgIC0tY2ZtcC10cmFjayAgIDogcmdiYSgyNTUsMjU1LDI1NSwwLjIyKTsgLyog4oaQIGVtcHR5IHNjcnViYmVyIGJhciBjb2xvciAgICAgKi8KICAgIC0tY2ZtcC1maWxsICAgIDogcmdiYSgyNTUsMjU1LDI1NSwwLjg1KTsgLyog4oaQIHBsYXllZCBwb3J0aW9uIGJhciBjb2xvciAgICAgKi8KCiAgICBiYWNrZ3JvdW5kICAgIDogdHJhbnNwYXJlbnQ7ICAgIC8qIOKGkCBwYWdlIGJhY2tncm91bmQgc2hvd3MgdGhyb3VnaCAqLwogICAgYm9yZGVyLXJhZGl1cyA6IDIwcHg7ICAgICAgICAgICAvKiByb3VuZGVkIGNvcm5lcnMgb24gdGhlIHBsYXllciAgICAqLwogICAgbWF4LXdpZHRoICAgICA6IDQ4MHB4OyAgICAgICAgICAvKiBwbGF5ZXIgd29uJ3QgZ3JvdyB3aWRlciB0aGFuIHRoaXMgKi8KICAgIG1hcmdpbiAgICAgICAgOiAwIGF1dG87ICAgICAgICAgLyogY2VudGVyIGl0IGhvcml6b250YWxseSAgICAgICAgICAgKi8KICAgIGZvbnQtZmFtaWx5ICAgOiAtYXBwbGUtc3lzdGVtLCAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjsKCiAgICAvKiBwcmV2ZW50IHRleHQgc2VsZWN0aW9uIHdoZW4gY2xpY2tpbmcgYnV0dG9ucyAqLwogICAgLXdlYmtpdC11c2VyLXNlbGVjdCA6IG5vbmU7CiAgICB1c2VyLXNlbGVjdCAgICAgICAgIDogbm9uZTsKICB9CgoKICAvKiDilIDilIAgSU5ORVIgUEFERElORyBXUkFQUEVSIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgIENvbnRyb2xzIHRoZSBzcGFjZSBpbnNpZGUgdGhlIHBsYXllciBlZGdlcy4gICAgICAgICAgICAgKi8KICAuY2ZtcC1ib2R5IHsKICAgIHBhZGRpbmcgOiAzMnB4IDI4cHggMjZweDsgLyogdG9wIHwgbGVmdCtyaWdodCB8IGJvdHRvbSAqLwogIH0KCgogIC8qIOKUgOKUgCBTT05HIElORk8gKFRpdGxlICsgQXJ0aXN0KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICBDZW50ZXJlZCB0ZXh0IGJsb2NrIGFib3ZlIHRoZSBjb250cm9scy4gICAgICAgICAgICAgICAgICovCiAgLmNmbXAtaW5mbyB7CiAgICB0ZXh0LWFsaWduICAgIDogY2VudGVyOwogICAgbWFyZ2luLWJvdHRvbSA6IDI0cHg7ICAgLyogZ2FwIGJldHdlZW4gaW5mbyBhbmQgYnV0dG9ucyAqLwogIH0KCiAgLyogU29uZyB0aXRsZSDigJQgbGFyZ2UgYW5kIGJvbGQgKi8KICAuY2ZtcC10aXRsZSB7CiAgICBjb2xvciAgICAgICAgOiB2YXIoLS1jZm1wLXRleHQpOwogICAgZm9udC1zaXplICAgIDogMTdweDsKICAgIGZvbnQtd2VpZ2h0ICA6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICBtYXJnaW4gICAgICAgOiAwIDAgNXB4IDA7CiAgICBsaW5lLWhlaWdodCAgOiAxLjM7CiAgICAvKiB0ZXh0LXNoYWRvdyBrZWVwcyB3aGl0ZSB0ZXh0IHJlYWRhYmxlIG9uIGxpZ2h0IHBhZ2UgYmdzICovCiAgICB0ZXh0LXNoYWRvdyAgOiAwIDFweCA4cHggcmdiYSgwLDAsMCwwLjQ1KTsKICB9CgogIC8qIEFydGlzdCBuYW1lIOKAlCBzbWFsbCwgdXBwZXJjYXNlLCBkaW1tZXIgKi8KICAuY2ZtcC1hcnRpc3QgewogICAgY29sb3IgICAgICAgICAgOiB2YXIoLS1jZm1wLXN1YnRleHQpOwogICAgZm9udC1zaXplICAgICAgOiAxMnB4OwogICAgbGV0dGVyLXNwYWNpbmcgOiAwLjEyZW07CiAgICB0ZXh0LXRyYW5zZm9ybSA6IHVwcGVyY2FzZTsKICAgIG1hcmdpbiAgICAgICAgIDogMDsKICAgIHRleHQtc2hhZG93ICAgIDogMCAxcHggNHB4IHJnYmEoMCwwLDAsMC4zNSk7CiAgfQoKCiAgLyog4pSA4pSAIENPTlRST0wgQlVUVE9OUyBST1cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgRmxleCByb3c6IFvil4Til4RdICAgW+KWtl0gICBb4pa64pa6XQogICAgIENoYW5nZSBnYXAgdG8gc3ByZWFkIGJ1dHRvbnMgZnVydGhlciBhcGFydC4gICAgICAgICAgICAgKi8KICAuY2ZtcC1jb250cm9scyB7CiAgICBkaXNwbGF5ICAgICAgICAgOiBmbGV4OwogICAgYWxpZ24taXRlbXMgICAgIDogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50IDogY2VudGVyOwogICAgZ2FwICAgICAgICAgICAgIDogNDRweDsgICAgLyog4oaQIHNwYWNlIGJldHdlZW4gYnV0dG9ucyAqLwogICAgbWFyZ2luLWJvdHRvbSAgIDogMjRweDsgICAgLyogZ2FwIGJldHdlZW4gYnV0dG9ucyBhbmQgc2NydWJiZXIgKi8KICB9CgogIC8qIFNoYXJlZCBiYXNlIHN0eWxlIGZvciBhbGwgdGhyZWUgYnV0dG9ucyAqLwogIC5jZm1wLWJ0biB7CiAgICBiYWNrZ3JvdW5kICAgICAgICAgICAgICAgOiBub25lOwogICAgYm9yZGVyICAgICAgICAgICAgICAgICAgIDogbm9uZTsKICAgIHBhZGRpbmcgICAgICAgICAgICAgICAgICA6IDZweDsKICAgIGN1cnNvciAgICAgICAgICAgICAgICAgICA6IHBvaW50ZXI7CiAgICBjb2xvciAgICAgICAgICAgICAgICAgICAgOiByZ2JhKDI1NSwyNTUsMjU1LDAuODgpOyAvKiBidXR0b24gaWNvbiBjb2xvciAqLwogICAgZGlzcGxheSAgICAgICAgICAgICAgICAgIDogZmxleDsKICAgIGFsaWduLWl0ZW1zICAgICAgICAgICAgICA6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudCAgICAgICAgICA6IGNlbnRlcjsKICAgIHRyYW5zaXRpb24gICAgICAgICAgICAgICA6IGNvbG9yIDAuMTVzIGVhc2UsIHRyYW5zZm9ybSAwLjE1cyBlYXNlOwogICAgb3V0bGluZSAgICAgICAgICAgICAgICAgIDogbm9uZTsKICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7IC8qIHJlbW92ZXMgYmx1ZSBmbGFzaCBvbiBtb2JpbGUgKi8KICAgIC8qIGRyb3Atc2hhZG93IGtlZXBzIHdoaXRlIGljb25zIHZpc2libGUgb24gd2hpdGUgcGFnZSBiZ3MgKi8KICAgIGZpbHRlciAgICAgICAgICAgICAgICAgICA6IGRyb3Atc2hhZG93KDAgMXB4IDVweCByZ2JhKDAsMCwwLDAuNDUpKTsKICB9CgogIC8qIEhvdmVyOiBicmlnaHRlciB3aGl0ZSArIHNsaWdodCBzY2FsZS11cCAqLwogIC5jZm1wLWJ0bjpob3ZlciB7CiAgICBjb2xvciAgICAgOiAjZmZmOwogICAgdHJhbnNmb3JtIDogc2NhbGUoMS4xMik7CiAgfQoKICAuY2ZtcC1idG4gc3ZnIHsKICAgIGRpc3BsYXkgOiBibG9jazsKICAgIGZpbGwgICAgOiBjdXJyZW50Q29sb3I7CiAgfQoKICAvKiBQcmV2IGFuZCBOZXh0IGljb24gc2l6ZSAqLwogIC5jZm1wLWJ0bi1wcmV2IHN2ZywKICAuY2ZtcC1idG4tbmV4dCBzdmcgewogICAgd2lkdGggIDogMjJweDsgIC8qIOKGkCBjaGFuZ2UgaWNvbiBzaXplIGhlcmUgKi8KICAgIGhlaWdodCA6IDIycHg7CiAgfQoKICAvKiBQbGF5L1BhdXNlIGljb24gaXMgaW50ZW50aW9uYWxseSBsYXJnZXIgdGhhbiBwcmV2L25leHQgKi8KICAuY2ZtcC1idG4tcGxheSBzdmcgewogICAgd2lkdGggIDogMzBweDsgIC8qIOKGkCBjaGFuZ2UgcGxheSBpY29uIHNpemUgaGVyZSAqLwogICAgaGVpZ2h0IDogMzBweDsKICB9CgoKICAvKiDilIDilIAgU0NSVUJCRVIgLyBQUk9HUkVTUyBCQVIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgVGFsbCBjbGljay9kcmFnIGFyZWEgd2l0aCBhIHRoaW4gdmlzdWFsIHRyYWNrIGluc2lkZS4gICAqLwogIC5jZm1wLXNjcnViYmVyIHsKICAgIHBvc2l0aW9uICAgICAgICAgICAgICAgICAgIDogcmVsYXRpdmU7CiAgICBoZWlnaHQgICAgICAgICAgICAgICAgICAgICA6IDI0cHg7ICAgICAvKiB0YWxsIGZvciBlYXN5IHRvdWNoIHRhcmdldHMgKi8KICAgIGRpc3BsYXkgICAgICAgICAgICAgICAgICAgIDogZmxleDsKICAgIGFsaWduLWl0ZW1zICAgICAgICAgICAgICAgIDogY2VudGVyOwogICAgY3Vyc29yICAgICAgICAgICAgICAgICAgICAgOiBwb2ludGVyOwogICAgbWFyZ2luLWJvdHRvbSAgICAgICAgICAgICAgOiAxMHB4OyAgICAgLyogZ2FwIGJlbG93IHNjcnViYmVyIGJlZm9yZSB0aW1lICovCiAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogIH0KCiAgLyogVGhlIHRoaW4gYmFja2dyb3VuZCBsaW5lICovCiAgLmNmbXAtdHJhY2sgewogICAgcG9zaXRpb24gICAgICA6IHJlbGF0aXZlOwogICAgd2lkdGggICAgICAgICA6IDEwMCU7CiAgICBoZWlnaHQgICAgICAgIDogMnB4OyAgICAgICAgIC8qIOKGkCBjaGFuZ2UgdG8gM3B4IG9yIDRweCBmb3IgYSB0aGlja2VyIGJhciAqLwogICAgYmFja2dyb3VuZCAgICA6IHZhcigtLWNmbXAtdHJhY2spOwogICAgYm9yZGVyLXJhZGl1cyA6IDJweDsKICB9CgogIC8qIFdoaXRlIHBvcnRpb24gdGhhdCBncm93cyBhcyB0aGUgc29uZyBwbGF5cyAoSlMgc2V0cyB3aWR0aCkgKi8KICAuY2ZtcC1maWxsIHsKICAgIHBvc2l0aW9uICAgICAgOiBhYnNvbHV0ZTsKICAgIHRvcCAgICAgICAgICAgOiAwOwogICAgbGVmdCAgICAgICAgICA6IDA7CiAgICBoZWlnaHQgICAgICAgIDogMTAwJTsKICAgIHdpZHRoICAgICAgICAgOiAwJTsgICAgICAgICAgLyogc3RhcnRzIGF0IDAsIEpTIHVwZGF0ZXMgY29udGludW91c2x5ICovCiAgICBiYWNrZ3JvdW5kICAgIDogdmFyKC0tY2ZtcC1maWxsKTsKICAgIGJvcmRlci1yYWRpdXMgOiAycHg7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsgICAgICAgIC8qIHNvIGl0IGRvZXNuJ3QgYmxvY2sgY2xpY2sgZXZlbnRzICovCiAgfQoKICAvKiBUaGUgY29sb3JlZCBjaXJjbGUgaGFuZGxlIG9uIHRoZSBzY3J1YmJlciAqLwogIC5jZm1wLWhhbmRsZSB7CiAgICBwb3NpdGlvbiAgICAgIDogYWJzb2x1dGU7CiAgICB0b3AgICAgICAgICAgIDogNTAlOwogICAgbGVmdCAgICAgICAgICA6IDAlOyAgICAgICAgICAvKiBKUyB1cGRhdGVzIHRoaXMgYXMgc29uZyBwbGF5cyAqLwogICAgdHJhbnNmb3JtICAgICA6IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIHdpZHRoICAgICAgICAgOiAxM3B4OyAgICAgICAgLyog4oaQIGNoYW5nZSBkb3Qgc2l6ZSBoZXJlICovCiAgICBoZWlnaHQgICAgICAgIDogMTNweDsKICAgIGJhY2tncm91bmQgICAgOiB2YXIoLS1jZm1wLWFjY2VudCk7ICAvKiB1c2VzIC0tY2ZtcC1hY2NlbnQgY29sb3IgdG9rZW4gYWJvdmUgKi8KICAgIGJvcmRlci1yYWRpdXMgOiA1MCU7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaGFkb3cgICAgOiAwIDAgOHB4IHJnYmEoMjI0LDQ4LDQ4LDAuNTUpOyAgLyogc29mdCBnbG93IGFyb3VuZCBkb3QgKi8KICB9CgoKICAvKiDilIDilIAgVElNRSBESVNQTEFZIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgIFR3byB0aW1lc3RhbXBzOiBjdXJyZW50IHRpbWUgKGxlZnQpIGFuZCB0b3RhbCAocmlnaHQpLiAgKi8KICAuY2ZtcC10aW1lIHsKICAgIGRpc3BsYXkgICAgICAgICAgICAgIDogZmxleDsKICAgIGp1c3RpZnktY29udGVudCAgICAgIDogc3BhY2UtYmV0d2VlbjsgLyogcHVzaGVzIGN1cnJlbnQgbGVmdCwgdG90YWwgcmlnaHQgKi8KICAgIGNvbG9yICAgICAgICAgICAgICAgIDogdmFyKC0tY2ZtcC1zdWJ0ZXh0KTsKICAgIGZvbnQtc2l6ZSAgICAgICAgICAgIDogMTJweDsKICAgIGxldHRlci1zcGFjaW5nICAgICAgIDogMC4wNWVtOwogICAgZm9udC12YXJpYW50LW51bWVyaWMgOiB0YWJ1bGFyLW51bXM7ICAvKiBwcmV2ZW50cyB3aWR0aCBqdW1waW5nIGFzIGRpZ2l0cyBjaGFuZ2UgKi8KICAgIHRleHQtc2hhZG93ICAgICAgICAgIDogMCAxcHggNHB4IHJnYmEoMCwwLDAsMC4zNSk7CiAgfQoKPC9zdHlsZT4KPCEtLSBFTkQgU0VDVElPTiAxOiBTVFlMRVMgLS0+CgoKPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIFNFQ1RJT04gMiDigJQgSFRNTCBTVFJVQ1RVUkUKICAgICBUaGUgdmlzaWJsZSBwbGF5ZXIgbWFya3VwLiBVcGRhdGUgdGl0bGUgYW5kIGFydGlzdCBoZXJlLgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgo8ZGl2IGNsYXNzPSJjZm1wLXJvb3QiIGlkPSJjZm1wLXJvb3QiPgogIDxkaXYgY2xhc3M9ImNmbXAtYm9keSI+CgoKICAgIDwhLS0gU09ORyBJTkZPIEJMT0NLIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICBVcGRhdGUgdGhlIHRleHQgYmV0d2VlbiB0aGUgPHA+IHRhZ3MuICAgICAgICAgICAgICAgLS0+CiAgICA8ZGl2IGNsYXNzPSJjZm1wLWluZm8iPgogICAgICA8cCBjbGFzcz0iY2ZtcC10aXRsZSI+QmFkIEhhYml0cyAoOEQgQXVkaW8pPC9wPiAgIDwhLS0g4oaQIHNvbmcgdGl0bGUgIC0tPgogICAgICA8cCBjbGFzcz0iY2ZtcC1hcnRpc3QiPkVkIFNoZWVyYW48L3A+ICAgICAgICAgICAgICA8IS0tIOKGkCBhcnRpc3QgbmFtZSAtLT4KICAgIDwvZGl2PgogICAgPCEtLSBFTkQgU09ORyBJTkZPIC0tPgoKCiAgICA8IS0tIENPTlRST0wgQlVUVE9OUyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICAgVGhyZWUgYnV0dG9uczogUHJldmlvdXMgfCBQbGF5L1BhdXNlIHwgTmV4dCAgICAgICAgICAtLT4KICAgIDxkaXYgY2xhc3M9ImNmbXAtY29udHJvbHMiPgoKICAgICAgPCEtLSBQUkVWSU9VUyBidXR0b24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgICAgT24gY2xpY2s6IHJlc3RhcnRzIHRyYWNrIGZyb20gMDowMAogICAgICAgICAgIChUbyBidWlsZCBhIHBsYXlsaXN0LCByZXBsYWNlIHRoZSBKUyBsb2dpYyBiZWxvdykgIC0tPgogICAgICA8YnV0dG9uIGNsYXNzPSJjZm1wLWJ0biBjZm1wLWJ0bi1wcmV2IiBpZD0iY2ZtcC1wcmV2IiBhcmlhLWxhYmVsPSJQcmV2aW91cyI+CiAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICAgICAgICA8IS0tIOKPriBTa2lwLWJhY2sgaWNvbjogdmVydGljYWwgYmFyICsgbGVmdC1wb2ludGluZyB0cmlhbmdsZSAtLT4KICAgICAgICAgIDxwYXRoIGQ9Ik02IDZoMnYxMkg2em0zLjUgNiA4LjUgNlY2eiIvPgogICAgICAgIDwvc3ZnPgogICAgICA8L2J1dHRvbj4KCiAgICAgIDwhLS0gUExBWSAvIFBBVVNFIGJ1dHRvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICAgICBJY29uIGF1dG9tYXRpY2FsbHkgc3dhcHMg4pa2IOKGlCDij7ggd2hlbiBjbGlja2VkLgogICAgICAgICAgIERvIG5vdCBjaGFuZ2UgdGhlIGlkPSJjZm1wLXBsYXktc3ZnIiDigJQgSlMgbmVlZHMgaXQuIC0tPgogICAgICA8YnV0dG9uIGNsYXNzPSJjZm1wLWJ0biBjZm1wLWJ0bi1wbGF5IiBpZD0iY2ZtcC1wbGF5IiBhcmlhLWxhYmVsPSJQbGF5Ij4KICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBpZD0iY2ZtcC1wbGF5LXN2ZyI+CiAgICAgICAgICA8IS0tIOKWtiBQbGF5IHRyaWFuZ2xlIChKUyBzd2FwcyB0aGlzIHBhdGggd2hlbiBwYXVzZWQvcGxheWluZykgLS0+CiAgICAgICAgICA8cGF0aCBkPSJNOCA1djE0bDExLTd6Ii8+CiAgICAgICAgPC9zdmc+CiAgICAgIDwvYnV0dG9uPgoKICAgICAgPCEtLSBORVhUIGJ1dHRvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICAgICBPbiBjbGljazoganVtcHMgdG8gZW5kIG9mIGN1cnJlbnQgdHJhY2sKICAgICAgICAgICAoVG8gYnVpbGQgYSBwbGF5bGlzdCwgcmVwbGFjZSB0aGUgSlMgbG9naWMgYmVsb3cpICAtLT4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2ZtcC1idG4gY2ZtcC1idG4tbmV4dCIgaWQ9ImNmbXAtbmV4dCIgYXJpYS1sYWJlbD0iTmV4dCI+CiAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICAgICAgICA8IS0tIOKPrSBTa2lwLWZvcndhcmQgaWNvbjogcmlnaHQtcG9pbnRpbmcgdHJpYW5nbGUgKyB2ZXJ0aWNhbCBiYXIgLS0+CiAgICAgICAgICA8cGF0aCBkPSJNNiAxOGw4LjUtNkw2IDZ2MTJ6bTguNS02TDIzIDZ2MTJ6Ii8+CiAgICAgICAgPC9zdmc+CiAgICAgIDwvYnV0dG9uPgoKICAgIDwvZGl2PgogICAgPCEtLSBFTkQgQ09OVFJPTCBCVVRUT05TIC0tPgoKCiAgICA8IS0tIFNDUlVCQkVSIEJBUiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICAgQ2xpY2sgYW55d2hlcmUgb24gdGhlIGJhciB0byBzZWVrLgogICAgICAgICBDbGljayBhbmQgZHJhZyB0aGUgcmVkIGRvdCB0byBzY3J1Yi4gICAgICAgICAgICAgICAgLS0+CiAgICA8ZGl2IGNsYXNzPSJjZm1wLXNjcnViYmVyIiBpZD0iY2ZtcC1zY3J1YmJlciI+CiAgICAgIDxkaXYgY2xhc3M9ImNmbXAtdHJhY2siPgogICAgICAgIDwhLS0gV2hpdGUgcHJvZ3Jlc3MgZmlsbCDigJQgd2lkdGggaXMgc2V0IGJ5IEpTIC0tPgogICAgICAgIDxkaXYgY2xhc3M9ImNmbXAtZmlsbCIgaWQ9ImNmbXAtZmlsbCI+PC9kaXY+CiAgICAgICAgPCEtLSBSZWQgZG90IGhhbmRsZSDigJQgbGVmdCBwb3NpdGlvbiBpcyBzZXQgYnkgSlMgLS0+CiAgICAgICAgPGRpdiBjbGFzcz0iY2ZtcC1oYW5kbGUiIGlkPSJjZm1wLWhhbmRsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8IS0tIEVORCBTQ1JVQkJFUiBCQVIgLS0+CgoKICAgIDwhLS0gVElNRSBESVNQTEFZIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICBMZWZ0IHNwYW4gPSBjdXJyZW50IHBsYXliYWNrIHRpbWUgKGUuZy4gMDowOSkKICAgICAgICAgUmlnaHQgc3BhbiA9IHRvdGFsIHNvbmcgZHVyYXRpb24gKGUuZy4gMzoxMikKICAgICAgICAgQm90aCBhcmUgdXBkYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IEpTLiAgICAgICAgICAgICAgLS0+CiAgICA8ZGl2IGNsYXNzPSJjZm1wLXRpbWUiPgogICAgICA8c3BhbiBpZD0iY2ZtcC1jdXIiPjA6MDA8L3NwYW4+ICAgPCEtLSBjdXJyZW50IHRpbWUg4oCUIGxlZnQgc2lkZSAtLT4KICAgICAgPHNwYW4gaWQ9ImNmbXAtZHVyIj4wOjAwPC9zcGFuPiAgIDwhLS0gdG90YWwgZHVyYXRpb24g4oCUIHJpZ2h0IHNpZGUgLS0+CiAgICA8L2Rpdj4KICAgIDwhLS0gRU5EIFRJTUUgRElTUExBWSAtLT4KCgogICAgPCEtLSBBVURJTyBFTEVNRU5UIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICBIaWRkZW4g4oCUIHRoZSBhY3R1YWwgYXVkaW8gZW5naW5lLiBVcGRhdGUgc3JjIGJlbG93LgoKICAgICAgICAg4pqgIEdPT0dMRSBEUklWRSBOT1RFOgogICAgICAgICBJZiBubyBzb3VuZCBwbGF5cywgR29vZ2xlIERyaXZlIG1heSBiZSBibG9ja2luZyB0aGUKICAgICAgICAgYnJvd3NlciBmcm9tIGxvYWRpbmcgdGhlIGZpbGUgY3Jvc3Mtb3JpZ2luLiBGaXg6CiAgICAgICAgIDEuIFVwbG9hZCBNUDMgdG8gV29yZFByZXNzIE1lZGlhIExpYnJhcnkKICAgICAgICAgMi4gQ29weSB0aGUgVVJMIGl0IGdpdmVzIHlvdSAoZW5kcyBpbiAubXAzKQogICAgICAgICAzLiBSZXBsYWNlIHRoZSBzcmMgYmVsb3cgd2l0aCB0aGF0IFVSTCAgICAgICAgICAgIC0tPgogICAgPGF1ZGlvIGlkPSJjZm1wLWF1ZGlvIiBwcmVsb2FkPSJtZXRhZGF0YSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CiAgICAgIDxzb3VyY2UKICAgICAgICBzcmM9Imh0dHBzOi8vaG9uZXN0cGhhcm1jby5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDYvRWQtU2hlZXJhbi1CYWQtSGFiaXRzLThELUFVRElPLm1wMyIKICAgICAgICB0eXBlPSJhdWRpby9tcGVnIj4KICAgIDwvYXVkaW8+CiAgICA8IS0tIEVORCBBVURJTyBFTEVNRU5UIC0tPgoKCiAgPC9kaXY+CiAgPCEtLSBFTkQgSU5ORVIgQk9EWSAtLT4KPC9kaXY+CjwhLS0gRU5EIFBMQVlFUiBST09UIC0tPgoKCjwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBTRUNUSU9OIDMg4oCUIEpBVkFTQ1JJUFQKICAgICBBbGwgcGxheWVyIGxvZ2ljOiBwbGF5L3BhdXNlLCBzY3J1YmJpbmcsIHRpbWUgZm9ybWF0dGluZy4KICAgICBZb3Ugc2hvdWxkIG5vdCBuZWVkIHRvIGVkaXQgdGhpcyBzZWN0aW9uIHVubGVzcyB5b3Ugd2FudAogICAgIHRvIGFkZCBwbGF5bGlzdCBmdW5jdGlvbmFsaXR5LgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgo8c2NyaXB0PgooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyog4pSA4pSAIFNURVAgMTogR1JBQiBBTEwgRUxFTUVOVFMgRlJPTSBUSEUgRE9NIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwogIHZhciBhdWRpbyAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZm1wLWF1ZGlvJyk7ICAgIC8vIHRoZSA8YXVkaW8+IGVuZ2luZQogIHZhciBwbGF5QnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZm1wLXBsYXknKTsgICAgIC8vIHBsYXkvcGF1c2UgYnV0dG9uCiAgdmFyIHBsYXlTdmcgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NmbXAtcGxheS1zdmcnKTsgLy8gU1ZHIGluc2lkZSBwbGF5IGJ1dHRvbgogIHZhciBwcmV2QnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZm1wLXByZXYnKTsgICAgIC8vIHByZXZpb3VzL3Jlc3RhcnQgYnV0dG9uCiAgdmFyIG5leHRCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NmbXAtbmV4dCcpOyAgICAgLy8gbmV4dC9za2lwIGJ1dHRvbgogIHZhciBzY3J1YmJlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZm1wLXNjcnViYmVyJyk7IC8vIHNjcnViYmVyIGNsaWNrIHpvbmUKICB2YXIgZmlsbCAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2ZtcC1maWxsJyk7ICAgICAvLyBwcm9ncmVzcyBmaWxsIGJhcgogIHZhciBoYW5kbGUgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZm1wLWhhbmRsZScpOyAgIC8vIHJlZCBjaXJjbGUgZG90CiAgdmFyIGN1ckVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NmbXAtY3VyJyk7ICAgICAgLy8gY3VycmVudCB0aW1lIGxhYmVsCiAgdmFyIGR1ckVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NmbXAtZHVyJyk7ICAgICAgLy8gdG90YWwgZHVyYXRpb24gbGFiZWwKCgogIC8qIOKUgOKUgCBTVEVQIDI6IFNWRyBQQVRIUyBGT1IgUExBWSBBTkQgUEFVU0UgSUNPTlMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCiAgLyogVGhlc2UgZ2V0IHN3YXBwZWQgaW50byB0aGUgcGxheSBidXR0b24gU1ZHIG9uIGNsaWNrICAgICAgICAgICovCiAgdmFyIFBMQVlfUEFUSCAgPSAnPHBhdGggZD0iTTggNXYxNGwxMS03eiIvPic7ICAgICAgICAgICAgICAgICAgICAvKiDilrYgdHJpYW5nbGUgICAqLwogIHZhciBQQVVTRV9QQVRIID0gJzxwYXRoIGQ9Ik02IDE5aDRWNUg2djE0em04LTE0djE0aDRWNWgtNHoiLz4nOyAvKiDij7ggdHdvIGJhcnMgICovCgoKICAvKiDilIDilIAgU1RFUCAzOiBQTEFZRVIgU1RBVEUgVkFSSUFCTEVTIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwogIHZhciBpc1BsYXlpbmcgPSBmYWxzZTsgIC8qIHRydWUgd2hpbGUgYXVkaW8gaXMgcGxheWluZyAgICAgICAqLwogIHZhciBkcmFnZ2luZyAgPSBmYWxzZTsgIC8qIHRydWUgd2hpbGUgdXNlciBkcmFncyB0aGUgaGFuZGxlICAqLwoKCiAgLyog4pSA4pSAIFNURVAgNDogSEVMUEVSIOKAlCBGT1JNQVQgU0VDT05EUyBUTyBtOnNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwogIC8qIEV4YW1wbGU6IGZvcm1hdFRpbWUoMTI1KSByZXR1cm5zICIyOjA1IiAgICAgICAgICAgICAgICAgICAgICAqLwogIGZ1bmN0aW9uIGZvcm1hdFRpbWUoc2Vjb25kcykgewogICAgaWYgKGlzTmFOKHNlY29uZHMpIHx8ICFpc0Zpbml0ZShzZWNvbmRzKSkgcmV0dXJuICcwOjAwJzsKICAgIHZhciBtICAgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7CiAgICB2YXIgcyAgID0gTWF0aC5mbG9vcihzZWNvbmRzICUgNjApOwogICAgcmV0dXJuIG0gKyAnOicgKyAocyA8IDEwID8gJzAnIDogJycpICsgczsKICB9CgoKICAvKiDilIDilIAgU1RFUCA1OiBIRUxQRVIg4oCUIE1PVkUgU0NSVUJCRVIgVE8gUEVSQ0VOVEFHRSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KICAvKiBwY3Q6IDAgKHN0YXJ0KSB0byAxMDAgKGVuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBmdW5jdGlvbiBzZXRQcm9ncmVzcyhwY3QpIHsKICAgIGZpbGwuc3R5bGUud2lkdGggID0gcGN0ICsgJyUnOyAgIC8qIGdyb3cgdGhlIHdoaXRlIGZpbGwgYmFyICAgICAqLwogICAgaGFuZGxlLnN0eWxlLmxlZnQgPSBwY3QgKyAnJSc7ICAgLyogbW92ZSB0aGUgcmVkIGRvdCB0byBtYXRjaCAgICovCiAgfQoKCiAgLyog4pSA4pSAIFNURVAgNjogSEVMUEVSIOKAlCBTRUVLIFRPIEEgSE9SSVpPTlRBTCBQT1NJVElPTiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KICAvKiBjbGllbnRYOiB0aGUgbW91c2Ugb3IgdG91Y2ggWCBwb3NpdGlvbiBvbiB0aGUgcGFnZSAgICAgICAgICAgKi8KICBmdW5jdGlvbiBzZWVrRnJvbVgoY2xpZW50WCkgewogICAgdmFyIHRyYWNrID0gc2NydWJiZXIucXVlcnlTZWxlY3RvcignLmNmbXAtdHJhY2snKTsKICAgIHZhciByZWN0ICA9IHRyYWNrLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgLyogY2xhbXAgdG8gMOKAkzEgc28gc2Vla2luZyBuZXZlciBnb2VzIG91dCBvZiBib3VuZHMgKi8KICAgIHZhciByYXRpbyA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChjbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGgpKTsKICAgIGlmIChhdWRpby5kdXJhdGlvbikgewogICAgICBhdWRpby5jdXJyZW50VGltZSA9IHJhdGlvICogYXVkaW8uZHVyYXRpb247ICAvKiBqdW1wIGF1ZGlvIHRvIHRoYXQgc3BvdCAqLwogICAgfQogIH0KCgogIC8qIOKUgOKUgCBTVEVQIDc6IEFVRElPIEVWRU5UIExJU1RFTkVSUyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCiAgLyogRmlyZXMgb25jZSB3aGVuIHRoZSBicm93c2VyIGtub3dzIHRoZSBmaWxlIGxlbmd0aCAgICAgICAgICAgICovCiAgYXVkaW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBmdW5jdGlvbiAoKSB7CiAgICBkdXJFbC50ZXh0Q29udGVudCA9IGZvcm1hdFRpbWUoYXVkaW8uZHVyYXRpb24pOyAgLyogc2hvdyB0b3RhbCBkdXJhdGlvbiAqLwogIH0pOwoKICAvKiBGaXJlcyBjb250aW51b3VzbHkgd2hpbGUgYXVkaW8gcGxheXMgKH40eCBwZXIgc2Vjb25kKSAgICAgICAgKi8KICBhdWRpby5hZGRFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgZnVuY3Rpb24gKCkgewogICAgaWYgKCFhdWRpby5kdXJhdGlvbikgcmV0dXJuOwogICAgdmFyIHBjdCA9IChhdWRpby5jdXJyZW50VGltZSAvIGF1ZGlvLmR1cmF0aW9uKSAqIDEwMDsKICAgIHNldFByb2dyZXNzKHBjdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92ZSB0aGUgc2NydWJiZXIgZG90ICAqLwogICAgY3VyRWwudGV4dENvbnRlbnQgPSBmb3JtYXRUaW1lKGF1ZGlvLmN1cnJlbnRUaW1lKTsgLyogdXBkYXRlIHRpbWUgbGFiZWwgKi8KICB9KTsKCiAgLyogRmlyZXMgd2hlbiB0aGUgc29uZyBmaW5pc2hlcyBwbGF5aW5nICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgYXVkaW8uYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBmdW5jdGlvbiAoKSB7CiAgICBpc1BsYXlpbmcgICAgICAgICA9IGZhbHNlOwogICAgcGxheVN2Zy5pbm5lckhUTUwgPSBQTEFZX1BBVEg7ICAvKiBzd2l0Y2ggYmFjayB0byBwbGF5IGljb24gKi8KICAgIHNldFByb2dyZXNzKDApOyAgICAgICAgICAgICAgICAgLyogcmVzZXQgc2NydWJiZXIgdG8gc3RhcnQgICovCiAgICBjdXJFbC50ZXh0Q29udGVudCA9ICcwOjAwJzsKICB9KTsKCgogIC8qIOKUgOKUgCBTVEVQIDg6IFBMQVkgLyBQQVVTRSBCVVRUT04gQ0xJQ0sg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCiAgcGxheUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgIGlmIChpc1BsYXlpbmcpIHsKICAgICAgLyogQ3VycmVudGx5IHBsYXlpbmcg4oaSIHBhdXNlIGl0ICovCiAgICAgIGF1ZGlvLnBhdXNlKCk7CiAgICAgIGlzUGxheWluZyAgICAgICAgID0gZmFsc2U7CiAgICAgIHBsYXlTdmcuaW5uZXJIVE1MID0gUExBWV9QQVRIOyAgICAvKiBzaG93IOKWtiBpY29uICovCiAgICB9IGVsc2UgewogICAgICAvKiBDdXJyZW50bHkgcGF1c2VkIOKGkiBwbGF5IGl0ICovCiAgICAgIGF1ZGlvLnBsYXkoKTsKICAgICAgaXNQbGF5aW5nICAgICAgICAgPSB0cnVlOwogICAgICBwbGF5U3ZnLmlubmVySFRNTCA9IFBBVVNFX1BBVEg7ICAgLyogc2hvdyDij7ggaWNvbiAqLwogICAgfQogIH0pOwoKCiAgLyog4pSA4pSAIFNURVAgOTogUFJFVklPVVMgQlVUVE9OIENMSUNLIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwogIC8qIFJlc3RhcnRzIHRoZSBjdXJyZW50IHRyYWNrIGZyb20gMDowMAogICAgIFRvIGFkZCBhIGZ1bGwgcGxheWxpc3Q6IGxvYWQgbmV4dCBhdWRpby5zcmMgaGVyZSBpbnN0ZWFkICAgICovCiAgcHJldkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgIGF1ZGlvLmN1cnJlbnRUaW1lID0gMDsgICAgICAgICAvKiBqdW1wIGJhY2sgdG8gc3RhcnQgKi8KICAgIGlmICghaXNQbGF5aW5nKSB7CiAgICAgIC8qIGF1dG8tc3RhcnQgaWYgc29uZyB3YXNuJ3QgcGxheWluZyAqLwogICAgICBhdWRpby5wbGF5KCk7CiAgICAgIGlzUGxheWluZyAgICAgICAgID0gdHJ1ZTsKICAgICAgcGxheVN2Zy5pbm5lckhUTUwgPSBQQVVTRV9QQVRIOwogICAgfQogIH0pOwoKCiAgLyog4pSA4pSAIFNURVAgMTA6IE5FWFQgQlVUVE9OIENMSUNLIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwogIC8qIEp1bXBzIHRvIHRoZSBlbmQgKHRyaWdnZXJzIHRoZSAnZW5kZWQnIGV2ZW50IGFib3ZlKQogICAgIFRvIGFkZCBhIGZ1bGwgcGxheWxpc3Q6IGxvYWQgbmV4dCB0cmFjaydzIHNyYyBoZXJlIGluc3RlYWQgICovCiAgbmV4dEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgIGlmIChhdWRpby5kdXJhdGlvbikgewogICAgICBhdWRpby5jdXJyZW50VGltZSA9IGF1ZGlvLmR1cmF0aW9uOyAgLyogc2tpcCB0byBlbmQgb2YgdHJhY2sgKi8KICAgIH0KICB9KTsKCgogIC8qIOKUgOKUgCBTVEVQIDExOiBTQ1JVQkJFUiDigJQgTU9VU0UgRVZFTlRTIChkZXNrdG9wKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCiAgLyogU3RhcnQgYSBkcmFnIG9uIG1vdXNlZG93biBhbnl3aGVyZSBvbiB0aGUgc2NydWJiZXIgKi8KICBzY3J1YmJlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBmdW5jdGlvbiAoZSkgewogICAgZHJhZ2dpbmcgPSB0cnVlOwogICAgc2Vla0Zyb21YKGUuY2xpZW50WCk7ICAgLyogaW1tZWRpYXRlbHkganVtcCB0byBjbGlja2VkIHBvc2l0aW9uICovCiAgfSk7CgogIC8qIEtlZXAgc2Vla2luZyB3aGlsZSB0aGUgbW91c2UgbW92ZXMgKGV2ZW4gb3V0c2lkZSBzY3J1YmJlcikgKi8KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBmdW5jdGlvbiAoZSkgewogICAgaWYgKGRyYWdnaW5nKSBzZWVrRnJvbVgoZS5jbGllbnRYKTsKICB9KTsKCiAgLyogU3RvcCB0aGUgZHJhZyB3aGVuIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZCAqLwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBmdW5jdGlvbiAoKSB7CiAgICBkcmFnZ2luZyA9IGZhbHNlOwogIH0pOwoKCiAgLyog4pSA4pSAIFNURVAgMTI6IFNDUlVCQkVSIOKAlCBUT1VDSCBFVkVOVFMgKG1vYmlsZS90YWJsZXQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKICAvKiBTdGFydCBzZWVrIG9uIGZpcnN0IHRvdWNoICovCiAgc2NydWJiZXIuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGZ1bmN0aW9uIChlKSB7CiAgICBzZWVrRnJvbVgoZS50b3VjaGVzWzBdLmNsaWVudFgpOwogIH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKCiAgLyogQ29udGludWUgc2Vla2luZyBhcyBmaW5nZXIgbW92ZXMKICAgICBwYXNzaXZlOiBmYWxzZSBzbyB3ZSBjYW4gY2FsbCBwcmV2ZW50RGVmYXVsdCgpIHRvIHN0b3AKICAgICB0aGUgcGFnZSBmcm9tIHNjcm9sbGluZyB3aGlsZSB0aGUgdXNlciBzY3J1YnMgICAgICAgICAgICAgKi8KICBzY3J1YmJlci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoZSkgewogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgc2Vla0Zyb21YKGUudG91Y2hlc1swXS5jbGllbnRYKTsKICB9LCB7IHBhc3NpdmU6IGZhbHNlIH0pOwoKCn0pKCk7IC8qIHNlbGYtaW52b2tpbmcgd3JhcHBlcjoga2VlcHMgYWxsIHZhcmlhYmxlcyBwcml2YXRlICovCjwvc2NyaXB0Pgo8IS0tIEVORCBTRUNUSU9OIDM6IEpBVkFTQ1JJUFQgLS0+Cgo8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIEVORCBDRiBNVVNJQyBQTEFZRVIKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cg==PCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBDRiBNVVNJQyBQTEFZRVIg4oCUIFBhc3RlIGVudGlyZSBibG9jayBpbnRvIFNhbGllbnQKICAgICBDdXN0b20gSFRNTCBibG9jayAoQXBwZWFyYW5jZSA+IFdpZGdldHMsIG9yIFBhZ2UgQnVpbGRlcikKCiAgICAg4pqgIElNUE9SVEFOVCDigJQgUkVBRCBUSElTIEZJUlNUOgogICAgIEdvb2dsZSBEcml2ZSBsaW5rcyBvZnRlbiBibG9jayBicm93c2VyIGF1ZGlvIHBsYXliYWNrCiAgICAgZHVlIHRvIENPUlMgcmVzdHJpY3Rpb25zLiBJZiB0aGUgcGxheWVyIGxvYWRzIGJ1dAogICAgIHByb2R1Y2VzIG5vIHNvdW5kLCB1cGxvYWQgeW91ciBNUDMgdG8geW91ciBXb3JkUHJlc3MKICAgICBNZWRpYSBMaWJyYXJ5IGluc3RlYWQgYW5kIHN3YXAgaW4gdGhhdCBVUkwuCgogICAgIFFVSUNLLUNIQU5HRSBHVUlERSAoc2VhcmNoIGZvciDihpAgc3ltYm9scyk6CiAgICAgMS4gTVAzIFVSTCAgICAg4oaSIGluc2lkZSA8c291cmNlIHNyYz0iLi4uIj4KICAgICAyLiBTb25nIHRpdGxlICDihpIgaW5zaWRlIDxwIGNsYXNzPSJjZm1wLXRpdGxlIj4KICAgICAzLiBBcnRpc3QgbmFtZSDihpIgaW5zaWRlIDxwIGNsYXNzPSJjZm1wLWFydGlzdCI+CiAgICAgNC4gRG90IGNvbG9yICAg4oaSIC0tY2ZtcC1hY2NlbnQgQ1NTIHZhcmlhYmxlCiAgICAgNS4gVGV4dCBjb2xvciAg4oaSIC0tY2ZtcC10ZXh0IENTUyB2YXJpYWJsZQogICAgIDYuIEJ1dHRvbiBzaXplIOKGkiAuY2ZtcC1idG4tcHJldi9uZXh0L3BsYXkgc3ZnIHNpemVzCiAgICAgNy4gQmFyIGhlaWdodCAg4oaSIC5jZm1wLXRyYWNrIGhlaWdodCB2YWx1ZQogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KCgo8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgU0VDVElPTiAxIOKAlCBTVFlMRVMKICAgICBBbGwgdmlzdWFsIGRlc2lnbiBsaXZlcyBoZXJlLiBTYWZlIHRvIGVkaXQgYW55dGhpbmcKICAgICBiZXR3ZWVuIHRoZSA8c3R5bGU+IHRhZ3MuCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CjxzdHlsZT4KCiAgLyog4pSA4pSAIFJPT1QgQ09OVEFJTkVSIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgIFRoZSBvdXRlciB3cmFwcGVyIGZvciB0aGUgZW50aXJlIHBsYXllci4KICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCBtZWFucyB0aGUgU2FsaWVudCBzZWN0aW9uCiAgICAgYmFja2dyb3VuZCBjb2xvciAvIGltYWdlIHdpbGwgc2hvdyB0aHJvdWdoLiAgICAgICAgICAgICovCiAgLmNmbXAtcm9vdCB7CgogICAgLyogQ09MT1IgVE9LRU5TIOKAlCBjaGFuZ2UgdGhlc2UgdG8gcmVzdHlsZSB0aGUgcGxheWVyIHF1aWNrbHkgKi8KICAgIC0tY2ZtcC1hY2NlbnQgIDogI2UwMzAzMDsgICAgICAgICAgICAgIC8qIOKGkCBzY3J1YmJlciBkb3QgY29sb3IgKHJlZCkgICAgICovCiAgICAtLWNmbXAtdGV4dCAgICA6IHJnYmEoMjU1LDI1NSwyNTUsMC45NSk7IC8qIOKGkCB0aXRsZSAvIGJ1dHRvbiBjb2xvciAod2hpdGUpICovCiAgICAtLWNmbXAtc3VidGV4dCA6IHJnYmEoMjU1LDI1NSwyNTUsMC42KTsgIC8qIOKGkCBhcnRpc3QgLyB0aW1lIGNvbG9yIChkaW0pICAgKi8KICAgIC0tY2ZtcC10cmFjayAgIDogcmdiYSgyNTUsMjU1LDI1NSwwLjIyKTsgLyog4oaQIGVtcHR5IHNjcnViYmVyIGJhciBjb2xvciAgICAgKi8KICAgIC0tY2ZtcC1maWxsICAgIDogcmdiYSgyNTUsMjU1LDI1NSwwLjg1KTsgLyog4oaQIHBsYXllZCBwb3J0aW9uIGJhciBjb2xvciAgICAgKi8KCiAgICBiYWNrZ3JvdW5kICAgIDogdHJhbnNwYXJlbnQ7ICAgIC8qIOKGkCBwYWdlIGJhY2tncm91bmQgc2hvd3MgdGhyb3VnaCAqLwogICAgYm9yZGVyLXJhZGl1cyA6IDIwcHg7ICAgICAgICAgICAvKiByb3VuZGVkIGNvcm5lcnMgb24gdGhlIHBsYXllciAgICAqLwogICAgbWF4LXdpZHRoICAgICA6IDQ4MHB4OyAgICAgICAgICAvKiBwbGF5ZXIgd29uJ3QgZ3JvdyB3aWRlciB0aGFuIHRoaXMgKi8KICAgIG1hcmdpbiAgICAgICAgOiAwIGF1dG87ICAgICAgICAgLyogY2VudGVyIGl0IGhvcml6b250YWxseSAgICAgICAgICAgKi8KICAgIGZvbnQtZmFtaWx5ICAgOiAtYXBwbGUtc3lzdGVtLCAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjsKCiAgICAvKiBwcmV2ZW50IHRleHQgc2VsZWN0aW9uIHdoZW4gY2xpY2tpbmcgYnV0dG9ucyAqLwogICAgLXdlYmtpdC11c2VyLXNlbGVjdCA6IG5vbmU7CiAgICB1c2VyLXNlbGVjdCAgICAgICAgIDogbm9uZTsKICB9CgoKICAvKiDilIDilIAgSU5ORVIgUEFERElORyBXUkFQUEVSIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgIENvbnRyb2xzIHRoZSBzcGFjZSBpbnNpZGUgdGhlIHBsYXllciBlZGdlcy4gICAgICAgICAgICAgKi8KICAuY2ZtcC1ib2R5IHsKICAgIHBhZGRpbmcgOiAzMnB4IDI4cHggMjZweDsgLyogdG9wIHwgbGVmdCtyaWdodCB8IGJvdHRvbSAqLwogIH0KCgogIC8qIOKUgOKUgCBTT05HIElORk8gKFRpdGxlICsgQXJ0aXN0KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICBDZW50ZXJlZCB0ZXh0IGJsb2NrIGFib3ZlIHRoZSBjb250cm9scy4gICAgICAgICAgICAgICAgICovCiAgLmNmbXAtaW5mbyB7CiAgICB0ZXh0LWFsaWduICAgIDogY2VudGVyOwogICAgbWFyZ2luLWJvdHRvbSA6IDI0cHg7ICAgLyogZ2FwIGJldHdlZW4gaW5mbyBhbmQgYnV0dG9ucyAqLwogIH0KCiAgLyogU29uZyB0aXRsZSDigJQgbGFyZ2UgYW5kIGJvbGQgKi8KICAuY2ZtcC10aXRsZSB7CiAgICBjb2xvciAgICAgICAgOiB2YXIoLS1jZm1wLXRleHQpOwogICAgZm9udC1zaXplICAgIDogMTdweDsKICAgIGZvbnQtd2VpZ2h0ICA6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICBtYXJnaW4gICAgICAgOiAwIDAgNXB4IDA7CiAgICBsaW5lLWhlaWdodCAgOiAxLjM7CiAgICAvKiB0ZXh0LXNoYWRvdyBrZWVwcyB3aGl0ZSB0ZXh0IHJlYWRhYmxlIG9uIGxpZ2h0IHBhZ2UgYmdzICovCiAgICB0ZXh0LXNoYWRvdyAgOiAwIDFweCA4cHggcmdiYSgwLDAsMCwwLjQ1KTsKICB9CgogIC8qIEFydGlzdCBuYW1lIOKAlCBzbWFsbCwgdXBwZXJjYXNlLCBkaW1tZXIgKi8KICAuY2ZtcC1hcnRpc3QgewogICAgY29sb3IgICAgICAgICAgOiB2YXIoLS1jZm1wLXN1YnRleHQpOwogICAgZm9udC1zaXplICAgICAgOiAxMnB4OwogICAgbGV0dGVyLXNwYWNpbmcgOiAwLjEyZW07CiAgICB0ZXh0LXRyYW5zZm9ybSA6IHVwcGVyY2FzZTsKICAgIG1hcmdpbiAgICAgICAgIDogMDsKICAgIHRleHQtc2hhZG93ICAgIDogMCAxcHggNHB4IHJnYmEoMCwwLDAsMC4zNSk7CiAgfQoKCiAgLyog4pSA4pSAIENPTlRST0wgQlVUVE9OUyBST1cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgRmxleCByb3c6IFvil4Til4RdICAgW+KWtl0gICBb4pa64pa6XQogICAgIENoYW5nZSBnYXAgdG8gc3ByZWFkIGJ1dHRvbnMgZnVydGhlciBhcGFydC4gICAgICAgICAgICAgKi8KICAuY2ZtcC1jb250cm9scyB7CiAgICBkaXNwbGF5ICAgICAgICAgOiBmbGV4OwogICAgYWxpZ24taXRlbXMgICAgIDogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50IDogY2VudGVyOwogICAgZ2FwICAgICAgICAgICAgIDogNDRweDsgICAgLyog4oaQIHNwYWNlIGJldHdlZW4gYnV0dG9ucyAqLwogICAgbWFyZ2luLWJvdHRvbSAgIDogMjRweDsgICAgLyogZ2FwIGJldHdlZW4gYnV0dG9ucyBhbmQgc2NydWJiZXIgKi8KICB9CgogIC8qIFNoYXJlZCBiYXNlIHN0eWxlIGZvciBhbGwgdGhyZWUgYnV0dG9ucyAqLwogIC5jZm1wLWJ0biB7CiAgICBiYWNrZ3JvdW5kICAgICAgICAgICAgICAgOiBub25lOwogICAgYm9yZGVyICAgICAgICAgICAgICAgICAgIDogbm9uZTsKICAgIHBhZGRpbmcgICAgICAgICAgICAgICAgICA6IDZweDsKICAgIGN1cnNvciAgICAgICAgICAgICAgICAgICA6IHBvaW50ZXI7CiAgICBjb2xvciAgICAgICAgICAgICAgICAgICAgOiByZ2JhKDI1NSwyNTUsMjU1LDAuODgpOyAvKiBidXR0b24gaWNvbiBjb2xvciAqLwogICAgZGlzcGxheSAgICAgICAgICAgICAgICAgIDogZmxleDsKICAgIGFsaWduLWl0ZW1zICAgICAgICAgICAgICA6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudCAgICAgICAgICA6IGNlbnRlcjsKICAgIHRyYW5zaXRpb24gICAgICAgICAgICAgICA6IGNvbG9yIDAuMTVzIGVhc2UsIHRyYW5zZm9ybSAwLjE1cyBlYXNlOwogICAgb3V0bGluZSAgICAgICAgICAgICAgICAgIDogbm9uZTsKICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7IC8qIHJlbW92ZXMgYmx1ZSBmbGFzaCBvbiBtb2JpbGUgKi8KICAgIC8qIGRyb3Atc2hhZG93IGtlZXBzIHdoaXRlIGljb25zIHZpc2libGUgb24gd2hpdGUgcGFnZSBiZ3MgKi8KICAgIGZpbHRlciAgICAgICAgICAgICAgICAgICA6IGRyb3Atc2hhZG93KDAgMXB4IDVweCByZ2JhKDAsMCwwLDAuNDUpKTsKICB9CgogIC8qIEhvdmVyOiBicmlnaHRlciB3aGl0ZSArIHNsaWdodCBzY2FsZS11cCAqLwogIC5jZm1wLWJ0bjpob3ZlciB7CiAgICBjb2xvciAgICAgOiAjZmZmOwogICAgdHJhbnNmb3JtIDogc2NhbGUoMS4xMik7CiAgfQoKICAuY2ZtcC1idG4gc3ZnIHsKICAgIGRpc3BsYXkgOiBibG9jazsKICAgIGZpbGwgICAgOiBjdXJyZW50Q29sb3I7CiAgfQoKICAvKiBQcmV2IGFuZCBOZXh0IGljb24gc2l6ZSAqLwogIC5jZm1wLWJ0bi1wcmV2IHN2ZywKICAuY2ZtcC1idG4tbmV4dCBzdmcgewogICAgd2lkdGggIDogMjJweDsgIC8qIOKGkCBjaGFuZ2UgaWNvbiBzaXplIGhlcmUgKi8KICAgIGhlaWdodCA6IDIycHg7CiAgfQoKICAvKiBQbGF5L1BhdXNlIGljb24gaXMgaW50ZW50aW9uYWxseSBsYXJnZXIgdGhhbiBwcmV2L25leHQgKi8KICAuY2ZtcC1idG4tcGxheSBzdmcgewogICAgd2lkdGggIDogMzBweDsgIC8qIOKGkCBjaGFuZ2UgcGxheSBpY29uIHNpemUgaGVyZSAqLwogICAgaGVpZ2h0IDogMzBweDsKICB9CgoKICAvKiDilIDilIAgU0NSVUJCRVIgLyBQUk9HUkVTUyBCQVIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgVGFsbCBjbGljay9kcmFnIGFyZWEgd2l0aCBhIHRoaW4gdmlzdWFsIHRyYWNrIGluc2lkZS4gICAqLwogIC5jZm1wLXNjcnViYmVyIHsKICAgIHBvc2l0aW9uICAgICAgICAgICAgICAgICAgIDogcmVsYXRpdmU7CiAgICBoZWlnaHQgICAgICAgICAgICAgICAgICAgICA6IDI0cHg7ICAgICAvKiB0YWxsIGZvciBlYXN5IHRvdWNoIHRhcmdldHMgKi8KICAgIGRpc3BsYXkgICAgICAgICAgICAgICAgICAgIDogZmxleDsKICAgIGFsaWduLWl0ZW1zICAgICAgICAgICAgICAgIDogY2VudGVyOwogICAgY3Vyc29yICAgICAgICAgICAgICAgICAgICAgOiBwb2ludGVyOwogICAgbWFyZ2luLWJvdHRvbSAgICAgICAgICAgICAgOiAxMHB4OyAgICAgLyogZ2FwIGJlbG93IHNjcnViYmVyIGJlZm9yZSB0aW1lICovCiAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogIH0KCiAgLyogVGhlIHRoaW4gYmFja2dyb3VuZCBsaW5lICovCiAgLmNmbXAtdHJhY2sgewogICAgcG9zaXRpb24gICAgICA6IHJlbGF0aXZlOwogICAgd2lkdGggICAgICAgICA6IDEwMCU7CiAgICBoZWlnaHQgICAgICAgIDogMnB4OyAgICAgICAgIC8qIOKGkCBjaGFuZ2UgdG8gM3B4IG9yIDRweCBmb3IgYSB0aGlja2VyIGJhciAqLwogICAgYmFja2dyb3VuZCAgICA6IHZhcigtLWNmbXAtdHJhY2spOwogICAgYm9yZGVyLXJhZGl1cyA6IDJweDsKICB9CgogIC8qIFdoaXRlIHBvcnRpb24gdGhhdCBncm93cyBhcyB0aGUgc29uZyBwbGF5cyAoSlMgc2V0cyB3aWR0aCkgKi8KICAuY2ZtcC1maWxsIHsKICAgIHBvc2l0aW9uICAgICAgOiBhYnNvbHV0ZTsKICAgIHRvcCAgICAgICAgICAgOiAwOwogICAgbGVmdCAgICAgICAgICA6IDA7CiAgICBoZWlnaHQgICAgICAgIDogMTAwJTsKICAgIHdpZHRoICAgICAgICAgOiAwJTsgICAgICAgICAgLyogc3RhcnRzIGF0IDAsIEpTIHVwZGF0ZXMgY29udGludW91c2x5ICovCiAgICBiYWNrZ3JvdW5kICAgIDogdmFyKC0tY2ZtcC1maWxsKTsKICAgIGJvcmRlci1yYWRpdXMgOiAycHg7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsgICAgICAgIC8qIHNvIGl0IGRvZXNuJ3QgYmxvY2sgY2xpY2sgZXZlbnRzICovCiAgfQoKICAvKiBUaGUgY29sb3JlZCBjaXJjbGUgaGFuZGxlIG9uIHRoZSBzY3J1YmJlciAqLwogIC5jZm1wLWhhbmRsZSB7CiAgICBwb3NpdGlvbiAgICAgIDogYWJzb2x1dGU7CiAgICB0b3AgICAgICAgICAgIDogNTAlOwogICAgbGVmdCAgICAgICAgICA6IDAlOyAgICAgICAgICAvKiBKUyB1cGRhdGVzIHRoaXMgYXMgc29uZyBwbGF5cyAqLwogICAgdHJhbnNmb3JtICAgICA6IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIHdpZHRoICAgICAgICAgOiAxM3B4OyAgICAgICAgLyog4oaQIGNoYW5nZSBkb3Qgc2l6ZSBoZXJlICovCiAgICBoZWlnaHQgICAgICAgIDogMTNweDsKICAgIGJhY2tncm91bmQgICAgOiB2YXIoLS1jZm1wLWFjY2VudCk7ICAvKiB1c2VzIC0tY2ZtcC1hY2NlbnQgY29sb3IgdG9rZW4gYWJvdmUgKi8KICAgIGJvcmRlci1yYWRpdXMgOiA1MCU7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaGFkb3cgICAgOiAwIDAgOHB4IHJnYmEoMjI0LDQ4LDQ4LDAuNTUpOyAgLyogc29mdCBnbG93IGFyb3VuZCBkb3QgKi8KICB9CgoKICAvKiDilIDilIAgVElNRSBESVNQTEFZIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgIFR3byB0aW1lc3RhbXBzOiBjdXJyZW50IHRpbWUgKGxlZnQpIGFuZCB0b3RhbCAocmlnaHQpLiAgKi8KICAuY2ZtcC10aW1lIHsKICAgIGRpc3BsYXkgICAgICAgICAgICAgIDogZmxleDsKICAgIGp1c3RpZnktY29udGVudCAgICAgIDogc3BhY2UtYmV0d2VlbjsgLyogcHVzaGVzIGN1cnJlbnQgbGVmdCwgdG90YWwgcmlnaHQgKi8KICAgIGNvbG9yICAgICAgICAgICAgICAgIDogdmFyKC0tY2ZtcC1zdWJ0ZXh0KTsKICAgIGZvbnQtc2l6ZSAgICAgICAgICAgIDogMTJweDsKICAgIGxldHRlci1zcGFjaW5nICAgICAgIDogMC4wNWVtOwogICAgZm9udC12YXJpYW50LW51bWVyaWMgOiB0YWJ1bGFyLW51bXM7ICAvKiBwcmV2ZW50cyB3aWR0aCBqdW1waW5nIGFzIGRpZ2l0cyBjaGFuZ2UgKi8KICAgIHRleHQtc2hhZG93ICAgICAgICAgIDogMCAxcHggNHB4IHJnYmEoMCwwLDAsMC4zNSk7CiAgfQoKPC9zdHlsZT4KPCEtLSBFTkQgU0VDVElPTiAxOiBTVFlMRVMgLS0+CgoKPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIFNFQ1RJT04gMiDigJQgSFRNTCBTVFJVQ1RVUkUKICAgICBUaGUgdmlzaWJsZSBwbGF5ZXIgbWFya3VwLiBVcGRhdGUgdGl0bGUgYW5kIGFydGlzdCBoZXJlLgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgo8ZGl2IGNsYXNzPSJjZm1wLXJvb3QiIGlkPSJjZm1wLXJvb3QiPgogIDxkaXYgY2xhc3M9ImNmbXAtYm9keSI+CgoKICAgIDwhLS0gU09ORyBJTkZPIEJMT0NLIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICBVcGRhdGUgdGhlIHRleHQgYmV0d2VlbiB0aGUgPHA+IHRhZ3MuICAgICAgICAgICAgICAgLS0+CiAgICA8ZGl2IGNsYXNzPSJjZm1wLWluZm8iPgogICAgICA8cCBjbGFzcz0iY2ZtcC10aXRsZSI+QmFkIEhhYml0cyAoOEQgQXVkaW8pPC9wPiAgIDwhLS0g4oaQIHNvbmcgdGl0bGUgIC0tPgogICAgICA8cCBjbGFzcz0iY2ZtcC1hcnRpc3QiPkVkIFNoZWVyYW48L3A+ICAgICAgICAgICAgICA8IS0tIOKGkCBhcnRpc3QgbmFtZSAtLT4KICAgIDwvZGl2PgogICAgPCEtLSBFTkQgU09ORyBJTkZPIC0tPgoKCiAgICA8IS0tIENPTlRST0wgQlVUVE9OUyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICAgVGhyZWUgYnV0dG9uczogUHJldmlvdXMgfCBQbGF5L1BhdXNlIHwgTmV4dCAgICAgICAgICAtLT4KICAgIDxkaXYgY2xhc3M9ImNmbXAtY29udHJvbHMiPgoKICAgICAgPCEtLSBQUkVWSU9VUyBidXR0b24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgICAgT24gY2xpY2s6IHJlc3RhcnRzIHRyYWNrIGZyb20gMDowMAogICAgICAgICAgIChUbyBidWlsZCBhIHBsYXlsaXN0LCByZXBsYWNlIHRoZSBKUyBsb2dpYyBiZWxvdykgIC0tPgogICAgICA8YnV0dG9uIGNsYXNzPSJjZm1wLWJ0biBjZm1wLWJ0bi1wcmV2IiBpZD0iY2ZtcC1wcmV2IiBhcmlhLWxhYmVsPSJQcmV2aW91cyI+CiAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICAgICAgICA8IS0tIOKPriBTa2lwLWJhY2sgaWNvbjogdmVydGljYWwgYmFyICsgbGVmdC1wb2ludGluZyB0cmlhbmdsZSAtLT4KICAgICAgICAgIDxwYXRoIGQ9Ik02IDZoMnYxMkg2em0zLjUgNiA4LjUgNlY2eiIvPgogICAgICAgIDwvc3ZnPgogICAgICA8L2J1dHRvbj4KCiAgICAgIDwhLS0gUExBWSAvIFBBVVNFIGJ1dHRvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICAgICBJY29uIGF1dG9tYXRpY2FsbHkgc3dhcHMg4pa2IOKGlCDij7ggd2hlbiBjbGlja2VkLgogICAgICAgICAgIERvIG5vdCBjaGFuZ2UgdGhlIGlkPSJjZm1wLXBsYXktc3ZnIiDigJQgSlMgbmVlZHMgaXQuIC0tPgogICAgICA8YnV0dG9uIGNsYXNzPSJjZm1wLWJ0biBjZm1wLWJ0bi1wbGF5IiBpZD0iY2ZtcC1wbGF5IiBhcmlhLWxhYmVsPSJQbGF5Ij4KICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBpZD0iY2ZtcC1wbGF5LXN2ZyI+CiAgICAgICAgICA8IS0tIOKWtiBQbGF5IHRyaWFuZ2xlIChKUyBzd2FwcyB0aGlzIHBhdGggd2hlbiBwYXVzZWQvcGxheWluZykgLS0+CiAgICAgICAgICA8cGF0aCBkPSJNOCA1djE0bDExLTd6Ii8+CiAgICAgICAgPC9zdmc+CiAgICAgIDwvYnV0dG9uPgoKICAgICAgPCEtLSBORVhUIGJ1dHRvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICAgICBPbiBjbGljazoganVtcHMgdG8gZW5kIG9mIGN1cnJlbnQgdHJhY2sKICAgICAgICAgICAoVG8gYnVpbGQgYSBwbGF5bGlzdCwgcmVwbGFjZSB0aGUgSlMgbG9naWMgYmVsb3cpICAtLT4KICAgICAgPGJ1dHRvbiBjbGFzcz0iY2ZtcC1idG4gY2ZtcC1idG4tbmV4dCIgaWQ9ImNmbXAtbmV4dCIgYXJpYS1sYWJlbD0iTmV4dCI+CiAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICAgICAgICA8IS0tIOKPrSBTa2lwLWZvcndhcmQgaWNvbjogcmlnaHQtcG9pbnRpbmcgdHJpYW5nbGUgKyB2ZXJ0aWNhbCBiYXIgLS0+CiAgICAgICAgICA8cGF0aCBkPSJNNiAxOGw4LjUtNkw2IDZ2MTJ6bTguNS02TDIzIDZ2MTJ6Ii8+CiAgICAgICAgPC9zdmc+CiAgICAgIDwvYnV0dG9uPgoKICAgIDwvZGl2PgogICAgPCEtLSBFTkQgQ09OVFJPTCBCVVRUT05TIC0tPgoKCiAgICA8IS0tIFNDUlVCQkVSIEJBUiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICAgQ2xpY2sgYW55d2hlcmUgb24gdGhlIGJhciB0byBzZWVrLgogICAgICAgICBDbGljayBhbmQgZHJhZyB0aGUgcmVkIGRvdCB0byBzY3J1Yi4gICAgICAgICAgICAgICAgLS0+CiAgICA8ZGl2IGNsYXNzPSJjZm1wLXNjcnViYmVyIiBpZD0iY2ZtcC1zY3J1YmJlciI+CiAgICAgIDxkaXYgY2xhc3M9ImNmbXAtdHJhY2siPgogICAgICAgIDwhLS0gV2hpdGUgcHJvZ3Jlc3MgZmlsbCDigJQgd2lkdGggaXMgc2V0IGJ5IEpTIC0tPgogICAgICAgIDxkaXYgY2xhc3M9ImNmbXAtZmlsbCIgaWQ9ImNmbXAtZmlsbCI+PC9kaXY+CiAgICAgICAgPCEtLSBSZWQgZG90IGhhbmRsZSDigJQgbGVmdCBwb3NpdGlvbiBpcyBzZXQgYnkgSlMgLS0+CiAgICAgICAgPGRpdiBjbGFzcz0iY2ZtcC1oYW5kbGUiIGlkPSJjZm1wLWhhbmRsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8IS0tIEVORCBTQ1JVQkJFUiBCQVIgLS0+CgoKICAgIDwhLS0gVElNRSBESVNQTEFZIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICBMZWZ0IHNwYW4gPSBjdXJyZW50IHBsYXliYWNrIHRpbWUgKGUuZy4gMDowOSkKICAgICAgICAgUmlnaHQgc3BhbiA9IHRvdGFsIHNvbmcgZHVyYXRpb24gKGUuZy4gMzoxMikKICAgICAgICAgQm90aCBhcmUgdXBkYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IEpTLiAgICAgICAgICAgICAgLS0+CiAgICA8ZGl2IGNsYXNzPSJjZm1wLXRpbWUiPgogICAgICA8c3BhbiBpZD0iY2ZtcC1jdXIiPjA6MDA8L3NwYW4+ICAgPCEtLSBjdXJyZW50IHRpbWUg4oCUIGxlZnQgc2lkZSAtLT4KICAgICAgPHNwYW4gaWQ9ImNmbXAtZHVyIj4wOjAwPC9zcGFuPiAgIDwhLS0gdG90YWwgZHVyYXRpb24g4oCUIHJpZ2h0IHNpZGUgLS0+CiAgICA8L2Rpdj4KICAgIDwhLS0gRU5EIFRJTUUgRElTUExBWSAtLT4KCgogICAgPCEtLSBBVURJTyBFTEVNRU5UIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICBIaWRkZW4g4oCUIHRoZSBhY3R1YWwgYXVkaW8gZW5naW5lLiBVcGRhdGUgc3JjIGJlbG93LgoKICAgICAgICAg4pqgIEdPT0dMRSBEUklWRSBOT1RFOgogICAgICAgICBJZiBubyBzb3VuZCBwbGF5cywgR29vZ2xlIERyaXZlIG1heSBiZSBibG9ja2luZyB0aGUKICAgICAgICAgYnJvd3NlciBmcm9tIGxvYWRpbmcgdGhlIGZpbGUgY3Jvc3Mtb3JpZ2luLiBGaXg6CiAgICAgICAgIDEuIFVwbG9hZCBNUDMgdG8gV29yZFByZXNzIE1lZGlhIExpYnJhcnkKICAgICAgICAgMi4gQ29weSB0aGUgVVJMIGl0IGdpdmVzIHlvdSAoZW5kcyBpbiAubXAzKQogICAgICAgICAzLiBSZXBsYWNlIHRoZSBzcmMgYmVsb3cgd2l0aCB0aGF0IFVSTCAgICAgICAgICAgIC0tPgogICAgPGF1ZGlvIGlkPSJjZm1wLWF1ZGlvIiBwcmVsb2FkPSJtZXRhZGF0YSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CiAgICAgIDxzb3VyY2UKICAgICAgICBzcmM9Imh0dHBzOi8vaG9uZXN0cGhhcm1jby5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDYvRWQtU2hlZXJhbi1CYWQtSGFiaXRzLThELUFVRElPLm1wMyIKICAgICAgICB0eXBlPSJhdWRpby9tcGVnIj4KICAgIDwvYXVkaW8+CiAgICA8IS0tIEVORCBBVURJTyBFTEVNRU5UIC0tPgoKCiAgPC9kaXY+CiAgPCEtLSBFTkQgSU5ORVIgQk9EWSAtLT4KPC9kaXY+CjwhLS0gRU5EIFBMQVlFUiBST09UIC0tPgoKCjwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBTRUNUSU9OIDMg4oCUIEpBVkFTQ1JJUFQKICAgICBBbGwgcGxheWVyIGxvZ2ljOiBwbGF5L3BhdXNlLCBzY3J1YmJpbmcsIHRpbWUgZm9ybWF0dGluZy4KICAgICBZb3Ugc2hvdWxkIG5vdCBuZWVkIHRvIGVkaXQgdGhpcyBzZWN0aW9uIHVubGVzcyB5b3Ugd2FudAogICAgIHRvIGFkZCBwbGF5bGlzdCBmdW5jdGlvbmFsaXR5LgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgo8c2NyaXB0PgooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyog4pSA4pSAIFNURVAgMTogR1JBQiBBTEwgRUxFTUVOVFMgRlJPTSBUSEUgRE9NIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwogIHZhciBhdWRpbyAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZm1wLWF1ZGlvJyk7ICAgIC8vIHRoZSA8YXVkaW8+IGVuZ2luZQogIHZhciBwbGF5QnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZm1wLXBsYXknKTsgICAgIC8vIHBsYXkvcGF1c2UgYnV0dG9uCiAgdmFyIHBsYXlTdmcgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NmbXAtcGxheS1zdmcnKTsgLy8gU1ZHIGluc2lkZSBwbGF5IGJ1dHRvbgogIHZhciBwcmV2QnRuICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZm1wLXByZXYnKTsgICAgIC8vIHByZXZpb3VzL3Jlc3RhcnQgYnV0dG9uCiAgdmFyIG5leHRCdG4gID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NmbXAtbmV4dCcpOyAgICAgLy8gbmV4dC9za2lwIGJ1dHRvbgogIHZhciBzY3J1YmJlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZm1wLXNjcnViYmVyJyk7IC8vIHNjcnViYmVyIGNsaWNrIHpvbmUKICB2YXIgZmlsbCAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2ZtcC1maWxsJyk7ICAgICAvLyBwcm9ncmVzcyBmaWxsIGJhcgogIHZhciBoYW5kbGUgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZm1wLWhhbmRsZScpOyAgIC8vIHJlZCBjaXJjbGUgZG90CiAgdmFyIGN1ckVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NmbXAtY3VyJyk7ICAgICAgLy8gY3VycmVudCB0aW1lIGxhYmVsCiAgdmFyIGR1ckVsICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NmbXAtZHVyJyk7ICAgICAgLy8gdG90YWwgZHVyYXRpb24gbGFiZWwKCgogIC8qIOKUgOKUgCBTVEVQIDI6IFNWRyBQQVRIUyBGT1IgUExBWSBBTkQgUEFVU0UgSUNPTlMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCiAgLyogVGhlc2UgZ2V0IHN3YXBwZWQgaW50byB0aGUgcGxheSBidXR0b24gU1ZHIG9uIGNsaWNrICAgICAgICAgICovCiAgdmFyIFBMQVlfUEFUSCAgPSAnPHBhdGggZD0iTTggNXYxNGwxMS03eiIvPic7ICAgICAgICAgICAgICAgICAgICAvKiDilrYgdHJpYW5nbGUgICAqLwogIHZhciBQQVVTRV9QQVRIID0gJzxwYXRoIGQ9Ik02IDE5aDRWNUg2djE0em04LTE0djE0aDRWNWgtNHoiLz4nOyAvKiDij7ggdHdvIGJhcnMgICovCgoKICAvKiDilIDilIAgU1RFUCAzOiBQTEFZRVIgU1RBVEUgVkFSSUFCTEVTIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwogIHZhciBpc1BsYXlpbmcgPSBmYWxzZTsgIC8qIHRydWUgd2hpbGUgYXVkaW8gaXMgcGxheWluZyAgICAgICAqLwogIHZhciBkcmFnZ2luZyAgPSBmYWxzZTsgIC8qIHRydWUgd2hpbGUgdXNlciBkcmFncyB0aGUgaGFuZGxlICAqLwoKCiAgLyog4pSA4pSAIFNURVAgNDogSEVMUEVSIOKAlCBGT1JNQVQgU0VDT05EUyBUTyBtOnNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwogIC8qIEV4YW1wbGU6IGZvcm1hdFRpbWUoMTI1KSByZXR1cm5zICIyOjA1IiAgICAgICAgICAgICAgICAgICAgICAqLwogIGZ1bmN0aW9uIGZvcm1hdFRpbWUoc2Vjb25kcykgewogICAgaWYgKGlzTmFOKHNlY29uZHMpIHx8ICFpc0Zpbml0ZShzZWNvbmRzKSkgcmV0dXJuICcwOjAwJzsKICAgIHZhciBtICAgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7CiAgICB2YXIgcyAgID0gTWF0aC5mbG9vcihzZWNvbmRzICUgNjApOwogICAgcmV0dXJuIG0gKyAnOicgKyAocyA8IDEwID8gJzAnIDogJycpICsgczsKICB9CgoKICAvKiDilIDilIAgU1RFUCA1OiBIRUxQRVIg4oCUIE1PVkUgU0NSVUJCRVIgVE8gUEVSQ0VOVEFHRSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KICAvKiBwY3Q6IDAgKHN0YXJ0KSB0byAxMDAgKGVuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBmdW5jdGlvbiBzZXRQcm9ncmVzcyhwY3QpIHsKICAgIGZpbGwuc3R5bGUud2lkdGggID0gcGN0ICsgJyUnOyAgIC8qIGdyb3cgdGhlIHdoaXRlIGZpbGwgYmFyICAgICAqLwogICAgaGFuZGxlLnN0eWxlLmxlZnQgPSBwY3QgKyAnJSc7ICAgLyogbW92ZSB0aGUgcmVkIGRvdCB0byBtYXRjaCAgICovCiAgfQoKCiAgLyog4pSA4pSAIFNURVAgNjogSEVMUEVSIOKAlCBTRUVLIFRPIEEgSE9SSVpPTlRBTCBQT1NJVElPTiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KICAvKiBjbGllbnRYOiB0aGUgbW91c2Ugb3IgdG91Y2ggWCBwb3NpdGlvbiBvbiB0aGUgcGFnZSAgICAgICAgICAgKi8KICBmdW5jdGlvbiBzZWVrRnJvbVgoY2xpZW50WCkgewogICAgdmFyIHRyYWNrID0gc2NydWJiZXIucXVlcnlTZWxlY3RvcignLmNmbXAtdHJhY2snKTsKICAgIHZhciByZWN0ICA9IHRyYWNrLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgLyogY2xhbXAgdG8gMOKAkzEgc28gc2Vla2luZyBuZXZlciBnb2VzIG91dCBvZiBib3VuZHMgKi8KICAgIHZhciByYXRpbyA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChjbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGgpKTsKICAgIGlmIChhdWRpby5kdXJhdGlvbikgewogICAgICBhdWRpby5jdXJyZW50VGltZSA9IHJhdGlvICogYXVkaW8uZHVyYXRpb247ICAvKiBqdW1wIGF1ZGlvIHRvIHRoYXQgc3BvdCAqLwogICAgfQogIH0KCgogIC8qIOKUgOKUgCBTVEVQIDc6IEFVRElPIEVWRU5UIExJU1RFTkVSUyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCiAgLyogRmlyZXMgb25jZSB3aGVuIHRoZSBicm93c2VyIGtub3dzIHRoZSBmaWxlIGxlbmd0aCAgICAgICAgICAgICovCiAgYXVkaW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBmdW5jdGlvbiAoKSB7CiAgICBkdXJFbC50ZXh0Q29udGVudCA9IGZvcm1hdFRpbWUoYXVkaW8uZHVyYXRpb24pOyAgLyogc2hvdyB0b3RhbCBkdXJhdGlvbiAqLwogIH0pOwoKICAvKiBGaXJlcyBjb250aW51b3VzbHkgd2hpbGUgYXVkaW8gcGxheXMgKH40eCBwZXIgc2Vjb25kKSAgICAgICAgKi8KICBhdWRpby5hZGRFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgZnVuY3Rpb24gKCkgewogICAgaWYgKCFhdWRpby5kdXJhdGlvbikgcmV0dXJuOwogICAgdmFyIHBjdCA9IChhdWRpby5jdXJyZW50VGltZSAvIGF1ZGlvLmR1cmF0aW9uKSAqIDEwMDsKICAgIHNldFByb2dyZXNzKHBjdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92ZSB0aGUgc2NydWJiZXIgZG90ICAqLwogICAgY3VyRWwudGV4dENvbnRlbnQgPSBmb3JtYXRUaW1lKGF1ZGlvLmN1cnJlbnRUaW1lKTsgLyogdXBkYXRlIHRpbWUgbGFiZWwgKi8KICB9KTsKCiAgLyogRmlyZXMgd2hlbiB0aGUgc29uZyBmaW5pc2hlcyBwbGF5aW5nICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgYXVkaW8uYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBmdW5jdGlvbiAoKSB7CiAgICBpc1BsYXlpbmcgICAgICAgICA9IGZhbHNlOwogICAgcGxheVN2Zy5pbm5lckhUTUwgPSBQTEFZX1BBVEg7ICAvKiBzd2l0Y2ggYmFjayB0byBwbGF5IGljb24gKi8KICAgIHNldFByb2dyZXNzKDApOyAgICAgICAgICAgICAgICAgLyogcmVzZXQgc2NydWJiZXIgdG8gc3RhcnQgICovCiAgICBjdXJFbC50ZXh0Q29udGVudCA9ICcwOjAwJzsKICB9KTsKCgogIC8qIOKUgOKUgCBTVEVQIDg6IFBMQVkgLyBQQVVTRSBCVVRUT04gQ0xJQ0sg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCiAgcGxheUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgIGlmIChpc1BsYXlpbmcpIHsKICAgICAgLyogQ3VycmVudGx5IHBsYXlpbmcg4oaSIHBhdXNlIGl0ICovCiAgICAgIGF1ZGlvLnBhdXNlKCk7CiAgICAgIGlzUGxheWluZyAgICAgICAgID0gZmFsc2U7CiAgICAgIHBsYXlTdmcuaW5uZXJIVE1MID0gUExBWV9QQVRIOyAgICAvKiBzaG93IOKWtiBpY29uICovCiAgICB9IGVsc2UgewogICAgICAvKiBDdXJyZW50bHkgcGF1c2VkIOKGkiBwbGF5IGl0ICovCiAgICAgIGF1ZGlvLnBsYXkoKTsKICAgICAgaXNQbGF5aW5nICAgICAgICAgPSB0cnVlOwogICAgICBwbGF5U3ZnLmlubmVySFRNTCA9IFBBVVNFX1BBVEg7ICAgLyogc2hvdyDij7ggaWNvbiAqLwogICAgfQogIH0pOwoKCiAgLyog4pSA4pSAIFNURVAgOTogUFJFVklPVVMgQlVUVE9OIENMSUNLIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwogIC8qIFJlc3RhcnRzIHRoZSBjdXJyZW50IHRyYWNrIGZyb20gMDowMAogICAgIFRvIGFkZCBhIGZ1bGwgcGxheWxpc3Q6IGxvYWQgbmV4dCBhdWRpby5zcmMgaGVyZSBpbnN0ZWFkICAgICovCiAgcHJldkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgIGF1ZGlvLmN1cnJlbnRUaW1lID0gMDsgICAgICAgICAvKiBqdW1wIGJhY2sgdG8gc3RhcnQgKi8KICAgIGlmICghaXNQbGF5aW5nKSB7CiAgICAgIC8qIGF1dG8tc3RhcnQgaWYgc29uZyB3YXNuJ3QgcGxheWluZyAqLwogICAgICBhdWRpby5wbGF5KCk7CiAgICAgIGlzUGxheWluZyAgICAgICAgID0gdHJ1ZTsKICAgICAgcGxheVN2Zy5pbm5lckhUTUwgPSBQQVVTRV9QQVRIOwogICAgfQogIH0pOwoKCiAgLyog4pSA4pSAIFNURVAgMTA6IE5FWFQgQlVUVE9OIENMSUNLIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwogIC8qIEp1bXBzIHRvIHRoZSBlbmQgKHRyaWdnZXJzIHRoZSAnZW5kZWQnIGV2ZW50IGFib3ZlKQogICAgIFRvIGFkZCBhIGZ1bGwgcGxheWxpc3Q6IGxvYWQgbmV4dCB0cmFjaydzIHNyYyBoZXJlIGluc3RlYWQgICovCiAgbmV4dEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgIGlmIChhdWRpby5kdXJhdGlvbikgewogICAgICBhdWRpby5jdXJyZW50VGltZSA9IGF1ZGlvLmR1cmF0aW9uOyAgLyogc2tpcCB0byBlbmQgb2YgdHJhY2sgKi8KICAgIH0KICB9KTsKCgogIC8qIOKUgOKUgCBTVEVQIDExOiBTQ1JVQkJFUiDigJQgTU9VU0UgRVZFTlRTIChkZXNrdG9wKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCiAgLyogU3RhcnQgYSBkcmFnIG9uIG1vdXNlZG93biBhbnl3aGVyZSBvbiB0aGUgc2NydWJiZXIgKi8KICBzY3J1YmJlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBmdW5jdGlvbiAoZSkgewogICAgZHJhZ2dpbmcgPSB0cnVlOwogICAgc2Vla0Zyb21YKGUuY2xpZW50WCk7ICAgLyogaW1tZWRpYXRlbHkganVtcCB0byBjbGlja2VkIHBvc2l0aW9uICovCiAgfSk7CgogIC8qIEtlZXAgc2Vla2luZyB3aGlsZSB0aGUgbW91c2UgbW92ZXMgKGV2ZW4gb3V0c2lkZSBzY3J1YmJlcikgKi8KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBmdW5jdGlvbiAoZSkgewogICAgaWYgKGRyYWdnaW5nKSBzZWVrRnJvbVgoZS5jbGllbnRYKTsKICB9KTsKCiAgLyogU3RvcCB0aGUgZHJhZyB3aGVuIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZCAqLwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBmdW5jdGlvbiAoKSB7CiAgICBkcmFnZ2luZyA9IGZhbHNlOwogIH0pOwoKCiAgLyog4pSA4pSAIFNURVAgMTI6IFNDUlVCQkVSIOKAlCBUT1VDSCBFVkVOVFMgKG1vYmlsZS90YWJsZXQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKICAvKiBTdGFydCBzZWVrIG9uIGZpcnN0IHRvdWNoICovCiAgc2NydWJiZXIuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGZ1bmN0aW9uIChlKSB7CiAgICBzZWVrRnJvbVgoZS50b3VjaGVzWzBdLmNsaWVudFgpOwogIH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTsKCiAgLyogQ29udGludWUgc2Vla2luZyBhcyBmaW5nZXIgbW92ZXMKICAgICBwYXNzaXZlOiBmYWxzZSBzbyB3ZSBjYW4gY2FsbCBwcmV2ZW50RGVmYXVsdCgpIHRvIHN0b3AKICAgICB0aGUgcGFnZSBmcm9tIHNjcm9sbGluZyB3aGlsZSB0aGUgdXNlciBzY3J1YnMgICAgICAgICAgICAgKi8KICBzY3J1YmJlci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoZSkgewogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgc2Vla0Zyb21YKGUudG91Y2hlc1swXS5jbGllbnRYKTsKICB9LCB7IHBhc3NpdmU6IGZhbHNlIH0pOwoKCn0pKCk7IC8qIHNlbGYtaW52b2tpbmcgd3JhcHBlcjoga2VlcHMgYWxsIHZhcmlhYmxlcyBwcml2YXRlICovCjwvc2NyaXB0Pgo8IS0tIEVORCBTRUNUSU9OIDM6IEpBVkFTQ1JJUFQgLS0+Cgo8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIEVORCBDRiBNVVNJQyBQTEFZRVIKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cg==
Read MoreHere's every QR code URL. Note that 2 products are still missing QR codes from the spreadsheet — 3.5g Blue Dream and 1g Bodega.O Puma Blunt — same ones missing…
Read More
