VC Examples
< Back
Gift card
Credential
{ "@context": [ "https://www.w3.org/ns/credentials/v2", "https://w3id.org/retail-dw/v1rc5", "https://w3id.org/vc/render-method/v2rc2" ], "type": [ "VerifiableCredential", "RetailCredential" ], "issuer": { "id": "did:example:maverikissuer123", "name": "Maverik", "description": "Digital verifiable gift card issuer solutions" }, "name": "Digital Gift Card", "description": "A verifiable digital gift card redeemable at Maverik.", "validFrom": "2025-07-15T00:00:00Z", "validUntil": "2030-12-31T23:59:59Z", "credentialSubject": { "type": "GiftCard", "account": "789123456", "barcodeData": "567789123456", "description": "Prepaid gift card redeemable for purchases at Maverik.", "name": "Maverik Gift Card", "programIdentifier": "567" }, "renderMethod": [ { "name": "Front", "type": "TemplateRenderMethod", "renderSuite": "html", "mediaType": "text/html", "renderProperty": [ "/name", "/description", "/validUntil" ], "template": "data:text/html;base64,PCEtLSAgTWF2ZXJpayBHaWZ0IENhcmQg4oCUIEZyb250ICAtLT4KPGRpdiBjbGFzcz0iZ2Mtd3JhcCI+CiAgPHN0eWxlPgogICAgLmdjLXdyYXAgeyBtYXJnaW46IDAgYXV0bzsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CiAgICAgIHdpZHRoOiAxMDAlOyBtYXgtd2lkdGg6IDQwMHB4OyBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7IH0KICAgIC5nYy1mYWNlIHsgd2lkdGg6IDEwMCU7IGhlaWdodDogNjBjcXc7IGJvcmRlci1yYWRpdXM6IDRjcXc7IHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsgYm94LXNoYWRvdzogMCAxLjVjcXcgNWNxdyByZ2JhKDAsMCwwLC4yNSk7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIGNvbG9yOiAjZmZmOyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjOWUxMTE2IDAlLCAjZTEyNTFiIDU1JSwgI2I1MWExZiAxMDAlKTsgfQogICAgLnJpYmJvbi1oIHsgcG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAwOyByaWdodDogMDsgdG9wOiAzNy41Y3F3OyBoZWlnaHQ6IDcuNWNxdzsKICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCByZ2JhKDIxMiwxNjAsMjMsLjk1KSwgcmdiYSgyNDIsMjAxLDc2LC45KSk7IG9wYWNpdHk6IC45OyB9CiAgICAucmliYm9uLXYgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgYm90dG9tOiAwOyBsZWZ0OiAxNy41Y3F3OyB3aWR0aDogNy41Y3F3OwogICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHJnYmEoMjEyLDE2MCwyMywuOTUpLCByZ2JhKDI0MiwyMDEsNzYsLjkpKTsgb3BhY2l0eTogLjQ7IH0KICAgIC5nYy1sb2dvIHsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDVjcXc7IHJpZ2h0OiA1LjVjcXc7IHdpZHRoOiAyM2NxdzsgfQogICAgLmdjLWxvZ28gc3ZnIHsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IGF1dG87IH0KICAgIC5ib2R5IHsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDYuNWNxdzsgbGVmdDogNy41Y3F3OyByaWdodDogMzBjcXc7IH0KICAgIC5nYy1raWNrZXIgeyBmb250LXNpemU6IDIuNWNxdzsgbGV0dGVyLXNwYWNpbmc6IDAuNWNxdzsgb3BhY2l0eTogLjg1OyBtYXJnaW4tYm90dG9tOiAxY3F3OyB9CiAgICAuZ2MtdGl0bGUgeyBmb250LXNpemU6IDZjcXc7IGZvbnQtd2VpZ2h0OiA3MDA7IGxpbmUtaGVpZ2h0OiAxLjE7IH0KICAgIC5nYy1kZXNjIHsgZm9udC1zaXplOiAyLjc1Y3F3OyBvcGFjaXR5OiAuOTI7IG1hcmdpbi10b3A6IDEuNWNxdzsgfQogICAgLmZvb3QgeyBwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDcuNWNxdzsgYm90dG9tOiA1Y3F3OyB9CiAgICAuZ2MtbGFiZWwgeyBmb250LXNpemU6IDIuMjVjcXc7IGxldHRlci1zcGFjaW5nOiAwLjI1Y3F3OyBvcGFjaXR5OiAuODsgfQogICAgLmdjLXZhbGlkIHsgZm9udC1zaXplOiA0Y3F3OyBmb250LXdlaWdodDogNzAwOyB9CiAgPC9zdHlsZT4KCiAgPGRpdiBjbGFzcz0iZ2MtZmFjZSI+CiAgICA8ZGl2IGNsYXNzPSJyaWJib24tdiI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJyaWJib24taCI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJnYy1sb2dvIj4KICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMTU1IDYwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICA8cGF0aCBmaWxsPSIjZmZmZmZmIiBkPSJtNjUuOSA1OS42OCA3LjM0LTEyLjcyIDcuMzQgMTIuNzJ6bS05LjU3IDAgMTIuMTMtMjEgMy4zNyA1Ljg1LTguNzQgMTUuMTV6bTI3LjA2IDAtOC43NS0xNS4xNSA2LjM4LTExLjA0IDE1LjEyIDI2LjE5em0zOC40OC0yNy45NFYuMDFoLTguMDd2MjguOThjMi44LjgzIDUuNDkgMS43NSA4LjA3IDIuNzVtMTIuMyA1Ljg0VjIyLjY2YzMuMi40NSA0LjcxIDMuOCA0LjcxIDUuOTMgMCAwIC4yMyA3LjY2LjM1IDEyLjIyIDMuMjQgMi4yOCA2LjA3IDQuNzQgOC40NCA3LjM0LjEuMS4yMi4yLjMyLjMtLjA4LTUuMDQtLjIzLTE0LjIyLS4zLTE3LjAyLS4xOS02Ljk3LTEuNTUtMTEuNzMtNi4xNi0xMy42OWw4LTE3Ljc0aC04Ljc3bC02LjU5IDE0LjYzVjBoLTguNjN2MzMuMjVjMy4wOCAxLjMzIDUuOTYgMi43OCA4LjYzIDQuMzNNOTguNDUgMjUuNDVsLjA3LTkuNzFzMS4yNy4xIDEuODkuMmMxLjY2LjI5IDIuMTUgMS4zMSAyLjI3IDMuNjcuMDcgMS4zOC4xNSA0LjY0LjE5IDYuNjUgMi43My41NSA1LjQgMS4xOCA3Ljk4IDEuODgtLjEtMi40Ni0uMjYtNi41Mi0uMzQtOC4wNi0uMTktMy41My0yLjgyLTUuNDYtMy44My01Ljk1IDEuNjQtLjUyIDMuODItMy4yNiAzLjgyLTYuNSAwLTUuMjItMi4xNC03LjU5LTkuMzgtNy41OUM5Ni43MiAwIDkxLjM0IDAgOTEuMzQgMHYyNC40NWMyLjQxLjI4IDQuNzguNjEgNy4xMSAxbS4xNC0yMC4yNHMxLS4wMSAxLjgyLS4wMWMxLjM5IDAgMy4xMS41OSAzLjExIDIuNDYgMCAyLjAzLS44NiAzLjAzLTMuMzQgMy4wMS0uNTMtLjAzLTEuNi0uMS0xLjYtLjF6TTM2Ljc1IDI4LjI3bC43LTQuNSA1Ljc4LTEuMjkuOTIgNGMyLjQ2LS41MiA0Ljk4LS45OCA3LjU2LTEuMzdMNDQuNzEgMEgzMy44OEwyOC43IDMwLjgxYzIuNTgtLjkyIDUuMjctMS43NyA4LjA1LTIuNTRtMy4xNC0yMC4zMSAyLjEzIDkuMjYtMy42Ny43MnptMzQuMTUgMTUuNWguMDljMS4xOSAwIDIuMzcuMDIgMy41NC4wNGguMDhxNS40NDUuMTM1IDEwLjY4LjYzYzAtMS41Ni0uMDEtNS41MS0uMDEtNi4xMi0yLjY1LS4xNy02LjcyLS4zNC04LjYtLjM4di0zLjZsNS43NS4xVjkuMmgtNS43MVY1LjY0aDguNTdWMEg3Mi45MXYyMy40N2MuMzggMCAuNzUtLjAxIDEuMTMtLjAxTTE3LjkgMGwtNC4yMiAxMS43OUw5LjM5IDBILjAxQy4wMSA5LjIgMCAzNi45NiAwIDQ4LjYxYzIuMzctMi42OCA1LjIzLTUuMjEgOC41MS03LjU2VjE2LjlsNC4wNSAxMC43MiAyLjUxLTEuMTEgMy44Mi0xMS4xNC4wMSAxOS41NGMyLjQ5LTEuMjIgNS4xMi0yLjM1IDcuODgtMy40VjB6bTQ1LjYyIDBMNjAuNyAxNS4yNyA1Ni44NyAwaC04LjEzbDYuOTIgMjQuNTdjMy4zMi0uNDEgNi43Mi0uNzEgMTAuMTgtLjg5TDcxLjAyIDB6Ii8+CiAgICAgIDwvc3ZnPgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJib2R5Ij4KICAgICAgPGRpdiBjbGFzcz0iZ2Mta2lja2VyIj5HSUZUIENBUkQ8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZ2MtdGl0bGUiIGlkPSJnYy1uYW1lIj48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZ2MtZGVzYyIgaWQ9ImdjLWRlc2MiPjwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJmb290Ij4KICAgICAgPGRpdiBjbGFzcz0iZ2MtbGFiZWwiPlZBTElEIFRIUlU8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZ2MtdmFsaWQiIGlkPSJnYy12YWxpZCI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KCiAgPHNjcmlwdD4KICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgYyA9IEpTT04ucGFyc2UoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigKICAgICAgICAgICdoZWFkID4gc2NyaXB0W25hbWU9ImNyZWRlbnRpYWwiXScpLmlubmVySFRNTCk7CiAgICAgICAgY29uc3Qgc2V0ID0gKGlkLCB2KSA9PiB7IGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwogICAgICAgICAgaWYgKGVsKSBlbC50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHYpOyB9OwogICAgICAgIHNldCgnZ2MtbmFtZScsIGMubmFtZSk7CiAgICAgICAgc2V0KCdnYy1kZXNjJywgYy5kZXNjcmlwdGlvbik7CiAgICAgICAgY29uc3QgdnUgPSBjLnZhbGlkVW50aWw7CiAgICAgICAgaWYgKHZ1KSB7IGNvbnN0IGQgPSBuZXcgRGF0ZSh2dSk7CiAgICAgICAgICBzZXQoJ2djLXZhbGlkJywgaXNOYU4oZCkgPyB2dQogICAgICAgICAgICA6IFN0cmluZyhkLmdldFVUQ01vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpICsgJy8nICsgZC5nZXRVVENGdWxsWWVhcigpKTsgfQogICAgICAgIHdpbmRvdy5yZW5kZXJNZXRob2RSZWFkeSgpOwogICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBpZiAod2luZG93LnJlbmRlck1ldGhvZFJlYWR5KQogICAgICAgICAgd2luZG93LnJlbmRlck1ldGhvZFJlYWR5KGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKFN0cmluZyhlcnIpKSk7CiAgICAgIH0KICAgIH0pOwogIDwvc2NyaXB0Pgo8L2Rpdj4=", "outputPreference": { "mode": [ "visual" ], "mediaType": "application/html" } }, { "name": "Back", "type": "TemplateRenderMethod", "renderSuite": "html", "mediaType": "text/html", "renderProperty": [ "/issuer/name", "/credentialSubject/account", "/credentialSubject/barcodeData" ], "template": "data:text/html;base64,PHNjcmlwdD4vKiEgSnNCYXJjb2RlIHYzLjEyLjMgfCAoYykgSm9oYW4gTGluZGVsbCB8IE1JVCBsaWNlbnNlICovCiFmdW5jdGlvbih0KXt2YXIgZT17fTtmdW5jdGlvbiBuKHIpe2lmKGVbcl0pcmV0dXJuIGVbcl0uZXhwb3J0czt2YXIgbz1lW3JdPXtpOnIsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gdFtyXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyxuKSxvLmw9ITAsby5leHBvcnRzfW4ubT10LG4uYz1lLG4uZD1mdW5jdGlvbih0LGUscil7bi5vKHQsZSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sbi5yPWZ1bmN0aW9uKHQpeyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbih0LGUpe2lmKDEmZSYmKHQ9bih0KSksOCZlKXJldHVybiB0O2lmKDQmZSYmIm9iamVjdCI9PXR5cGVvZiB0JiZ0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIHI9T2JqZWN0LmNyZWF0ZShudWxsKTtpZihuLnIociksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KSwyJmUmJiJzdHJpbmciIT10eXBlb2YgdClmb3IodmFyIG8gaW4gdCluLmQocixvLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfS5iaW5kKG51bGwsbykpO3JldHVybiByfSxuLm49ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIG4uZChlLCJhIixlKSxlfSxuLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LG4ucD0iIixuKG4ucz03KX0oW2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI7ZnVuY3Rpb24gbyh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPWUuU0VUX0E9MCxhPWUuU0VUX0I9MSx1PWUuU0VUX0M9MixzPShlLlNISUZUPTk4LGUuU1RBUlRfQT0xMDMpLGY9ZS5TVEFSVF9CPTEwNCxjPWUuU1RBUlRfQz0xMDU7ZS5NT0RVTE89MTAzLGUuU1RPUD0xMDYsZS5GTkMxPTIwNyxlLlNFVF9CWV9DT0RFPShvKHI9e30scyxpKSxvKHIsZixhKSxvKHIsYyx1KSxyKSxlLlNXQVA9ezEwMTppLDEwMDphLDk5OnV9LGUuQV9TVEFSVF9DSEFSPVN0cmluZy5mcm9tQ2hhckNvZGUoMjA4KSxlLkJfU1RBUlRfQ0hBUj1TdHJpbmcuZnJvbUNoYXJDb2RlKDIwOSksZS5DX1NUQVJUX0NIQVI9U3RyaW5nLmZyb21DaGFyQ29kZSgyMTApLGUuQV9DSEFSUz0iW1wwLV/DiC3Dj10iLGUuQl9DSEFSUz0iWyAtf8OILcOPXSIsZS5DX0NIQVJTPSIow48qWzAtOV17Mn3DjyopIixlLkJBUlM9WzExMDExMDAxMTAwLDExMDAxMTAxMTAwLDExMDAxMTAwMTEwLDEwMDEwMDExZTMsMTAwMTAwMDExMDAsMTAwMDEwMDExMDAsMTAwMTEwMDFlMywxMDAxMTAwMDEwMCwxMDAwMTEwMDEwMCwxMTAwMTAwMWUzLDExMDAxMDAwMTAwLDExMDAwMTAwMTAwLDEwMTEwMDExMTAwLDEwMDExMDExMTAwLDEwMDExMDAxMTEwLDEwMTExMDAxMTAwLDEwMDExMTAxMTAwLDEwMDExMTAwMTEwLDExMDAxMTEwMDEwLDExMDAxMDExMTAwLDExMDAxMDAxMTEwLDExMDExMTAwMTAwLDExMDAxMTEwMTAwLDExMTAxMTAxMTEwLDExMTAxMDAxMTAwLDExMTAwMTAxMTAwLDExMTAwMTAwMTEwLDExMTAxMTAwMTAwLDExMTAwMTEwMTAwLDExMTAwMTEwMDEwLDExMDExMDExZTMsMTEwMTEwMDAxMTAsMTEwMDAxMTAxMTAsMTAxMDAwMTFlMywxMDAwMTAxMWUzLDEwMDAxMDAwMTEwLDEwMTEwMDAxZTMsMTAwMDExMDFlMywxMDAwMTEwMDAxMCwxMTAxMDAwMWUzLDExMDAwMTAxZTMsMTEwMDAxMDAwMTAsMTAxMTAxMTFlMywxMDExMDAwMTExMCwxMDAwMTEwMTExMCwxMDExMTAxMWUzLDEwMTExMDAwMTEwLDEwMDAxMTEwMTEwLDExMTAxMTEwMTEwLDExMDEwMDAxMTEwLDExMDAwMTAxMTEwLDExMDExMTAxZTMsMTEwMTExMDAwMTAsMTEwMTExMDExMTAsMTExMDEwMTFlMywxMTEwMTAwMDExMCwxMTEwMDAxMDExMCwxMTEwMTEwMWUzLDExMTAxMTAwMDEwLDExMTAwMDExMDEwLDExMTAxMTExMDEwLDExMDAxMDAwMDEwLDExMTEwMDAxMDEwLDEwMTAwMTFlNCwxMDEwMDAwMTEwMCwxMDAxMDExZTQsMTAwMTAwMDAxMTAsMTAwMDAxMDExMDAsMTAwMDAxMDAxMTAsMTAxMTAwMWU0LDEwMTEwMDAwMTAwLDEwMDExMDFlNCwxMDAxMTAwMDAxMCwxMDAwMDExMDEwMCwxMDAwMDExMDAxMCwxMTAwMDAxMDAxMCwxMTAwMTAxZTQsMTExMTAxMTEwMTAsMTEwMDAwMTAxMDAsMTAwMDExMTEwMTAsMTAxMDAxMTExMDAsMTAwMTAxMTExMDAsMTAwMTAwMTExMTAsMTAxMTExMDAxMDAsMTAwMTExMTAxMDAsMTAwMTExMTAwMTAsMTExMTAxMDAxMDAsMTExMTAwMTAxMDAsMTExMTAwMTAwMTAsMTEwMTEwMTExMTAsMTEwMTExMTAxMTAsMTExMTAxMTAxMTAsMTAxMDExMTFlMywxMDEwMDAxMTExMCwxMDAwMTAxMTExMCwxMDExMTEwMWUzLDEwMTExMTAwMDEwLDExMTEwMTAxZTMsMTExMTAxMDAwMTAsMTAxMTEwMTExMTAsMTAxMTExMDExMTAsMTExMDEwMTExMTAsMTExMTAxMDExMTAsMTEwMTAwMDAxMDAsMTEwMTAwMWU0LDExMDEwMDExMTAwLDExMDAwMTExMDEwMTFdfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcixvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fXJldHVybiBmdW5jdGlvbihlLG4scil7cmV0dXJuIG4mJnQoZS5wcm90b3R5cGUsbiksciYmdChlLHIpLGV9fSgpLGk9bigxMSksYT0ocj1pKSYmci5fX2VzTW9kdWxlP3I6e2RlZmF1bHQ6cn0sdT1uKDApO3ZhciBzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxuKXshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxlKTt2YXIgcj1mdW5jdGlvbih0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfSh0aGlzLChlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKS5jYWxsKHRoaXMsdC5zdWJzdHJpbmcoMSksbikpO3JldHVybiByLmJ5dGVzPXQuc3BsaXQoIiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2hhckNvZGVBdCgwKX0pKSxyfXJldHVybiBmdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9KGUsdCksbyhlLFt7a2V5OiJ2YWxpZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4vXltceDAwLVx4N0ZceEM4LVx4RDNdKyQvLnRlc3QodGhpcy5kYXRhKX19LHtrZXk6ImVuY29kZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ5dGVzLG49dC5zaGlmdCgpLTEwNSxyPXUuU0VUX0JZX0NPREVbbl07aWYodm9pZCAwPT09cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVGhlIGVuY29kaW5nIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBzdGFydCBjaGFyYWN0ZXIuIik7ITA9PT10aGlzLnNob3VsZEVuY29kZUFzRWFuMTI4KCkmJnQudW5zaGlmdCh1LkZOQzEpO3ZhciBvPWUubmV4dCh0LDEscik7cmV0dXJue3RleHQ6dGhpcy50ZXh0PT09dGhpcy5kYXRhP3RoaXMudGV4dC5yZXBsYWNlKC9bXlx4MjAtXHg3RV0vZywiIik6dGhpcy50ZXh0LGRhdGE6ZS5nZXRCYXIobikrby5yZXN1bHQrZS5nZXRCYXIoKG8uY2hlY2tzdW0rbikldS5NT0RVTE8pK2UuZ2V0QmFyKHUuU1RPUCl9fX0se2tleToic2hvdWxkRW5jb2RlQXNFYW4xMjgiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLmVhbjEyOHx8ITE7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYodD0idHJ1ZSI9PT10LnRvTG93ZXJDYXNlKCkpLHR9fV0sW3trZXk6ImdldEJhciIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHUuQkFSU1t0XT91LkJBUlNbdF0udG9TdHJpbmcoKToiIn19LHtrZXk6ImNvcnJlY3RJbmRleCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZihlPT09dS5TRVRfQSl7dmFyIG49dC5zaGlmdCgpO3JldHVybiBuPDMyP24rNjQ6bi0zMn1yZXR1cm4gZT09PXUuU0VUX0I/dC5zaGlmdCgpLTMyOjEwKih0LnNoaWZ0KCktNDgpK3Quc2hpZnQoKS00OH19LHtrZXk6Im5leHQiLHZhbHVlOmZ1bmN0aW9uKHQsbixyKXtpZighdC5sZW5ndGgpcmV0dXJue3Jlc3VsdDoiIixjaGVja3N1bTowfTt2YXIgbz12b2lkIDAsaT12b2lkIDA7aWYodFswXT49MjAwKXtpPXQuc2hpZnQoKS0xMDU7dmFyIGE9dS5TV0FQW2ldO3ZvaWQgMCE9PWE/bz1lLm5leHQodCxuKzEsYSk6KHIhPT11LlNFVF9BJiZyIT09dS5TRVRfQnx8aSE9PXUuU0hJRlR8fCh0WzBdPXI9PT11LlNFVF9BP3RbMF0+OTU/dFswXS05Njp0WzBdOnRbMF08MzI/dFswXSs5Njp0WzBdKSxvPWUubmV4dCh0LG4rMSxyKSl9ZWxzZSBpPWUuY29ycmVjdEluZGV4KHQsciksbz1lLm5leHQodCxuKzEscik7dmFyIHM9aSpuO3JldHVybntyZXN1bHQ6ZS5nZXRCYXIoaSkrby5yZXN1bHQsY2hlY2tzdW06cytvLmNoZWNrc3VtfX19XSksZX0oYS5kZWZhdWx0KTtlLmRlZmF1bHQ9c30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49YXJndW1lbnRzW2VdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYodFtyXT1uW3JdKX1yZXR1cm4gdH07ZS5kZWZhdWx0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoe30sdCxlKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD1mdW5jdGlvbih0KXt2YXIgZT1bIndpZHRoIiwiaGVpZ2h0IiwidGV4dE1hcmdpbiIsImZvbnRTaXplIiwibWFyZ2luIiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0Il07Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKG49ZVtuXSwic3RyaW5nIj09dHlwZW9mIHRbbl0mJih0W25dPXBhcnNlSW50KHRbbl0sMTApKSk7InN0cmluZyI9PXR5cGVvZiB0LmRpc3BsYXlWYWx1ZSYmKHQuZGlzcGxheVZhbHVlPSJmYWxzZSIhPXQuZGlzcGxheVZhbHVlKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPXt3aWR0aDoyLGhlaWdodDoxMDAsZm9ybWF0OiJhdXRvIixkaXNwbGF5VmFsdWU6ITAsZm9udE9wdGlvbnM6IiIsZm9udDoibW9ub3NwYWNlIix0ZXh0OnZvaWQgMCx0ZXh0QWxpZ246ImNlbnRlciIsdGV4dFBvc2l0aW9uOiJib3R0b20iLHRleHRNYXJnaW46Mixmb250U2l6ZToyMCxiYWNrZ3JvdW5kOiIjZmZmZmZmIixsaW5lQ29sb3I6IiMwMDAwMDAiLG1hcmdpbjoxMCxtYXJnaW5Ub3A6dm9pZCAwLG1hcmdpbkJvdHRvbTp2b2lkIDAsbWFyZ2luTGVmdDp2b2lkIDAsbWFyZ2luUmlnaHQ6dm9pZCAwLHZhbGlkOmZ1bmN0aW9uKCl7fX07ZS5kZWZhdWx0PXJ9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZ2V0VG90YWxXaWR0aE9mRW5jb2RpbmdzPWUuY2FsY3VsYXRlRW5jb2RpbmdBdHRyaWJ1dGVzPWUuZ2V0QmFyY29kZVBhZGRpbmc9ZS5nZXRFbmNvZGluZ0hlaWdodD1lLmdldE1heGltdW1IZWlnaHRPZkVuY29kaW5ncz12b2lkIDA7dmFyIHIsbz1uKDIpLGk9KHI9bykmJnIuX19lc01vZHVsZT9yOntkZWZhdWx0OnJ9O2Z1bmN0aW9uIGEodCxlKXtyZXR1cm4gZS5oZWlnaHQrKGUuZGlzcGxheVZhbHVlJiZ0LnRleHQubGVuZ3RoPjA/ZS5mb250U2l6ZStlLnRleHRNYXJnaW46MCkrZS5tYXJnaW5Ub3ArZS5tYXJnaW5Cb3R0b219ZnVuY3Rpb24gdSh0LGUsbil7aWYobi5kaXNwbGF5VmFsdWUmJmU8dCl7aWYoImNlbnRlciI9PW4udGV4dEFsaWduKXJldHVybiBNYXRoLmZsb29yKCh0LWUpLzIpO2lmKCJsZWZ0Ij09bi50ZXh0QWxpZ24pcmV0dXJuIDA7aWYoInJpZ2h0Ij09bi50ZXh0QWxpZ24pcmV0dXJuIE1hdGguZmxvb3IodC1lKX1yZXR1cm4gMH1mdW5jdGlvbiBzKHQsZSxuKXt2YXIgcjtpZihuKXI9bjtlbHNle2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZG9jdW1lbnQpcmV0dXJuIDA7cj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpfXIuZm9udD1lLmZvbnRPcHRpb25zKyIgIitlLmZvbnRTaXplKyJweCAiK2UuZm9udDt2YXIgbz1yLm1lYXN1cmVUZXh0KHQpO3JldHVybiBvP28ud2lkdGg6MH1lLmdldE1heGltdW1IZWlnaHRPZkVuY29kaW5ncz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXS5oZWlnaHQ+ZSYmKGU9dFtuXS5oZWlnaHQpO3JldHVybiBlfSxlLmdldEVuY29kaW5nSGVpZ2h0PWEsZS5nZXRCYXJjb2RlUGFkZGluZz11LGUuY2FsY3VsYXRlRW5jb2RpbmdBdHRyaWJ1dGVzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG8sZj10W3JdLGM9KDAsaS5kZWZhdWx0KShlLGYub3B0aW9ucyk7bz1jLmRpc3BsYXlWYWx1ZT9zKGYudGV4dCxjLG4pOjA7dmFyIGw9Zi5kYXRhLmxlbmd0aCpjLndpZHRoO2Yud2lkdGg9TWF0aC5jZWlsKE1hdGgubWF4KG8sbCkpLGYuaGVpZ2h0PWEoZixjKSxmLmJhcmNvZGVQYWRkaW5nPXUobyxsLGMpfX0sZS5nZXRUb3RhbFdpZHRoT2ZFbmNvZGluZ3M9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj0wO248dC5sZW5ndGg7bisrKWUrPXRbbl0ud2lkdGg7cmV0dXJuIGV9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBvKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT90OmV9ZnVuY3Rpb24gaSh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBhPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxuKXtyKHRoaXMsZSk7dmFyIGk9byh0aGlzLChlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKS5jYWxsKHRoaXMpKTtyZXR1cm4gaS5uYW1lPSJJbnZhbGlkSW5wdXRFeGNlcHRpb24iLGkuc3ltYm9sb2d5PXQsaS5pbnB1dD1uLGkubWVzc2FnZT0nIicraS5pbnB1dCsnIiBpcyBub3QgYSB2YWxpZCBpbnB1dCBmb3IgJytpLnN5bWJvbG9neSxpfXJldHVybiBpKGUsRXJyb3IpLGV9KCksdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cih0aGlzLGUpO3ZhciB0PW8odGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuY2FsbCh0aGlzKSk7cmV0dXJuIHQubmFtZT0iSW52YWxpZEVsZW1lbnRFeGNlcHRpb24iLHQubWVzc2FnZT0iTm90IHN1cHBvcnRlZCB0eXBlIHRvIHJlbmRlciBvbiIsdH1yZXR1cm4gaShlLEVycm9yKSxlfSgpLHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3IodGhpcyxlKTt2YXIgdD1vKHRoaXMsKGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpLmNhbGwodGhpcykpO3JldHVybiB0Lm5hbWU9Ik5vRWxlbWVudEV4Y2VwdGlvbiIsdC5tZXNzYWdlPSJObyBlbGVtZW50IHRvIHJlbmRlciBvbi4iLHR9cmV0dXJuIGkoZSxFcnJvciksZX0oKTtlLkludmFsaWRJbnB1dEV4Y2VwdGlvbj1hLGUuSW52YWxpZEVsZW1lbnRFeGNlcHRpb249dSxlLk5vRWxlbWVudEV4Y2VwdGlvbj1zfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPWQobig4KSksbz1kKG4oMikpLGk9ZChuKDE2KSksYT1kKG4oMTcpKSx1PWQobigxOCkpLHM9ZChuKDMpKSxmPWQobigyNCkpLGM9big2KSxsPWQobig0KSk7ZnVuY3Rpb24gZCh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19dmFyIHA9ZnVuY3Rpb24oKXt9LGg9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBwO2lmKHZvaWQgMD09PXQpdGhyb3cgRXJyb3IoIk5vIGVsZW1lbnQgdG8gcmVuZGVyIG9uIHdhcyBwcm92aWRlZC4iKTtyZXR1cm4gci5fcmVuZGVyUHJvcGVydGllcz0oMCx1LmRlZmF1bHQpKHQpLHIuX2VuY29kaW5ncz1bXSxyLl9vcHRpb25zPWwuZGVmYXVsdCxyLl9lcnJvckhhbmRsZXI9bmV3IGYuZGVmYXVsdChyKSx2b2lkIDAhPT1lJiYoKG49bnx8e30pLmZvcm1hdHx8KG4uZm9ybWF0PWIoKSksci5vcHRpb25zKG4pW24uZm9ybWF0XShlLG4pLnJlbmRlcigpKSxyfTtmb3IodmFyIHYgaW4gaC5nZXRNb2R1bGU9ZnVuY3Rpb24odCl7cmV0dXJuIHIuZGVmYXVsdFt0XX0sci5kZWZhdWx0KXIuZGVmYXVsdC5oYXNPd25Qcm9wZXJ0eSh2KSYmZyhyLmRlZmF1bHQsdik7ZnVuY3Rpb24gZyh0LGUpe3AucHJvdG90eXBlW2VdPXAucHJvdG90eXBlW2UudG9VcHBlckNhc2UoKV09cC5wcm90b3R5cGVbZS50b0xvd2VyQ2FzZSgpXT1mdW5jdGlvbihuLHIpe3ZhciBpPXRoaXM7cmV0dXJuIGkuX2Vycm9ySGFuZGxlci53cmFwQmFyY29kZUNhbGwoKGZ1bmN0aW9uKCl7ci50ZXh0PXZvaWQgMD09PXIudGV4dD92b2lkIDA6IiIrci50ZXh0O3ZhciBhPSgwLG8uZGVmYXVsdCkoaS5fb3B0aW9ucyxyKTthPSgwLHMuZGVmYXVsdCkoYSk7dmFyIHU9dFtlXSxmPXkobix1LGEpO3JldHVybiBpLl9lbmNvZGluZ3MucHVzaChmKSxpfSkpfX1mdW5jdGlvbiB5KHQsZSxuKXt2YXIgcj1uZXcgZSh0PSIiK3Qsbik7aWYoIXIudmFsaWQoKSl0aHJvdyBuZXcgYy5JbnZhbGlkSW5wdXRFeGNlcHRpb24oci5jb25zdHJ1Y3Rvci5uYW1lLHQpO3ZhciBhPXIuZW5jb2RlKCk7YT0oMCxpLmRlZmF1bHQpKGEpO2Zvcih2YXIgdT0wO3U8YS5sZW5ndGg7dSsrKWFbdV0ub3B0aW9ucz0oMCxvLmRlZmF1bHQpKG4sYVt1XS5vcHRpb25zKTtyZXR1cm4gYX1mdW5jdGlvbiBiKCl7cmV0dXJuIHIuZGVmYXVsdC5DT0RFMTI4PyJDT0RFMTI4IjpPYmplY3Qua2V5cyhyLmRlZmF1bHQpWzBdfWZ1bmN0aW9uIF8odCxlLG4pe2U9KDAsaS5kZWZhdWx0KShlKTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdLm9wdGlvbnM9KDAsby5kZWZhdWx0KShuLGVbcl0ub3B0aW9ucyksKDAsYS5kZWZhdWx0KShlW3JdLm9wdGlvbnMpOygwLGEuZGVmYXVsdCkobiksbmV3KDAsdC5yZW5kZXJlcikodC5lbGVtZW50LGUsbikucmVuZGVyKCksdC5hZnRlclJlbmRlciYmdC5hZnRlclJlbmRlcigpfXAucHJvdG90eXBlLm9wdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX29wdGlvbnM9KDAsby5kZWZhdWx0KSh0aGlzLl9vcHRpb25zLHQpLHRoaXN9LHAucHJvdG90eXBlLmJsYW5rPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0KzEpLmpvaW4oIjAiKTtyZXR1cm4gdGhpcy5fZW5jb2RpbmdzLnB1c2goe2RhdGE6ZX0pLHRoaXN9LHAucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt2YXIgdDtpZih0aGlzLl9yZW5kZXJQcm9wZXJ0aWVzKWZvcih2YXIgZSBpbiBBcnJheS5pc0FycmF5KHRoaXMuX3JlbmRlclByb3BlcnRpZXMpfHwodGhpcy5fcmVuZGVyUHJvcGVydGllcz1bdGhpcy5fcmVuZGVyUHJvcGVydGllc10pLHRoaXMuX3JlbmRlclByb3BlcnRpZXMpe3Q9dGhpcy5fcmVuZGVyUHJvcGVydGllc1tlXTt2YXIgbj0oMCxvLmRlZmF1bHQpKHRoaXMuX29wdGlvbnMsdC5vcHRpb25zKTsiYXV0byI9PW4uZm9ybWF0JiYobi5mb3JtYXQ9YigpKSx0aGlzLl9lcnJvckhhbmRsZXIud3JhcEJhcmNvZGVDYWxsKChmdW5jdGlvbigpe3ZhciBlPXkobi52YWx1ZSxyLmRlZmF1bHRbbi5mb3JtYXQudG9VcHBlckNhc2UoKV0sbik7Xyh0LGUsbil9KSl9fSxwLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtpZighdGhpcy5fcmVuZGVyUHJvcGVydGllcyl0aHJvdyBuZXcgYy5Ob0VsZW1lbnRFeGNlcHRpb247aWYoQXJyYXkuaXNBcnJheSh0aGlzLl9yZW5kZXJQcm9wZXJ0aWVzKSlmb3IodmFyIHQ9MDt0PHRoaXMuX3JlbmRlclByb3BlcnRpZXMubGVuZ3RoO3QrKylfKHRoaXMuX3JlbmRlclByb3BlcnRpZXNbdF0sdGhpcy5fZW5jb2RpbmdzLHRoaXMuX29wdGlvbnMpO2Vsc2UgXyh0aGlzLl9yZW5kZXJQcm9wZXJ0aWVzLHRoaXMuX2VuY29kaW5ncyx0aGlzLl9vcHRpb25zKTtyZXR1cm4gdGhpc30scC5wcm90b3R5cGUuX2RlZmF1bHRzPWwuZGVmYXVsdCwidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5Kc0JhcmNvZGU9aCksInVuZGVmaW5lZCIhPXR5cGVvZiBqUXVlcnkmJihqUXVlcnkuZm4uSnNCYXJjb2RlPWZ1bmN0aW9uKHQsZSl7dmFyIG49W107cmV0dXJuIGpRdWVyeSh0aGlzKS5lYWNoKChmdW5jdGlvbigpe24ucHVzaCh0aGlzKX0pKSxoKG4sdCxlKX0pLHQuZXhwb3J0cz1ofSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDkpO2UuZGVmYXVsdD17Q09ERTEyODpyLkNPREUxMjgsQ09ERTEyOEE6ci5DT0RFMTI4QSxDT0RFMTI4QjpyLkNPREUxMjhCLENPREUxMjhDOnIuQ09ERTEyOEN9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLkNPREUxMjhDPWUuQ09ERTEyOEI9ZS5DT0RFMTI4QT1lLkNPREUxMjg9dm9pZCAwO3ZhciByPXUobigxMCkpLG89dShuKDEzKSksaT11KG4oMTQpKSxhPXUobigxNSkpO2Z1bmN0aW9uIHUodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWUuQ09ERTEyOD1yLmRlZmF1bHQsZS5DT0RFMTI4QT1vLmRlZmF1bHQsZS5DT0RFMTI4Qj1pLmRlZmF1bHQsZS5DT0RFMTI4Qz1hLmRlZmF1bHR9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWkobigxKSksbz1pKG4oMTIpKTtmdW5jdGlvbiBpKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1mdW5jdGlvbiBhKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT90OmV9dmFyIHU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LG4pe2lmKGZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsZSksL15bXHgwMC1ceDdGXHhDOC1ceEQzXSskLy50ZXN0KHQpKXZhciByPWEodGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuY2FsbCh0aGlzLCgwLG8uZGVmYXVsdCkodCksbikpO2Vsc2Ugcj1hKHRoaXMsKGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpLmNhbGwodGhpcyx0LG4pKTtyZXR1cm4gYShyKX1yZXR1cm4gZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfShlLHQpLGV9KHIuZGVmYXVsdCk7ZS5kZWZhdWx0PXV9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2UuZGVmYXVsdD1mdW5jdGlvbiB0KGUsbil7IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsdCksdGhpcy5kYXRhPWUsdGhpcy50ZXh0PW4udGV4dHx8ZSx0aGlzLm9wdGlvbnM9bn19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPW4oMCksbz1mdW5jdGlvbih0KXtyZXR1cm4gdC5tYXRjaChuZXcgUmVnRXhwKCJeIityLkFfQ0hBUlMrIioiKSlbMF0ubGVuZ3RofSxpPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hdGNoKG5ldyBSZWdFeHAoIl4iK3IuQl9DSEFSUysiKiIpKVswXS5sZW5ndGh9LGE9ZnVuY3Rpb24odCl7cmV0dXJuIHQubWF0Y2gobmV3IFJlZ0V4cCgiXiIrci5DX0NIQVJTKyIqIikpWzBdfTtmdW5jdGlvbiB1KHQsZSl7dmFyIG49ZT9yLkFfQ0hBUlM6ci5CX0NIQVJTLG89dC5tYXRjaChuZXcgUmVnRXhwKCJeKCIrbisiKz8pKChbMC05XXsyfSl7Mix9KShbXjAtOV18JCkiKSk7aWYobylyZXR1cm4gb1sxXStTdHJpbmcuZnJvbUNoYXJDb2RlKDIwNCkrcyh0LnN1YnN0cmluZyhvWzFdLmxlbmd0aCkpO3ZhciBpPXQubWF0Y2gobmV3IFJlZ0V4cCgiXiIrbisiKyIpKVswXTtyZXR1cm4gaS5sZW5ndGg9PT10Lmxlbmd0aD90OmkrU3RyaW5nLmZyb21DaGFyQ29kZShlPzIwNToyMDYpK3UodC5zdWJzdHJpbmcoaS5sZW5ndGgpLCFlKX1mdW5jdGlvbiBzKHQpe3ZhciBlPWEodCksbj1lLmxlbmd0aDtpZihuPT09dC5sZW5ndGgpcmV0dXJuIHQ7dD10LnN1YnN0cmluZyhuKTt2YXIgcj1vKHQpPj1pKHQpO3JldHVybiBlK1N0cmluZy5mcm9tQ2hhckNvZGUocj8yMDY6MjA1KSt1KHQscil9ZS5kZWZhdWx0PWZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZihhKHQpLmxlbmd0aD49MillPXIuQ19TVEFSVF9DSEFSK3ModCk7ZWxzZXt2YXIgbj1vKHQpPmkodCk7ZT0obj9yLkFfU1RBUlRfQ0hBUjpyLkJfU1RBUlRfQ0hBUikrdSh0LG4pfXJldHVybiBlLnJlcGxhY2UoL1tceENEXHhDRV0oW15dKVtceENEXHhDRV0vLChmdW5jdGlvbih0LGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDIwMykrZX0pKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gbiYmdChlLnByb3RvdHlwZSxuKSxyJiZ0KGUsciksZX19KCksaT1uKDEpLGE9KHI9aSkmJnIuX19lc01vZHVsZT9yOntkZWZhdWx0OnJ9LHU9bigwKTt2YXIgcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsbil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsZSksZnVuY3Rpb24odCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX0odGhpcywoZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSkuY2FsbCh0aGlzLHUuQV9TVEFSVF9DSEFSK3QsbikpfXJldHVybiBmdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIGUpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsZSk6dC5fX3Byb3RvX189ZSl9KGUsdCksbyhlLFt7a2V5OiJ2YWxpZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJlZ0V4cCgiXiIrdS5BX0NIQVJTKyIrJCIpLnRlc3QodGhpcy5kYXRhKX19XSksZX0oYS5kZWZhdWx0KTtlLmRlZmF1bHQ9c30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHIsbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24oZSxuLHIpe3JldHVybiBuJiZ0KGUucHJvdG90eXBlLG4pLHImJnQoZSxyKSxlfX0oKSxpPW4oMSksYT0ocj1pKSYmci5fX2VzTW9kdWxlP3I6e2RlZmF1bHQ6cn0sdT1uKDApO3ZhciBzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxuKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxlKSxmdW5jdGlvbih0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfSh0aGlzLChlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKS5jYWxsKHRoaXMsdS5CX1NUQVJUX0NIQVIrdCxuKSl9cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX0oZSx0KSxvKGUsW3trZXk6InZhbGlkIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgUmVnRXhwKCJeIit1LkJfQ0hBUlMrIiskIikudGVzdCh0aGlzLmRhdGEpfX1dKSxlfShhLmRlZmF1bHQpO2UuZGVmYXVsdD1zfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcixvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fXJldHVybiBmdW5jdGlvbihlLG4scil7cmV0dXJuIG4mJnQoZS5wcm90b3R5cGUsbiksciYmdChlLHIpLGV9fSgpLGk9bigxKSxhPShyPWkpJiZyLl9fZXNNb2R1bGU/cjp7ZGVmYXVsdDpyfSx1PW4oMCk7dmFyIHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LG4pe3JldHVybiBmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLGUpLGZ1bmN0aW9uKHQsZSl7aWYoIXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT90OmV9KHRoaXMsKGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpLmNhbGwodGhpcyx1LkNfU1RBUlRfQ0hBUit0LG4pKX1yZXR1cm4gZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfShlLHQpLG8oZSxbe2tleToidmFsaWQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBSZWdFeHAoIl4iK3UuQ19DSEFSUysiKyQiKS50ZXN0KHRoaXMuZGF0YSl9fV0pLGV9KGEuZGVmYXVsdCk7ZS5kZWZhdWx0PXN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD1mdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gZnVuY3Rpb24gdChuKXtpZihBcnJheS5pc0FycmF5KG4pKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXQobltyXSk7ZWxzZSBuLnRleHQ9bi50ZXh0fHwiIixuLmRhdGE9bi5kYXRhfHwiIixlLnB1c2gobil9KHQpLGV9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFyZ2luVG9wPXQubWFyZ2luVG9wfHx0Lm1hcmdpbix0Lm1hcmdpbkJvdHRvbT10Lm1hcmdpbkJvdHRvbXx8dC5tYXJnaW4sdC5tYXJnaW5SaWdodD10Lm1hcmdpblJpZ2h0fHx0Lm1hcmdpbix0Lm1hcmdpbkxlZnQ9dC5tYXJnaW5MZWZ0fHx0Lm1hcmdpbix0fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LG89dShuKDE5KSksaT11KG4oMjApKSxhPW4oNik7ZnVuY3Rpb24gdSh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gcyh0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCk7aWYoMD09PWUubGVuZ3RoKXJldHVybjtmb3IodmFyIG49W10scj0wO3I8ZS5sZW5ndGg7cisrKW4ucHVzaChzKGVbcl0pKTtyZXR1cm4gbn0odCk7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHZhciBlPVtdLG49MDtuPHQubGVuZ3RoO24rKyllLnB1c2gocyh0W25dKSk7cmV0dXJuIGV9aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpcmV0dXJuIHU9dCx7ZWxlbWVudDpmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLG9wdGlvbnM6KDAsby5kZWZhdWx0KSh1KSxyZW5kZXJlcjppLmRlZmF1bHQuQ2FudmFzUmVuZGVyZXIsYWZ0ZXJSZW5kZXI6ZnVuY3Rpb24oKXt1LnNldEF0dHJpYnV0ZSgic3JjIixmLnRvRGF0YVVSTCgpKX19O2lmKHQmJnQubm9kZU5hbWUmJiJzdmciPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpfHwidW5kZWZpbmVkIiE9dHlwZW9mIFNWR0VsZW1lbnQmJnQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KXJldHVybntlbGVtZW50OnQsb3B0aW9uczooMCxvLmRlZmF1bHQpKHQpLHJlbmRlcmVyOmkuZGVmYXVsdC5TVkdSZW5kZXJlcn07aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KXJldHVybntlbGVtZW50OnQsb3B0aW9uczooMCxvLmRlZmF1bHQpKHQpLHJlbmRlcmVyOmkuZGVmYXVsdC5DYW52YXNSZW5kZXJlcn07aWYodCYmdC5nZXRDb250ZXh0KXJldHVybntlbGVtZW50OnQscmVuZGVyZXI6aS5kZWZhdWx0LkNhbnZhc1JlbmRlcmVyfTtpZih0JiYib2JqZWN0Ij09PSh2b2lkIDA9PT10PyJ1bmRlZmluZWQiOnIodCkpJiYhdC5ub2RlTmFtZSlyZXR1cm57ZWxlbWVudDp0LHJlbmRlcmVyOmkuZGVmYXVsdC5PYmplY3RSZW5kZXJlcn07dGhyb3cgbmV3IGEuSW52YWxpZEVsZW1lbnRFeGNlcHRpb247dmFyIHUsZn1lLmRlZmF1bHQ9c30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9aShuKDMpKSxvPWkobig0KSk7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZS5kZWZhdWx0PWZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Zvcih2YXIgbiBpbiBvLmRlZmF1bHQpby5kZWZhdWx0Lmhhc093blByb3BlcnR5KG4pJiYodC5oYXNBdHRyaWJ1dGUoImpzYmFyY29kZS0iK24udG9Mb3dlckNhc2UoKSkmJihlW25dPXQuZ2V0QXR0cmlidXRlKCJqc2JhcmNvZGUtIituLnRvTG93ZXJDYXNlKCkpKSx0Lmhhc0F0dHJpYnV0ZSgiZGF0YS0iK24udG9Mb3dlckNhc2UoKSkmJihlW25dPXQuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbi50b0xvd2VyQ2FzZSgpKSkpO3JldHVybiBlLnZhbHVlPXQuZ2V0QXR0cmlidXRlKCJqc2JhcmNvZGUtdmFsdWUiKXx8dC5nZXRBdHRyaWJ1dGUoImRhdGEtdmFsdWUiKSxlPSgwLHIuZGVmYXVsdCkoZSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1hKG4oMjEpKSxvPWEobigyMikpLGk9YShuKDIzKSk7ZnVuY3Rpb24gYSh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZS5kZWZhdWx0PXtDYW52YXNSZW5kZXJlcjpyLmRlZmF1bHQsU1ZHUmVuZGVyZXI6by5kZWZhdWx0LE9iamVjdFJlbmRlcmVyOmkuZGVmYXVsdH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gbiYmdChlLnByb3RvdHlwZSxuKSxyJiZ0KGUsciksZX19KCksaT1uKDIpLGE9KHI9aSkmJnIuX19lc01vZHVsZT9yOntkZWZhdWx0OnJ9LHU9big1KTt2YXIgcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuLHIpeyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLHQpLHRoaXMuY2FudmFzPWUsdGhpcy5lbmNvZGluZ3M9bix0aGlzLm9wdGlvbnM9cn1yZXR1cm4gbyh0LFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FudmFzLmdldENvbnRleHQpdGhyb3cgbmV3IEVycm9yKCJUaGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGNhbnZhcy4iKTt0aGlzLnByZXBhcmVDYW52YXMoKTtmb3IodmFyIHQ9MDt0PHRoaXMuZW5jb2RpbmdzLmxlbmd0aDt0Kyspe3ZhciBlPSgwLGEuZGVmYXVsdCkodGhpcy5vcHRpb25zLHRoaXMuZW5jb2RpbmdzW3RdLm9wdGlvbnMpO3RoaXMuZHJhd0NhbnZhc0JhcmNvZGUoZSx0aGlzLmVuY29kaW5nc1t0XSksdGhpcy5kcmF3Q2FudmFzVGV4dChlLHRoaXMuZW5jb2RpbmdzW3RdKSx0aGlzLm1vdmVDYW52YXNEcmF3aW5nKHRoaXMuZW5jb2RpbmdzW3RdKX10aGlzLnJlc3RvcmVDYW52YXMoKX19LHtrZXk6InByZXBhcmVDYW52YXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKTt0LnNhdmUoKSwoMCx1LmNhbGN1bGF0ZUVuY29kaW5nQXR0cmlidXRlcykodGhpcy5lbmNvZGluZ3MsdGhpcy5vcHRpb25zLHQpO3ZhciBlPSgwLHUuZ2V0VG90YWxXaWR0aE9mRW5jb2RpbmdzKSh0aGlzLmVuY29kaW5ncyksbj0oMCx1LmdldE1heGltdW1IZWlnaHRPZkVuY29kaW5ncykodGhpcy5lbmNvZGluZ3MpO3RoaXMuY2FudmFzLndpZHRoPWUrdGhpcy5vcHRpb25zLm1hcmdpbkxlZnQrdGhpcy5vcHRpb25zLm1hcmdpblJpZ2h0LHRoaXMuY2FudmFzLmhlaWdodD1uLHQuY2xlYXJSZWN0KDAsMCx0aGlzLmNhbnZhcy53aWR0aCx0aGlzLmNhbnZhcy5oZWlnaHQpLHRoaXMub3B0aW9ucy5iYWNrZ3JvdW5kJiYodC5maWxsU3R5bGU9dGhpcy5vcHRpb25zLmJhY2tncm91bmQsdC5maWxsUmVjdCgwLDAsdGhpcy5jYW52YXMud2lkdGgsdGhpcy5jYW52YXMuaGVpZ2h0KSksdC50cmFuc2xhdGUodGhpcy5vcHRpb25zLm1hcmdpbkxlZnQsMCl9fSx7a2V5OiJkcmF3Q2FudmFzQmFyY29kZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIiksbz1lLmRhdGE7bj0idG9wIj09dC50ZXh0UG9zaXRpb24/dC5tYXJnaW5Ub3ArdC5mb250U2l6ZSt0LnRleHRNYXJnaW46dC5tYXJnaW5Ub3Asci5maWxsU3R5bGU9dC5saW5lQ29sb3I7Zm9yKHZhciBpPTA7aTxvLmxlbmd0aDtpKyspe3ZhciBhPWkqdC53aWR0aCtlLmJhcmNvZGVQYWRkaW5nOyIxIj09PW9baV0/ci5maWxsUmVjdChhLG4sdC53aWR0aCx0LmhlaWdodCk6b1tpXSYmci5maWxsUmVjdChhLG4sdC53aWR0aCx0LmhlaWdodCpvW2ldKX19fSx7a2V5OiJkcmF3Q2FudmFzVGV4dCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbixyLG89dGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKSxpPXQuZm9udE9wdGlvbnMrIiAiK3QuZm9udFNpemUrInB4ICIrdC5mb250O3QuZGlzcGxheVZhbHVlJiYocj0idG9wIj09dC50ZXh0UG9zaXRpb24/dC5tYXJnaW5Ub3ArdC5mb250U2l6ZS10LnRleHRNYXJnaW46dC5oZWlnaHQrdC50ZXh0TWFyZ2luK3QubWFyZ2luVG9wK3QuZm9udFNpemUsby5mb250PWksImxlZnQiPT10LnRleHRBbGlnbnx8ZS5iYXJjb2RlUGFkZGluZz4wPyhuPTAsby50ZXh0QWxpZ249ImxlZnQiKToicmlnaHQiPT10LnRleHRBbGlnbj8obj1lLndpZHRoLTEsby50ZXh0QWxpZ249InJpZ2h0Iik6KG49ZS53aWR0aC8yLG8udGV4dEFsaWduPSJjZW50ZXIiKSxvLmZpbGxUZXh0KGUudGV4dCxuLHIpKX19LHtrZXk6Im1vdmVDYW52YXNEcmF3aW5nIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCIyZCIpLnRyYW5zbGF0ZSh0LndpZHRoLDApfX0se2tleToicmVzdG9yZUNhbnZhcyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCIyZCIpLnJlc3RvcmUoKX19XSksdH0oKTtlLmRlZmF1bHQ9c30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHIsbz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24oZSxuLHIpe3JldHVybiBuJiZ0KGUucHJvdG90eXBlLG4pLHImJnQoZSxyKSxlfX0oKSxpPW4oMiksYT0ocj1pKSYmci5fX2VzTW9kdWxlP3I6e2RlZmF1bHQ6cn0sdT1uKDUpO3ZhciBzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuLHIpeyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLHQpLHRoaXMuc3ZnPWUsdGhpcy5lbmNvZGluZ3M9bix0aGlzLm9wdGlvbnM9cix0aGlzLmRvY3VtZW50PXIueG1sRG9jdW1lbnR8fGRvY3VtZW50fXJldHVybiBvKHQsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMubWFyZ2luTGVmdDt0aGlzLnByZXBhcmVTVkcoKTtmb3IodmFyIGU9MDtlPHRoaXMuZW5jb2RpbmdzLmxlbmd0aDtlKyspe3ZhciBuPXRoaXMuZW5jb2RpbmdzW2VdLHI9KDAsYS5kZWZhdWx0KSh0aGlzLm9wdGlvbnMsbi5vcHRpb25zKSxvPXRoaXMuY3JlYXRlR3JvdXAodCxyLm1hcmdpblRvcCx0aGlzLnN2Zyk7dGhpcy5zZXRHcm91cE9wdGlvbnMobyxyKSx0aGlzLmRyYXdTdmdCYXJjb2RlKG8scixuKSx0aGlzLmRyYXdTVkdUZXh0KG8scixuKSx0Kz1uLndpZHRofX19LHtrZXk6InByZXBhcmVTVkciLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKDt0aGlzLnN2Zy5maXJzdENoaWxkOyl0aGlzLnN2Zy5yZW1vdmVDaGlsZCh0aGlzLnN2Zy5maXJzdENoaWxkKTsoMCx1LmNhbGN1bGF0ZUVuY29kaW5nQXR0cmlidXRlcykodGhpcy5lbmNvZGluZ3MsdGhpcy5vcHRpb25zKTt2YXIgdD0oMCx1LmdldFRvdGFsV2lkdGhPZkVuY29kaW5ncykodGhpcy5lbmNvZGluZ3MpLGU9KDAsdS5nZXRNYXhpbXVtSGVpZ2h0T2ZFbmNvZGluZ3MpKHRoaXMuZW5jb2RpbmdzKSxuPXQrdGhpcy5vcHRpb25zLm1hcmdpbkxlZnQrdGhpcy5vcHRpb25zLm1hcmdpblJpZ2h0O3RoaXMuc2V0U3ZnQXR0cmlidXRlcyhuLGUpLHRoaXMub3B0aW9ucy5iYWNrZ3JvdW5kJiZ0aGlzLmRyYXdSZWN0KDAsMCxuLGUsdGhpcy5zdmcpLnNldEF0dHJpYnV0ZSgiZmlsbCIsdGhpcy5vcHRpb25zLmJhY2tncm91bmQpfX0se2tleToiZHJhd1N2Z0JhcmNvZGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvPW4uZGF0YTtyPSJ0b3AiPT1lLnRleHRQb3NpdGlvbj9lLmZvbnRTaXplK2UudGV4dE1hcmdpbjowO2Zvcih2YXIgaT0wLGE9MCx1PTA7dTxvLmxlbmd0aDt1KyspYT11KmUud2lkdGgrbi5iYXJjb2RlUGFkZGluZywiMSI9PT1vW3VdP2krKzppPjAmJih0aGlzLmRyYXdSZWN0KGEtZS53aWR0aCppLHIsZS53aWR0aCppLGUuaGVpZ2h0LHQpLGk9MCk7aT4wJiZ0aGlzLmRyYXdSZWN0KGEtZS53aWR0aCooaS0xKSxyLGUud2lkdGgqaSxlLmhlaWdodCx0KX19LHtrZXk6ImRyYXdTVkdUZXh0Iix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpPXRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHMsInRleHQiKTtlLmRpc3BsYXlWYWx1ZSYmKGkuc2V0QXR0cmlidXRlKCJmb250LWZhbWlseSIsZS5mb250KSxpLnNldEF0dHJpYnV0ZSgiZm9udC1zaXplIixlLmZvbnRTaXplKSxlLmZvbnRPcHRpb25zLmluY2x1ZGVzKCJib2xkIikmJmkuc2V0QXR0cmlidXRlKCJmb250LXdlaWdodCIsImJvbGQiKSxlLmZvbnRPcHRpb25zLmluY2x1ZGVzKCJpdGFsaWMiKSYmaS5zZXRBdHRyaWJ1dGUoImZvbnQtc3R5bGUiLCJpdGFsaWMiKSxvPSJ0b3AiPT1lLnRleHRQb3NpdGlvbj9lLmZvbnRTaXplLWUudGV4dE1hcmdpbjplLmhlaWdodCtlLnRleHRNYXJnaW4rZS5mb250U2l6ZSwibGVmdCI9PWUudGV4dEFsaWdufHxuLmJhcmNvZGVQYWRkaW5nPjA/KHI9MCxpLnNldEF0dHJpYnV0ZSgidGV4dC1hbmNob3IiLCJzdGFydCIpKToicmlnaHQiPT1lLnRleHRBbGlnbj8ocj1uLndpZHRoLTEsaS5zZXRBdHRyaWJ1dGUoInRleHQtYW5jaG9yIiwiZW5kIikpOihyPW4ud2lkdGgvMixpLnNldEF0dHJpYnV0ZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKSksaS5zZXRBdHRyaWJ1dGUoIngiLHIpLGkuc2V0QXR0cmlidXRlKCJ5IixvKSxpLmFwcGVuZENoaWxkKHRoaXMuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobi50ZXh0KSksdC5hcHBlbmRDaGlsZChpKSl9fSx7a2V5OiJzZXRTdmdBdHRyaWJ1dGVzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuc3ZnO24uc2V0QXR0cmlidXRlKCJ3aWR0aCIsdCsicHgiKSxuLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixlKyJweCIpLG4uc2V0QXR0cmlidXRlKCJ4IiwiMHB4Iiksbi5zZXRBdHRyaWJ1dGUoInkiLCIwcHgiKSxuLnNldEF0dHJpYnV0ZSgidmlld0JveCIsIjAgMCAiK3QrIiAiK2UpLG4uc2V0QXR0cmlidXRlKCJ4bWxucyIscyksbi5zZXRBdHRyaWJ1dGUoInZlcnNpb24iLCIxLjEiKX19LHtrZXk6ImNyZWF0ZUdyb3VwIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMocywiZyIpO3JldHVybiByLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrdCsiLCAiK2UrIikiKSxuLmFwcGVuZENoaWxkKHIpLHJ9fSx7a2V5OiJzZXRHcm91cE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dC5zZXRBdHRyaWJ1dGUoImZpbGwiLGUubGluZUNvbG9yKX19LHtrZXk6ImRyYXdSZWN0Iix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpPXRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHMsInJlY3QiKTtyZXR1cm4gaS5zZXRBdHRyaWJ1dGUoIngiLHQpLGkuc2V0QXR0cmlidXRlKCJ5IixlKSxpLnNldEF0dHJpYnV0ZSgid2lkdGgiLG4pLGkuc2V0QXR0cmlidXRlKCJoZWlnaHQiLHIpLG8uYXBwZW5kQ2hpbGQoaSksaX19XSksdH0oKTtlLmRlZmF1bHQ9Zn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gbiYmdChlLnByb3RvdHlwZSxuKSxyJiZ0KGUsciksZX19KCk7dmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbixyKXshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyx0KSx0aGlzLm9iamVjdD1lLHRoaXMuZW5jb2RpbmdzPW4sdGhpcy5vcHRpb25zPXJ9cmV0dXJuIHIodCxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub2JqZWN0LmVuY29kaW5ncz10aGlzLmVuY29kaW5nc319XSksdH0oKTtlLmRlZmF1bHQ9b30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gbiYmdChlLnByb3RvdHlwZSxuKSxyJiZ0KGUsciksZX19KCk7dmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpeyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLHQpLHRoaXMuYXBpPWV9cmV0dXJuIHIodCxbe2tleToiaGFuZGxlQ2F0Y2giLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCJJbnZhbGlkSW5wdXRFeGNlcHRpb24iIT09dC5uYW1lKXRocm93IHQ7aWYodGhpcy5hcGkuX29wdGlvbnMudmFsaWQ9PT10aGlzLmFwaS5fZGVmYXVsdHMudmFsaWQpdGhyb3cgdC5tZXNzYWdlO3RoaXMuYXBpLl9vcHRpb25zLnZhbGlkKCExKSx0aGlzLmFwaS5yZW5kZXI9ZnVuY3Rpb24oKXt9fX0se2tleToid3JhcEJhcmNvZGVDYWxsIix2YWx1ZTpmdW5jdGlvbih0KXt0cnl7dmFyIGU9dC5hcHBseSh2b2lkIDAsYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5hcGkuX29wdGlvbnMudmFsaWQoITApLGV9Y2F0Y2godCl7cmV0dXJuIHRoaXMuaGFuZGxlQ2F0Y2godCksdGhpcy5hcGl9fX1dKSx0fSgpO2UuZGVmYXVsdD1vfV0pOzwvc2NyaXB0PjwhLS0gIE1hdmVyaWsgR2lmdCBDYXJkIOKAlCBCYWNrICAtLT4KPGRpdiBjbGFzcz0iZ2Mtd3JhcCI+CiAgPHN0eWxlPgogICAgLmdjLXdyYXAgeyBtYXJnaW46IDAgYXV0bzsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CiAgICAgIHdpZHRoOiAxMDAlOyBtYXgtd2lkdGg6IDQwMHB4OyBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7IH0KICAgIC5nYy1mYWNlIHsgd2lkdGg6IDEwMCU7IGhlaWdodDogNjBjcXc7IGJvcmRlci1yYWRpdXM6IDRjcXc7IG92ZXJmbG93OiBoaWRkZW47CiAgICAgIGJveC1zaGFkb3c6IDAgMS41Y3F3IDVjcXcgcmdiYSgwLDAsMCwuMjUpOyBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTYwZGVnLCAjZjVmNWY3IDAlLCAjZTdlN2VhIDEwMCUpOyBjb2xvcjogIzIyMjsKICAgICAgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgfQogICAgLmdjLW1hZ3N0cmlwZSB7IGhlaWdodDogMTBjcXc7IG1hcmdpbi10b3A6IDVjcXc7IGJhY2tncm91bmQ6ICMyMzIzMmE7IGZsZXg6IG5vbmU7IH0KICAgIC5nYy1iYWNrLWlubmVyIHsgZmxleDogMTsgbWluLWhlaWdodDogMDsgcGFkZGluZzogM2NxdyA3LjVjcXcgMy41Y3F3OwogICAgICBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDIuMjVjcXc7IH0KICAgIC5wbGF0ZSB7IGJhY2tncm91bmQ6ICNmZmY7IGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IGJvcmRlci1yYWRpdXM6IDEuNWNxdzsKICAgICAgcGFkZGluZzogMS41Y3F3IDIuNWNxdyAwLjVjcXc7IHRleHQtYWxpZ246IGNlbnRlcjsgfQogICAgLnBsYXRlIHN2ZyB7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IDAgYXV0bzsgbWF4LXdpZHRoOiAxMDAlOyBoZWlnaHQ6IGF1dG87IH0KICAgIC5yb3cgeyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfQogICAgLmdjLWxhYmVsIHsgZm9udC1zaXplOiAyLjI1Y3F3OyBsZXR0ZXItc3BhY2luZzogMC4yNWNxdzsgY29sb3I6ICM1NTU7IH0KICAgIC5nYy1hY2NvdW50IHsgZm9udC1zaXplOiAzLjc1Y3F3OyBmb250LXdlaWdodDogNzAwOyBsZXR0ZXItc3BhY2luZzogMC4yNWNxdzsgY29sb3I6ICMxYTFhMWE7IH0KICAgIC5nYy10ZXJtcyB7IGZvbnQtc2l6ZTogMS44NzVjcXc7IGxpbmUtaGVpZ2h0OiAxLjM1OyBjb2xvcjogIzZhNmE2YTsgbWFyZ2luLXRvcDogYXV0bzsgfQogICAgLmdjLWlzc3VlZCB7IGNvbG9yOiAjOGE4YThhOyBmb250LXNpemU6IDIuMjVjcXc7IH0KICA8L3N0eWxlPgoKICA8ZGl2IGNsYXNzPSJnYy1mYWNlIj4KICAgIDxkaXYgY2xhc3M9ImdjLW1hZ3N0cmlwZSI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJnYy1iYWNrLWlubmVyIj4KICAgICAgPGRpdiBjbGFzcz0icGxhdGUiPgogICAgICAgIDxzdmcgaWQ9ImdjLWJhcmNvZGUiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iR2lmdCBjYXJkIGJhcmNvZGUiPjwvc3ZnPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICA8ZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZ2MtbGFiZWwiPkFDQ09VTlQ8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImdjLWFjY291bnQiIGlkPSJnYy1hY2NvdW50Ij48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJnYy1pc3N1ZWQiIGlkPSJnYy1pc3N1ZWQiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZ2MtdGVybXMiIGlkPSJnYy10ZXJtcyI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KCiAgPHNjcmlwdD4KICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgYyA9IEpTT04ucGFyc2UoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigKICAgICAgICAgICdoZWFkID4gc2NyaXB0W25hbWU9ImNyZWRlbnRpYWwiXScpLmlubmVySFRNTCk7CiAgICAgICAgY29uc3QgY3MgPSBjLmNyZWRlbnRpYWxTdWJqZWN0IHx8IHt9OwogICAgICAgIGNvbnN0IHNldCA9IChpZCwgdikgPT4geyBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICAgICAgICAgIGlmIChlbCkgZWwudGV4dENvbnRlbnQgPSB2ID09IG51bGwgPyAnJyA6IFN0cmluZyh2KTsgfTsKCiAgICAgICAgc2V0KCdnYy1hY2NvdW50JywgY3MuYWNjb3VudCk7CiAgICAgICAgY29uc3QgaXNzdWVyID0gYy5pc3N1ZXIgJiYgYy5pc3N1ZXIubmFtZTsKICAgICAgICBzZXQoJ2djLWlzc3VlZCcsIGlzc3VlciA/ICdJc3N1ZWQgYnkgJyArIGlzc3VlciA6ICcnKTsKICAgICAgICBzZXQoJ2djLXRlcm1zJywKICAgICAgICAgICdSZWRlZW1hYmxlIGZvciBtZXJjaGFuZGlzZSBvciBzZXJ2aWNlcyBhdCBhbnkgJyArIChpc3N1ZXIgfHwgJ2lzc3VlcicpICsKICAgICAgICAgICcgbG9jYXRpb24uIE5vdCByZWRlZW1hYmxlIGZvciBjYXNoIGV4Y2VwdCB3aGVyZSByZXF1aXJlZCBieSBsYXcuICcgKwogICAgICAgICAgJ1RyZWF0IHRoaXMgY2FyZCBsaWtlIGNhc2g7IGxvc3Qgb3Igc3RvbGVuIGNhcmRzIHdpbGwgbm90IGJlIHJlcGxhY2VkLicpOwoKICAgICAgICBjb25zdCBkYXRhID0gY3MuYmFyY29kZURhdGE7CiAgICAgICAgY29uc3Qgc3ZnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2djLWJhcmNvZGUnKTsKICAgICAgICBpZiAoZGF0YSAmJiBzdmcgJiYgdHlwZW9mIHdpbmRvdy5Kc0JhcmNvZGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIHdpbmRvdy5Kc0JhcmNvZGUoc3ZnLCBTdHJpbmcoZGF0YSksIHsKICAgICAgICAgICAgZm9ybWF0OiAnQ09ERTEyOCcsIHdpZHRoOiAxLjksIGhlaWdodDogNDQsIG1hcmdpbjogMCwKICAgICAgICAgICAgZGlzcGxheVZhbHVlOiB0cnVlLCBmb250U2l6ZTogMTMsIGZvbnQ6ICdBcmlhbCcsIHRleHRNYXJnaW46IDIKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAoc3ZnKSB7CiAgICAgICAgICBzdmcub3V0ZXJIVE1MID0gJzxkaXYgc3R5bGU9ImZvbnQ6MTNweCBBcmlhbDtsZXR0ZXItc3BhY2luZzoycHg7Y29sb3I6IzFhMWExYSI+JwogICAgICAgICAgICArIChkYXRhIHx8ICcnKSArICc8L2Rpdj4nOwogICAgICAgIH0KCiAgICAgICAgd2luZG93LnJlbmRlck1ldGhvZFJlYWR5KCk7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGlmICh3aW5kb3cucmVuZGVyTWV0aG9kUmVhZHkpCiAgICAgICAgICB3aW5kb3cucmVuZGVyTWV0aG9kUmVhZHkoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoU3RyaW5nKGVycikpKTsKICAgICAgfQogICAgfSk7CiAgPC9zY3JpcHQ+CjwvZGl2Pg==", "outputPreference": { "mode": [ "visual" ], "mediaType": "application/html" } } ] }
Queries
{ "default": { "type": "QueryByExample", "credentialQuery": [ { "reason": "Please present your GiftCard credential to redeem it at checkout.", "example": { "@context": [ "https://www.w3.org/ns/credentials/v2", "https://w3id.org/retail-dw/v1rc5" ], "type": [ "RetailCredential" ], "credentialSubject": { "type": "GiftCard" } }, "acceptedCryptosuites": [ "eddsa-rdfc-2022", "ecdsa-rdfc-2019", "bbs-2023", "ecdsa-sd-2023" ] } ] } }