QXByaWwgNCwgMjAxNyAwMTozNzo0NyBQTQ0KQWJvdXQNCkNvbnRhY3QNCnR3aXR0ZXINCmZhY2Vib29rDQpnb29nbGUNCmxpbmtlZGluDQpwaW50ZXJlc3QNCk5p4buBbSB0aW4ga2jDoXQga2hhbw0KSE9NRQ0KU1RPUlkNCkVOVEVSVEFJTk1FTlQNClNUVURZDQpURUNITk9MT0dZDQpCVVNJTkVTUw0KDQpUZXh0IHRvIHNlYXJjaC4uLg0KU2VhcmNoDQpMYXRlc3QwMDowNSBBTSBDw6FjaCB4w6FjIG1pbmggdMOgaSBraG/huqNuIEZhY2Vib29rIG3huqFuZyBWaWV0dGVsIDEwMCUgdGjDoG5oIGPDtG5nLi4NCkhvbWUgwrsgRG9jdW1lbnQgwrsgVmxhZGkuQ29sYQ0KVmxhZGkuQ29sYQ0KDQpGZWJydWFyeSAxMSwgMjAxNSAwNDowMjozNiBQTQ0KDQogICAgQWJvdXQNCiAgICBDb250YWN0DQoNCiAgICB0d2l0dGVyDQogICAgZmFjZWJvb2sNCiAgICBnb29nbGUNCiAgICBsaW5rZWRpbg0KICAgIHBpbnRlcmVzdA0KDQpOaeG7gW0gdGluIGtow6F0IGtoYW8NCg0KICAgIEhvbWUNCiAgICBTdG9yeQ0KICAgIEVudGVydGFpbm1lbnQNCiAgICBTdHVkeQ0KICAgIFRlY2hub2xvZ3kNCiAgICBCdXNpbmVzcw0KDQpMYXRlc3QNCg0KMzo1OSBQTSBWbGFkaS5Db2xhDQoNCkhvbWUgwrsgRG9jdW1lbnQgwrsgVmxhZGkuQ29sYQ0KVmxhZGkuQ29sYQ0KPD9waHANCi8qfiBjbGFzcy5waHBtYWlsZXIucGhwDQouLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLg0KfCAgU29mdHdhcmU6IFBIUE1haWxlciAtIFBIUCBlbWFpbCBjbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgICBWZXJzaW9uOiA1LjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICAgQ29udGFjdDogdmlhIHNvdXJjZWZvcmdlLm5ldCBzdXBwb3J0IHBhZ2VzIChhbHNvIHd3dy53b3J4d2FyZS5jb20pICAgICAgfA0KfCAgICAgIEluZm86IGh0dHA6Ly9waHBtYWlsZXIuc291cmNlZm9yZ2UubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgICBTdXBwb3J0OiBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3BocG1haWxlci8gICAgICAgICAgICAgICAgICAgICB8DQp8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfA0KfCAgICAgQWRtaW46IEFuZHkgUHJldm9zdCAocHJvamVjdCBhZG1pbmluaXN0cmF0b3IpICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgICBBdXRob3JzOiBBbmR5IFByZXZvc3QgKGNvZGV3b3J4dGVjaCkgY29kZXdvcnh0ZWNoQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCB8DQp8ICAgICAgICAgIDogTWFyY3VzIEJvaW50b24gKGNvb2xicnUpIGNvb2xicnVAdXNlcnMuc291cmNlZm9yZ2UubmV0ICAgICAgICAgfA0KfCAgIEZvdW5kZXI6IEJyZW50IFIuIE1hdHplbGxlIChvcmlnaW5hbCBmb3VuZGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDksIEFuZHkgUHJldm9zdC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICB8DQp8IENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBCcmVudCBSLiBNYXR6ZWxsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgICBMaWNlbnNlOiBEaXN0cmlidXRlZCB1bmRlciB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKExHUEwpICAgICB8DQp8ICAgICAgICAgICAgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2xlc3Nlci5odG1sICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCAtIFdJVEhPVVQgIHwNCnwgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yICAgICB8DQp8IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgV2Ugb2ZmZXIgYSBudW1iZXIgb2YgcGFpZCBzZXJ2aWNlcyAod3d3Lndvcnh3YXJlLmNvbSk6ICAgICAgICAgICAgICAgICAgICB8DQp8IC0gV2ViIEhvc3Rpbmcgb24gaGlnaGx5IG9wdGltaXplZCBmYXN0IGFuZCBzZWN1cmUgc2VydmVycyAgICAgICAgICAgICAgICAgfA0KfCAtIFRlY2hub2xvZ3kgQ29uc3VsdGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgLSBPdXJzb3VyY2luZyAoaGlnaGx5IHF1YWxpZmllZCBwcm9ncmFtbWVycyBhbmQgZ3JhcGhpYyBkZXNpZ25lcnMpICAgICAgICB8DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJw0KKi8NCg0KLyoqDQogKiBQSFBNYWlsZXIgLSBQSFAgZW1haWwgdHJhbnNwb3J0IGNsYXNzDQogKiBOT1RFOiBSZXF1aXJlcyBQSFAgdmVyc2lvbiA1IG9yIGxhdGVyDQogKiBAcGFja2FnZSBQSFBNYWlsZXINCiAqIEBhdXRob3IgQW5keSBQcmV2b3N0DQogKiBAYXV0aG9yIE1hcmN1cyBCb2ludG9uDQogKiBAY29weXJpZ2h0IDIwMDQgLSAyMDA5IEFuZHkgUHJldm9zdA0KICogQHZlcnNpb24gJElkOiBjbGFzcy5waHBtYWlsZXIucGhwIDQ0NyAyMDA5LTA1LTI1IDAxOjM2OjM4WiBjb2Rld29yeHRlY2ggJA0KICogQGxpY2Vuc2UgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2xlc3Nlci5odG1sIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KICovDQoNCmlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjAuMCcsICc8JykgKSBleGl0KCJTb3JyeSwgdGhpcyB2ZXJzaW9uIG9mIFBIUE1haWxlciB3aWxsIG9ubHkgcnVuIG9uIFBIUCB2ZXJzaW9uIDUgb3IgZ3JlYXRlciFcbiIpOw0KDQpjbGFzcyBQSFBNYWlsZXIgew0KDQogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCiAgLy8gUFJPUEVSVElFUywgUFVCTElDDQogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCg0KICAvKioNCiAgICogRW1haWwgcHJpb3JpdHkgKDEgPSBIaWdoLCAzID0gTm9ybWFsLCA1ID0gbG93KS4NCiAgICogQHZhciBpbnQNCiAgICovDQogIHB1YmxpYyAkUHJpb3JpdHkgICAgICAgICAgPSAzOw0KDQogIC8qKg0KICAgKiBTZXRzIHRoZSBDaGFyU2V0IG9mIHRoZSBtZXNzYWdlLg0KICAgKiBAdmFyIHN0cmluZw0KICAgKi8NCiAgcHVibGljICRDaGFyU2V0ICAgICAgICAgICA9ICdpc28tODg1OS0xJzsNCg0KICAvKioNCiAgICogU2V0cyB0aGUgQ29udGVudC10eXBlIG9mIHRoZSBtZXNzYWdlLg0KICAgKiBAdmFyIHN0cmluZw0KICAgKi8NCiAgcHVibGljICRDb250ZW50VHlwZSAgICAgICA9ICd0ZXh0L3BsYWluJzsNCg0KICAvKioNCiAgICogU2V0cyB0aGUgRW5jb2Rpbmcgb2YgdGhlIG1lc3NhZ2UuIE9wdGlvbnMgZm9yIHRoaXMgYXJlDQogICAqICAiOGJpdCIsICI3Yml0IiwgImJpbmFyeSIsICJiYXNlNjQiLCBhbmQgInF1b3RlZC1wcmludGFibGUiLg0KICAgKiBAdmFyIHN0cmluZw0KICAgKi8NCiAgcHVibGljICRFbmNvZGluZyAgICAgICAgICA9ICc4Yml0JzsNCg0KICAvKioNCiAgICogSG9sZHMgdGhlIG1vc3QgcmVjZW50IG1haWxlciBlcnJvciBtZXNzYWdlLg0KICAgKiBAdmFyIHN0cmluZw0KICAgKi8NCiAgcHVibGljICRFcnJvckluZm8gICAgICAgICA9ICcnOw0KDQogIC8qKg0KICAgKiBTZXRzIHRoZSBGcm9tIGVtYWlsIGFkZHJlc3MgZm9yIHRoZSBtZXNzYWdlLg0KICAgKiBAdmFyIHN0cmluZw0KICAgKi8NCiAgcHVibGljICRGcm9tICAgICAgICAgICAgICA9ICdyb290QGxvY2FsaG9zdCc7DQoNCiAgLyoqDQogICAqIFNldHMgdGhlIEZyb20gbmFtZSBvZiB0aGUgbWVzc2FnZS4NCiAgICogQHZhciBzdHJpbmcNCiAgICovDQogIHB1YmxpYyAkRnJvbU5hbWUgICAgICAgICAgPSAnUm9vdCBVc2VyJzsNCg0KICAvKioNCiAgICogU2V0cyB0aGUgU2VuZGVyIGVtYWlsIChSZXR1cm4tUGF0aCkgb2YgdGhlIG1lc3NhZ2UuICBJZiBub3QgZW1wdHksDQogICAqIHdpbGwgYmUgc2VudCB2aWEgLWYgdG8gc2VuZG1haWwgb3IgYXMgJ01BSUwgRlJPTScgaW4gc210cCBtb2RlLg0KICAgKiBAdmFyIHN0cmluZw0KICAgKi8NCiAgcHVibGljICRTZW5kZXIgICAgICAgICAgICA9ICcnOw0KDQogIC8qKg0KICAgKiBTZXRzIHRoZSBTdWJqZWN0IG9mIHRoZSBtZXNzYWdlLg0KICAgKiBAdmFyIHN0cmluZw0KICAgKi8NCiAgcHVibGljICRTdWJqZWN0ICAgICAgICAgICA9ICcnOw0KDQogIC8qKg0KICAgKiBTZXRzIHRoZSBCb2R5IG9mIHRoZSBtZXNzYWdlLiAgVGhpcyBjYW4gYmUgZWl0aGVyIGFuIEhUTUwgb3IgdGV4dCBib2R5Lg0KICAgKiBJZiBIVE1MIHRoZW4gcnVuIElzSFRNTCh0cnVlKS4NCiAgICogQHZhciBzdHJpbmcNCiAgICovDQogIHB1YmxpYyAkQm9keSAgICAgICAgICAgICAgPSAnJzsNCg0KICAvKioNCiAgICogU2V0cyB0aGUgdGV4dC1vbmx5IGJvZHkgb2YgdGhlIG1lc3NhZ2UuICBUaGlzIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUNCiAgICogZW1haWwgdG8gbXVsdGlwYXJ0L2FsdGVybmF0aXZlLiAgVGhpcyBib2R5IGNhbiBiZSByZWFkIGJ5IG1haWwNCiAgICogY2xpZW50cyB0aGF0IGRvIG5vdCBoYXZlIEhUTUwgZW1haWwgY2FwYWJpbGl0eSBzdWNoIGFzIG11dHQuIENsaWVudHMNCiAgICogdGhhdCBjYW4gcmVhZCBIVE1MIHdpbGwgdmlldyB0aGUgbm9ybWFsIEJvZHkuDQogICAqIEB2YXIgc3RyaW5nDQogICAqLw0KICBwdWJsaWMgJEFsdEJvZHkgICAgICAgICAgID0gJyc7DQoNCiAgLyoqDQogICAqIFNldHMgd29yZCB3cmFwcGluZyBvbiB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZSB0byBhIGdpdmVuIG51bWJlciBvZg0KICAgKiBjaGFyYWN0ZXJzLg0KICAgKiBAdmFyIGludA0KICAgKi8NCiAgcHVibGljICRXb3JkV3JhcCAgICAgICAgICA9IDA7DQoNCiAgLyoqDQogICAqIE1ldGhvZCB0byBzZW5kIG1haWw6ICgibWFpbCIsICJzZW5kbWFpbCIsIG9yICJzbXRwIikuDQogICAqIEB2YXIgc3RyaW5nDQogICAqLw0KICBwdWJsaWMgJE1haWxlciAgICAgICAgICAgID0gJ21haWwnOw0KDQogIC8qKg0KICAgKiBTZXRzIHRoZSBwYXRoIG9mIHRoZSBzZW5kbWFpbCBwcm9ncmFtLg0KICAgKiBAdmFyIHN0cmluZw0KICAgKi8NCiAgcHVibGljICRTZW5kbWFpbCAgICAgICAgICA9ICcvdXNyL3NiaW4vc2VuZG1haWwnOw0KDQogIC8qKg0KICAgKiBQYXRoIHRvIFBIUE1haWxlciBwbHVnaW5zLiAgVXNlZnVsIGlmIHRoZSBTTVRQIGNsYXNzDQogICAqIGlzIGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeSB0aGFuIHRoZSBQSFAgaW5jbHVkZSBwYXRoLg0KICAgKiBAdmFyIHN0cmluZw0KICAgKi8NCiAgcHVibGljICRQbHVnaW5EaXIgICAgICAgICA9ICcnOw0KDQogIC8qKg0KICAgKiBTZXRzIHRoZSBlbWFpbCBhZGRyZXNzIHRoYXQgYSByZWFkaW5nIGNvbmZpcm1hdGlvbiB3aWxsIGJlIHNlbnQuDQogICAqIEB2YXIgc3RyaW5nDQogICAqLw0KICBwdWJsaWMgJENvbmZpcm1SZWFkaW5nVG8gID0gJyc7DQoNCiAgLyoqDQogICAqIFNldHMgdGhlIGhvc3RuYW1lIHRvIHVzZSBpbiBNZXNzYWdlLUlkIGFuZCBSZWNlaXZlZCBoZWFkZXJzDQogICAqIGFuZCBhcyBkZWZhdWx0IEhFTE8gc3RyaW5nLiBJZiBlbXB0eSwgdGhlIHZhbHVlIHJldHVybmVkDQogICAqIGJ5IFNFUlZFUl9OQU1FIGlzIHVzZWQgb3IgJ2xvY2FsaG9zdC5sb2NhbGRvbWFpbicuDQogICAqIEB2YXIgc3RyaW5nDQogICAqLw0KICBwdWJsaWMgJEhvc3RuYW1lICAgICAgICAgID0gJyc7DQoNCiAgLyoqDQogICAqIFNldHMgdGhlIG1lc3NhZ2UgSUQgdG8gYmUgdXNlZCBpbiB0aGUgTWVzc2FnZS1JZCBoZWFkZXIuDQogICAqIElmIGVtcHR5LCBhIHVuaXF1ZSBpZCB3aWxsIGJlIGdlbmVyYXRlZC4NCiAgICogQHZhciBzdHJpbmcNCiAgICovDQogIHB1YmxpYyAkTWVzc2FnZUlEICAgICAgICAgPSAnJzsNCg0KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQogIC8vIFBST1BFUlRJRVMgRk9SIFNNVFANCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KDQogIC8qKg0KICAgKiBTZXRzIHRoZSBTTVRQIGhvc3RzLiAgQWxsIGhvc3RzIG11c3QgYmUgc2VwYXJhdGVkIGJ5IGENCiAgICogc2VtaWNvbG9uLiAgWW91IGNhbiBhbHNvIHNwZWNpZnkgYSBkaWZmZXJlbnQgcG9ydA0KICAgKiBmb3IgZWFjaCBob3N0IGJ5IHVzaW5nIHRoaXMgZm9ybWF0OiBbaG9zdG5hbWU6cG9ydF0NCiAgICogKGUuZy4gInNtdHAxLmV4YW1wbGUuY29tOjI1O3NtdHAyLmV4YW1wbGUuY29tIikuDQogICAqIEhvc3RzIHdpbGwgYmUgdHJpZWQgaW4gb3JkZXIuDQogICAqIEB2YXIgc3RyaW5nDQogICAqLw0KICBwdWJsaWMgJEhvc3QgICAgICAgICAgPSAnbG9jYWxob3N0JzsNCg0KICAvKioNCiAgICogU2V0cyB0aGUgZGVmYXVsdCBTTVRQIHNlcnZlciBwb3J0Lg0KICAgKiBAdmFyIGludA0KICAgKi8NCiAgcHVibGljICRQb3J0ICAgICAgICAgID0gMjU7DQoNCiAgLyoqDQogICAqIFNldHMgdGhlIFNNVFAgSEVMTyBvZiB0aGUgbWVzc2FnZSAoRGVmYXVsdCBpcyAkSG9zdG5hbWUpLg0KICAgKiBAdmFyIHN0cmluZw0KICAgKi8NCiAgcHVibGljICRIZWxvICAgICAgICAgID0gJyc7DQoNCiAgLyoqDQogICAqIFNldHMgY29ubmVjdGlvbiBwcmVmaXguDQogICAqIE9wdGlvbnMgYXJlICIiLCAic3NsIiBvciAidGxzIg0KICAgKiBAdmFyIHN0cmluZw0KICAgKi8NCiAgcHVibGljICRTTVRQU2VjdXJlICAgID0gJyc7DQoNCiAgLyoqDQogICAqIFNldHMgU01UUCBhdXRoZW50aWNhdGlvbi4gVXRpbGl6ZXMgdGhlIFVzZXJuYW1lIGFuZCBQYXNzd29yZCB2YXJpYWJsZXMuDQogICAqIEB2YXIgYm9vbA0KICAgKi8NCiAgcHVibGljICRTTVRQQXV0aCAgICAgID0gZmFsc2U7DQoNCiAgLyoqDQogICAqIFNldHMgU01UUCB1c2VybmFtZS4NCiAgICogQHZhciBzdHJpbmcNCiAgICovDQogIHB1YmxpYyAkVXNlcm5hbWUgICAgICA9ICcnOw0KDQogIC8qKg0KICAgKiBTZXRzIFNNVFAgcGFzc3dvcmQuDQogICAqIEB2YXIgc3RyaW5nDQogICAqLw0KICBwdWJsaWMgJFBhc3N3b3JkICAgICAgPSAnJzsNCg0KICAvKioNCiAgICogU2V0cyB0aGUgU01UUCBzZXJ2ZXIgdGltZW91dCBpbiBzZWNvbmRzLg0KICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHdvcmsgd2l0aCB0aGUgd2luMzIgdmVyc2lvbi4NCiAgICogQHZhciBpbnQNCiAgICovDQogIHB1YmxpYyAkVGltZW91dCAgICAgICA9IDEwOw0KDQogIC8qKg0KICAgKiBTZXRzIFNNVFAgY2xhc3MgZGVidWdnaW5nIG9uIG9yIG9mZi4NCiAgICogQHZhciBib29sDQogICAqLw0KICBwdWJsaWMgJFNNVFBEZWJ1ZyAgICAgPSBmYWxzZTsNCg0KICAvKioNCiAgICogUHJldmVudHMgdGhlIFNNVFAgY29ubmVjdGlvbiBmcm9tIGJlaW5nIGNsb3NlZCBhZnRlciBlYWNoIG1haWwNCiAgICogc2VuZGluZy4gIElmIHRoaXMgaXMgc2V0IHRvIHRydWUgdGhlbiB0byBjbG9zZSB0aGUgY29ubmVjdGlvbg0KICAgKiByZXF1aXJlcyBhbiBleHBsaWNpdCBjYWxsIHRvIFNtdHBDbG9zZSgpLg0KICAgKiBAdmFyIGJvb2wNCiAgICovDQogIHB1YmxpYyAkU01UUEtlZXBBbGl2ZSA9IGZhbHNlOw0KDQogIC8qKg0KICAgKiBQcm92aWRlcyB0aGUgYWJpbGl0eSB0byBoYXZlIHRoZSBUTyBmaWVsZCBwcm9jZXNzIGluZGl2aWR1YWwNCiAgICogZW1haWxzLCBpbnN0ZWFkIG9mIHNlbmRpbmcgdG8gZW50aXJlIFRPIGFkZHJlc3Nlcw0KICAgKiBAdmFyIGJvb2wNCiAgICovDQogIHB1YmxpYyAkU2luZ2xlVG8gICAgICA9IGZhbHNlOw0KDQogICAvKioNCiAgICogSWYgU2luZ2xlVG8gaXMgdHJ1ZSwgdGhpcyBwcm92aWRlcyB0aGUgYXJyYXkgdG8gaG9sZCB0aGUgZW1haWwgYWRkcmVzc2VzDQogICAqIEB2YXIgYm9vbA0KICAgKi8NCiAgcHVibGljICRTaW5nbGVUb0FycmF5ID0gYXJyYXkoKTsNCg0KIC8qKg0KICAgKiBQcm92aWRlcyB0aGUgYWJpbGl0eSB0byBjaGFuZ2UgdGhlIGxpbmUgZW5kaW5nDQogICAqIEB2YXIgc3RyaW5nDQogICAqLw0KICBwdWJsaWMgJExFICAgICAgICAgICAgICA9ICJcbiI7DQoNCiAgLyoqDQogICAqIFVzZWQgd2l0aCBES0lNIEROUyBSZXNvdXJjZSBSZWNvcmQNCiAgICogQHZhciBzdHJpbmcNCiAgICovDQogIHB1YmxpYyAkREtJTV9zZWxlY3RvciAgID0gJ3BocG1haWxlcic7DQoNCiAgLyoqDQogICAqIFVzZWQgd2l0aCBES0lNIEROUyBSZXNvdXJjZSBSZWNvcmQNCiAgICogb3B0aW9uYWwsIGluIGZvcm1hdCBvZiBlbWFpbCBhZGRyZXNzICd5b3VAeW91cmRvbWFpbi5jb20nDQogICAqIEB2YXIgc3RyaW5nDQogICAqLw0KICBwdWJsaWMgJERLSU1faWRlbnRpdHkgICA9ICcnOw0KDQogIC8qKg0KICAgKiBVc2VkIHdpdGggREtJTSBETlMgUmVzb3VyY2UgUmVjb3JkDQogICAqIG9wdGlvbmFsLCBpbiBmb3JtYXQgb2YgZW1haWwgYWRkcmVzcyAneW91QHlvdXJkb21haW4uY29tJw0KICAgKiBAdmFyIHN0cmluZw0KICAgKi8NCiAgcHVibGljICRES0lNX2RvbWFpbiAgICAgPSAnJzsNCg0KICAvKioNCiAgICogVXNlZCB3aXRoIERLSU0gRE5TIFJlc291cmNlIFJlY29yZA0KICAgKiBvcHRpb25hbCwgaW4gZm9ybWF0IG9mIGVtYWlsIGFkZHJlc3MgJ3lvdUB5b3VyZG9tYWluLmNvbScNCiAgICogQHZhciBzdHJpbmcNCiAgICovDQogIHB1YmxpYyAkREtJTV9wcml2YXRlICAgID0gJyc7DQoNCiAgLyoqDQogICAqIENhbGxiYWNrIEFjdGlvbiBmdW5jdGlvbiBuYW1lDQogICAqIHRoZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgdGhlIHJlc3VsdCBvZiB0aGUgc2VuZCBlbWFpbCBhY3Rpb24uIFBhcmFtZXRlcnM6DQogICAqICAgYm9vbCAgICAkcmVzdWx0ICAgICAgICByZXN1bHQgb2YgdGhlIHNlbmQgYWN0aW9uDQogICAqICAgc3RyaW5nICAkdG8gICAgICAgICAgICBlbWFpbCBhZGRyZXNzIG9mIHRoZSByZWNpcGllbnQNCiAgICogICBzdHJpbmcgICRjYyAgICAgICAgICAgIGNjIGVtYWlsIGFkZHJlc3Nlcw0KICAgKiAgIHN0cmluZyAgJGJjYyAgICAgICAgICAgYmNjIGVtYWlsIGFkZHJlc3Nlcw0KICAgKiAgIHN0cmluZyAgJHN1YmplY3QgICAgICAgdGhlIHN1YmplY3QNCiAgICogICBzdHJpbmcgICRib2R5ICAgICAgICAgIHRoZSBlbWFpbCBib2R5DQogICAqIEB2YXIgc3RyaW5nDQogICAqLw0KICBwdWJsaWMgJGFjdGlvbl9mdW5jdGlvbiA9ICcnOyAvLydjYWxsYmFja0FjdGlvbic7DQoNCiAgLyoqDQogICAqIFNldHMgdGhlIFBIUE1haWxlciBWZXJzaW9uIG51bWJlcg0KICAgKiBAdmFyIHN0cmluZw0KICAgKi8NCiAgcHVibGljICRWZXJzaW9uICAgICAgICAgPSAnNS4xJzsNCg0KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQogIC8vIFBST1BFUlRJRVMsIFBSSVZBVEUgQU5EIFBST1RFQ1RFRA0KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQoNCiAgcHJpdmF0ZSAgICRzbXRwICAgICAgICAgICA9IE5VTEw7DQogIHByaXZhdGUgICAkdG8gICAgICAgICAgICAgPSBhcnJheSgpOw0KICBwcml2YXRlICAgJGNjICAgICAgICAgICAgID0gYXJyYXkoKTsNCiAgcHJpdmF0ZSAgICRiY2MgICAgICAgICAgICA9IGFycmF5KCk7DQogIHByaXZhdGUgICAkUmVwbHlUbyAgICAgICAgPSBhcnJheSgpOw0KICBwcml2YXRlICAgJGFsbF9yZWNpcGllbnRzID0gYXJyYXkoKTsNCiAgcHJpdmF0ZSAgICRhdHRhY2htZW50ICAgICA9IGFycmF5KCk7DQogIHByaXZhdGUgICAkQ3VzdG9tSGVhZGVyICAgPSBhcnJheSgpOw0KICBwcml2YXRlICAgJG1lc3NhZ2VfdHlwZSAgID0gJyc7DQogIHByaXZhdGUgICAkYm91bmRhcnkgICAgICAgPSBhcnJheSgpOw0KICBwcm90ZWN0ZWQgJGxhbmd1YWdlICAgICAgID0gYXJyYXkoKTsNCiAgcHJpdmF0ZSAgICRlcnJvcl9jb3VudCAgICA9IDA7DQogIHByaXZhdGUgICAkc2lnbl9jZXJ0X2ZpbGUgPSAiIjsNCiAgcHJpdmF0ZSAgICRzaWduX2tleV9maWxlICA9ICIiOw0KICBwcml2YXRlICAgJHNpZ25fa2V5X3Bhc3MgID0gIiI7DQogIHByaXZhdGUgICAkZXhjZXB0aW9ucyAgICAgPSBmYWxzZTsNCg0KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQogIC8vIENPTlNUQU5UUw0KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQoNCiAgY29uc3QgU1RPUF9NRVNTQUdFICA9IDA7IC8vIG1lc3NhZ2Ugb25seSwgY29udGludWUgcHJvY2Vzc2luZw0KICBjb25zdCBTVE9QX0NPTlRJTlVFID0gMTsgLy8gbWVzc2FnZT8sIGxpa2VseSBvayB0byBjb250aW51ZSBwcm9jZXNzaW5nDQogIGNvbnN0IFNUT1BfQ1JJVElDQUwgPSAyOyAvLyBtZXNzYWdlLCBwbHVzIGZ1bGwgc3RvcCwgY3JpdGljYWwgZXJyb3IgcmVhY2hlZA0KDQogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCiAgLy8gTUVUSE9EUywgVkFSSUFCTEVTDQogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCg0KICAvKioNCiAgICogQ29uc3RydWN0b3INCiAgICogQHBhcmFtIGJvb2xlYW4gJGV4Y2VwdGlvbnMgU2hvdWxkIHdlIHRocm93IGV4dGVybmFsIGV4Y2VwdGlvbnM/DQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGV4Y2VwdGlvbnMgPSBmYWxzZSkgew0KICAgICR0aGlzLT5leGNlcHRpb25zID0gKCRleGNlcHRpb25zID09IHRydWUpOw0KICB9DQoNCiAgLyoqDQogICAqIFNldHMgbWVzc2FnZSB0eXBlIHRvIEhUTUwuDQogICAqIEBwYXJhbSBib29sICRpc2h0bWwNCiAgICogQHJldHVybiB2b2lkDQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gSXNIVE1MKCRpc2h0bWwgPSB0cnVlKSB7DQogICAgaWYgKCRpc2h0bWwpIHsNCiAgICAgICR0aGlzLT5Db250ZW50VHlwZSA9ICd0ZXh0L2h0bWwnOw0KICAgIH0gZWxzZSB7DQogICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAndGV4dC9wbGFpbic7DQogICAgfQ0KICB9DQoNCiAgLyoqDQogICAqIFNldHMgTWFpbGVyIHRvIHNlbmQgbWVzc2FnZSB1c2luZyBTTVRQLg0KICAgKiBAcmV0dXJuIHZvaWQNCiAgICovDQogIHB1YmxpYyBmdW5jdGlvbiBJc1NNVFAoKSB7DQogICAgJHRoaXMtPk1haWxlciA9ICdzbXRwJzsNCiAgfQ0KDQogIC8qKg0KICAgKiBTZXRzIE1haWxlciB0byBzZW5kIG1lc3NhZ2UgdXNpbmcgUEhQIG1haWwoKSBmdW5jdGlvbi4NCiAgICogQHJldHVybiB2b2lkDQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gSXNNYWlsKCkgew0KICAgICR0aGlzLT5NYWlsZXIgPSAnbWFpbCc7DQogIH0NCg0KICAvKioNCiAgICogU2V0cyBNYWlsZXIgdG8gc2VuZCBtZXNzYWdlIHVzaW5nIHRoZSAkU2VuZG1haWwgcHJvZ3JhbS4NCiAgICogQHJldHVybiB2b2lkDQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gSXNTZW5kbWFpbCgpIHsNCiAgICBpZiAoIXN0cmlzdHIoaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpLCAnc2VuZG1haWwnKSkgew0KICAgICAgJHRoaXMtPlNlbmRtYWlsID0gJy92YXIvcW1haWwvYmluL3NlbmRtYWlsJzsNCiAgICB9DQogICAgJHRoaXMtPk1haWxlciA9ICdzZW5kbWFpbCc7DQogIH0NCg0KICAvKioNCiAgICogU2V0cyBNYWlsZXIgdG8gc2VuZCBtZXNzYWdlIHVzaW5nIHRoZSBxbWFpbCBNVEEuDQogICAqIEByZXR1cm4gdm9pZA0KICAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIElzUW1haWwoKSB7DQogICAgaWYgKHN0cmlzdHIoaW5pX2dldCgnc2VuZG1haWxfcGF0aCcpLCAncW1haWwnKSkgew0KICAgICAgJHRoaXMtPlNlbmRtYWlsID0gJy92YXIvcW1haWwvYmluL3NlbmRtYWlsJzsNCiAgICB9DQogICAgJHRoaXMtPk1haWxlciA9ICdzZW5kbWFpbCc7DQogIH0NCg0KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQogIC8vIE1FVEhPRFMsIFJFQ0lQSUVOVFMNCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KDQogIC8qKg0KICAgKiBBZGRzIGEgIlRvIiBhZGRyZXNzLg0KICAgKiBAcGFyYW0gc3RyaW5nICRhZGRyZXNzDQogICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUNCiAgICogQHJldHVybiBib29sZWFuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgYWRkcmVzcyBhbHJlYWR5IHVzZWQNCiAgICovDQogIHB1YmxpYyBmdW5jdGlvbiBBZGRBZGRyZXNzKCRhZGRyZXNzLCAkbmFtZSA9ICcnKSB7DQogICAgcmV0dXJuICR0aGlzLT5BZGRBbkFkZHJlc3MoJ3RvJywgJGFkZHJlc3MsICRuYW1lKTsNCiAgfQ0KDQogIC8qKg0KICAgKiBBZGRzIGEgIkNjIiBhZGRyZXNzLg0KICAgKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGggdGhlIFNNVFAgbWFpbGVyIG9uIHdpbjMyLCBub3Qgd2l0aCB0aGUgIm1haWwiIG1haWxlci4NCiAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcw0KICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lDQogICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGFkZHJlc3MgYWxyZWFkeSB1c2VkDQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gQWRkQ0MoJGFkZHJlc3MsICRuYW1lID0gJycpIHsNCiAgICByZXR1cm4gJHRoaXMtPkFkZEFuQWRkcmVzcygnY2MnLCAkYWRkcmVzcywgJG5hbWUpOw0KICB9DQoNCiAgLyoqDQogICAqIEFkZHMgYSAiQmNjIiBhZGRyZXNzLg0KICAgKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGggdGhlIFNNVFAgbWFpbGVyIG9uIHdpbjMyLCBub3Qgd2l0aCB0aGUgIm1haWwiIG1haWxlci4NCiAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcw0KICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lDQogICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGFkZHJlc3MgYWxyZWFkeSB1c2VkDQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gQWRkQkNDKCRhZGRyZXNzLCAkbmFtZSA9ICcnKSB7DQogICAgcmV0dXJuICR0aGlzLT5BZGRBbkFkZHJlc3MoJ2JjYycsICRhZGRyZXNzLCAkbmFtZSk7DQogIH0NCg0KICAvKioNCiAgICogQWRkcyBhICJSZXBseS10byIgYWRkcmVzcy4NCiAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcw0KICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lDQogICAqIEByZXR1cm4gYm9vbGVhbg0KICAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIEFkZFJlcGx5VG8oJGFkZHJlc3MsICRuYW1lID0gJycpIHsNCiAgICByZXR1cm4gJHRoaXMtPkFkZEFuQWRkcmVzcygnUmVwbHlUbycsICRhZGRyZXNzLCAkbmFtZSk7DQogIH0NCg0KICAvKioNCiAgICogQWRkcyBhbiBhZGRyZXNzIHRvIG9uZSBvZiB0aGUgcmVjaXBpZW50IGFycmF5cw0KICAgKiBBZGRyZXNzZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgYWxyZWFkeSByZXR1cm4gZmFsc2UsIGJ1dCBkbyBub3QgdGhyb3cgZXhjZXB0aW9ucw0KICAgKiBAcGFyYW0gc3RyaW5nICRraW5kIE9uZSBvZiAndG8nLCAnY2MnLCAnYmNjJywgJ1JlcGx5VG8nDQogICAqIEBwYXJhbSBzdHJpbmcgJGFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MgdG8gc2VuZCB0bw0KICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lDQogICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGFkZHJlc3MgYWxyZWFkeSB1c2VkIG9yIGludmFsaWQgaW4gc29tZSB3YXkNCiAgICogQGFjY2VzcyBwcml2YXRlDQogICAqLw0KICBwcml2YXRlIGZ1bmN0aW9uIEFkZEFuQWRkcmVzcygka2luZCwgJGFkZHJlc3MsICRuYW1lID0gJycpIHsNCiAgICBpZiAoIXByZWdfbWF0Y2goJy9eKHRvfGNjfGJjY3xSZXBseVRvKSQvJywgJGtpbmQpKSB7DQogICAgICBlY2hvICdJbnZhbGlkIHJlY2lwaWVudCBhcnJheTogJyAuICRraW5kOw0KICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCiAgICAkYWRkcmVzcyA9IHRyaW0oJGFkZHJlc3MpOw0KICAgICRuYW1lID0gdHJpbShwcmVnX3JlcGxhY2UoJy9bXHJcbl0rLycsICcnLCAkbmFtZSkpOyAvL1N0cmlwIGJyZWFrcyBhbmQgdHJpbQ0KICAgIGlmICghc2VsZjo6VmFsaWRhdGVBZGRyZXNzKCRhZGRyZXNzKSkgew0KICAgICAgJHRoaXMtPlNldEVycm9yKCR0aGlzLT5MYW5nKCdpbnZhbGlkX2FkZHJlc3MnKS4nOiAnLiAkYWRkcmVzcyk7DQogICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsNCiAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+TGFuZygnaW52YWxpZF9hZGRyZXNzJykuJzogJy4kYWRkcmVzcyk7DQogICAgICB9DQogICAgICBlY2hvICR0aGlzLT5MYW5nKCdpbnZhbGlkX2FkZHJlc3MnKS4nOiAnLiRhZGRyZXNzOw0KICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCiAgICBpZiAoJGtpbmQgIT0gJ1JlcGx5VG8nKSB7DQogICAgICBpZiAoIWlzc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRhZGRyZXNzKV0pKSB7DQogICAgICAgIGFycmF5X3B1c2goJHRoaXMtPiRraW5kLCBhcnJheSgkYWRkcmVzcywgJG5hbWUpKTsNCiAgICAgICAgJHRoaXMtPmFsbF9yZWNpcGllbnRzW3N0cnRvbG93ZXIoJGFkZHJlc3MpXSA9IHRydWU7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoc3RydG9sb3dlcigkYWRkcmVzcyksICR0aGlzLT5SZXBseVRvKSkgew0KICAgICAgICAkdGhpcy0+UmVwbHlUb1tzdHJ0b2xvd2VyKCRhZGRyZXNzKV0gPSBhcnJheSgkYWRkcmVzcywgJG5hbWUpOw0KICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KICB9DQogIHJldHVybiBmYWxzZTsNCn0NCg0KLyoqDQogKiBTZXQgdGhlIEZyb20gYW5kIEZyb21OYW1lIHByb3BlcnRpZXMNCiAqIEBwYXJhbSBzdHJpbmcgJGFkZHJlc3MNCiAqIEBwYXJhbSBzdHJpbmcgJG5hbWUNCiAqIEByZXR1cm4gYm9vbGVhbg0KICovDQogIHB1YmxpYyBmdW5jdGlvbiBTZXRGcm9tKCRhZGRyZXNzLCAkbmFtZSA9ICcnLCRhdXRvPTEpIHsNCiAgICAkYWRkcmVzcyA9IHRyaW0oJGFkZHJlc3MpOw0KICAgICRuYW1lID0gdHJpbShwcmVnX3JlcGxhY2UoJy9bXHJcbl0rLycsICcnLCAkbmFtZSkpOyAvL1N0cmlwIGJyZWFrcyBhbmQgdHJpbQ0KICAgIGlmICghc2VsZjo6VmFsaWRhdGVBZGRyZXNzKCRhZGRyZXNzKSkgew0KICAgICAgJHRoaXMtPlNldEVycm9yKCR0aGlzLT5MYW5nKCdpbnZhbGlkX2FkZHJlc3MnKS4nOiAnLiAkYWRkcmVzcyk7DQogICAgICBpZiAoJHRoaXMtPmV4Y2VwdGlvbnMpIHsNCiAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+TGFuZygnaW52YWxpZF9hZGRyZXNzJykuJzogJy4kYWRkcmVzcyk7DQogICAgICB9DQogICAgICBlY2hvICR0aGlzLT5MYW5nKCdpbnZhbGlkX2FkZHJlc3MnKS4nOiAnLiRhZGRyZXNzOw0KICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCiAgICAkdGhpcy0+RnJvbSA9ICRhZGRyZXNzOw0KICAgICR0aGlzLT5Gcm9tTmFtZSA9ICRuYW1lOw0KICAgIGlmICgkYXV0bykgew0KICAgICAgaWYgKGVtcHR5KCR0aGlzLT5SZXBseVRvKSkgew0KICAgICAgICAkdGhpcy0+QWRkQW5BZGRyZXNzKCdSZXBseVRvJywgJGFkZHJlc3MsICRuYW1lKTsNCiAgICAgIH0NCiAgICAgIGlmIChlbXB0eSgkdGhpcy0+U2VuZGVyKSkgew0KICAgICAgICAkdGhpcy0+U2VuZGVyID0gJGFkZHJlc3M7DQogICAgICB9DQogICAgfQ0KICAgIHJldHVybiB0cnVlOw0KICB9DQoNCiAgLyoqDQogICAqIENoZWNrIHRoYXQgYSBzdHJpbmcgbG9va3Mgcm91Z2hseSBsaWtlIGFuIGVtYWlsIGFkZHJlc3Mgc2hvdWxkDQogICAqIFN0YXRpYyBzbyBpdCBjYW4gYmUgdXNlZCB3aXRob3V0IGluc3RhbnRpYXRpb24NCiAgICogVHJpZXMgdG8gdXNlIFBIUCBidWlsdC1pbiB2YWxpZGF0b3IgaW4gdGhlIGZpbHRlciBleHRlbnNpb24gKGZyb20gUEhQIDUuMiksIGZhbGxzIGJhY2sgdG8gYSByZWFzb25hYmx5IGNvbXBldGVudCByZWdleCB2YWxpZGF0b3INCiAgICogQ29uZm9ybXMgYXBwcm94aW1hdGVseSB0byBSRkMyODIyDQogICAqIEBsaW5rIGh0dHA6Ly93d3cuaGV4aWxsaW9uLmNvbS9zYW1wbGVzLyNSZWdleCBPcmlnaW5hbCBwYXR0ZXJuIGZvdW5kIGhlcmUNCiAgICogQHBhcmFtIHN0cmluZyAkYWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB0byBjaGVjaw0KICAgKiBAcmV0dXJuIGJvb2xlYW4NCiAgICogQHN0YXRpYw0KICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgKi8NCiAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBWYWxpZGF0ZUFkZHJlc3MoJGFkZHJlc3MpIHsNCiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdmaWx0ZXJfdmFyJykpIHsgLy9JbnRyb2R1Y2VkIGluIFBIUCA1LjINCiAgICAgIGlmKGZpbHRlcl92YXIoJGFkZHJlc3MsIEZJTFRFUl9WQUxJREFURV9FTUFJTCkgPT09IEZBTFNFKSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICByZXR1cm4gcHJlZ19tYXRjaCgnL14oPzpbXHdcIVwjXCRcJVwmXCdcKlwrXC1cL1w9XD9cXlxgXHtcfFx9XH5dK1wuKSpbXHdcIVwjXCRcJVwmXCdcKlwrXC1cL1w9XD9cXlxgXHtcfFx9XH5dK0AoPzooPzooPzpbYS16QS1aMC05X10oPzpbYS16QS1aMC05X1wtXSg/IVwuKSl7MCw2MX1bYS16QS1aMC05Xy1dP1wuKStbYS16QS1aMC05X10oPzpbYS16QS1aMC05X1wtXSg/ISQpKXswLDYxfVthLXpBLVowLTlfXT8pfCg/OlxbKD86KD86WzAxXT9cZHsxLDJ9fDJbMC00XVxkfDI1WzAtNV0pXC4pezN9KD86WzAxXT9cZHsxLDJ9fDJbMC00XVxkfDI1WzAtNV0pXF0pKSQvJywgJGFkZHJlc3MpOw0KICAgIH0NCiAgfQ0KDQogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCiAgLy8gTUVUSE9EUywgTUFJTCBTRU5ESU5HDQogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCg0KICAvKioNCiAgICogQ3JlYXRlcyBtZXNzYWdlIGFuZCBhc3NpZ25zIE1haWxlci4gSWYgdGhlIG1lc3NhZ2UgaXMNCiAgICogbm90IHNlbnQgc3VjY2Vzc2Z1bGx5IHRoZW4gaXQgcmV0dXJucyBmYWxzZS4gIFVzZSB0aGUgRXJyb3JJbmZvDQogICAqIHZhcmlhYmxlIHRvIHZpZXcgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLg0KICAgKiBAcmV0dXJuIGJvb2wNCiAgICovDQogIHB1YmxpYyBmdW5jdGlvbiBTZW5kKCkgew0KICAgIHRyeSB7DQogICAgICBpZiAoKGNvdW50KCR0aGlzLT50bykgKyBjb3VudCgkdGhpcy0+Y2MpICsgY291bnQoJHRoaXMtPmJjYykpIDwgMSkgew0KICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5MYW5nKCdwcm92aWRlX2FkZHJlc3MnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICB9DQoNCiAgICAgIC8vIFNldCB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIG11bHRpcGFydC9hbHRlcm5hdGl2ZQ0KICAgICAgaWYoIWVtcHR5KCR0aGlzLT5BbHRCb2R5KSkgew0KICAgICAgICAkdGhpcy0+Q29udGVudFR5cGUgPSAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlJzsNCiAgICAgIH0NCg0KICAgICAgJHRoaXMtPmVycm9yX2NvdW50ID0gMDsgLy8gcmVzZXQgZXJyb3JzDQogICAgICAkdGhpcy0+U2V0TWVzc2FnZVR5cGUoKTsNCiAgICAgICRoZWFkZXIgPSAkdGhpcy0+Q3JlYXRlSGVhZGVyKCk7DQogICAgICAkYm9keSA9ICR0aGlzLT5DcmVhdGVCb2R5KCk7DQoNCiAgICAgIGlmIChlbXB0eSgkdGhpcy0+Qm9keSkpIHsNCiAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+TGFuZygnZW1wdHlfbWVzc2FnZScpLCBzZWxmOjpTVE9QX0NSSVRJQ0FMKTsNCiAgICAgIH0NCg0KICAgICAgLy8gZGlnaXRhbGx5IHNpZ24gd2l0aCBES0lNIGlmIGVuYWJsZWQNCiAgICAgIGlmICgkdGhpcy0+REtJTV9kb21haW4gJiYgJHRoaXMtPkRLSU1fcHJpdmF0ZSkgew0KICAgICAgICAkaGVhZGVyX2RraW0gPSAkdGhpcy0+REtJTV9BZGQoJGhlYWRlciwkdGhpcy0+U3ViamVjdCwkYm9keSk7DQogICAgICAgICRoZWFkZXIgPSBzdHJfcmVwbGFjZSgiXHJcbiIsIlxuIiwkaGVhZGVyX2RraW0pIC4gJGhlYWRlcjsNCiAgICAgIH0NCg0KICAgICAgLy8gQ2hvb3NlIHRoZSBtYWlsZXIgYW5kIHNlbmQgdGhyb3VnaCBpdA0KICAgICAgc3dpdGNoKCR0aGlzLT5NYWlsZXIpIHsNCiAgICAgICAgY2FzZSAnc2VuZG1haWwnOg0KICAgICAgICAgIHJldHVybiAkdGhpcy0+U2VuZG1haWxTZW5kKCRoZWFkZXIsICRib2R5KTsNCiAgICAgICAgY2FzZSAnc210cCc6DQogICAgICAgICAgcmV0dXJuICR0aGlzLT5TbXRwU2VuZCgkaGVhZGVyLCAkYm9keSk7DQogICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgcmV0dXJuICR0aGlzLT5NYWlsU2VuZCgkaGVhZGVyLCAkYm9keSk7DQogICAgICB9DQoNCiAgICB9IGNhdGNoIChwaHBtYWlsZXJFeGNlcHRpb24gJGUpIHsNCiAgICAgICR0aGlzLT5TZXRFcnJvcigkZS0+Z2V0TWVzc2FnZSgpKTsNCiAgICAgIGlmICgkdGhpcy0+ZXhjZXB0aW9ucykgew0KICAgICAgICB0aHJvdyAkZTsNCiAgICAgIH0NCiAgICAgIGVjaG8gJGUtPmdldE1lc3NhZ2UoKS4iXG4iOw0KICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCiAgfQ0KDQogIC8qKg0KICAgKiBTZW5kcyBtYWlsIHVzaW5nIHRoZSAkU2VuZG1haWwgcHJvZ3JhbS4NCiAgICogQHBhcmFtIHN0cmluZyAkaGVhZGVyIFRoZSBtZXNzYWdlIGhlYWRlcnMNCiAgICogQHBhcmFtIHN0cmluZyAkYm9keSBUaGUgbWVzc2FnZSBib2R5DQogICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAqIEByZXR1cm4gYm9vbA0KICAgKi8NCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIFNlbmRtYWlsU2VuZCgkaGVhZGVyLCAkYm9keSkgew0KICAgIGlmICgkdGhpcy0+U2VuZGVyICE9ICcnKSB7DQogICAgICAkc2VuZG1haWwgPSBzcHJpbnRmKCIlcyAtb2kgLWYgJXMgLXQiLCBlc2NhcGVzaGVsbGNtZCgkdGhpcy0+U2VuZG1haWwpLCBlc2NhcGVzaGVsbGFyZygkdGhpcy0+U2VuZGVyKSk7DQogICAgfSBlbHNlIHsNCiAgICAgICRzZW5kbWFpbCA9IHNwcmludGYoIiVzIC1vaSAtdCIsIGVzY2FwZXNoZWxsY21kKCR0aGlzLT5TZW5kbWFpbCkpOw0KICAgIH0NCiAgICBpZiAoJHRoaXMtPlNpbmdsZVRvID09PSB0cnVlKSB7DQogICAgICBmb3JlYWNoICgkdGhpcy0+U2luZ2xlVG9BcnJheSBhcyAka2V5ID0+ICR2YWwpIHsNCiAgICAgICAgaWYoIUAkbWFpbCA9IHBvcGVuKCRzZW5kbWFpbCwgJ3cnKSkgew0KICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPkxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICAgIH0NCiAgICAgICAgZnB1dHMoJG1haWwsICJUbzogIiAuICR2YWwgLiAiXG4iKTsNCiAgICAgICAgZnB1dHMoJG1haWwsICRoZWFkZXIpOw0KICAgICAgICBmcHV0cygkbWFpbCwgJGJvZHkpOw0KICAgICAgICAkcmVzdWx0ID0gcGNsb3NlKCRtYWlsKTsNCiAgICAgICAgLy8gaW1wbGVtZW50IGNhbGwgYmFjayBmdW5jdGlvbiBpZiBpdCBleGlzdHMNCiAgICAgICAgJGlzU2VudCA9ICgkcmVzdWx0ID09IDApID8gMSA6IDA7DQogICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKCRpc1NlbnQsJHZhbCwkdGhpcy0+Y2MsJHRoaXMtPmJjYywkdGhpcy0+U3ViamVjdCwkYm9keSk7DQogICAgICAgIGlmKCRyZXN1bHQgIT0gMCkgew0KICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPkxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgaWYoIUAkbWFpbCA9IHBvcGVuKCRzZW5kbWFpbCwgJ3cnKSkgew0KICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5MYW5nKCdleGVjdXRlJykgLiAkdGhpcy0+U2VuZG1haWwsIHNlbGY6OlNUT1BfQ1JJVElDQUwpOw0KICAgICAgfQ0KICAgICAgZnB1dHMoJG1haWwsICRoZWFkZXIpOw0KICAgICAgZnB1dHMoJG1haWwsICRib2R5KTsNCiAgICAgICRyZXN1bHQgPSBwY2xvc2UoJG1haWwpOw0KICAgICAgLy8gaW1wbGVtZW50IGNhbGwgYmFjayBmdW5jdGlvbiBpZiBpdCBleGlzdHMNCiAgICAgICRpc1NlbnQgPSAoJHJlc3VsdCA9PSAwKSA/IDEgOiAwOw0KICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soJGlzU2VudCwkdGhpcy0+dG8sJHRoaXMtPmNjLCR0aGlzLT5iY2MsJHRoaXMtPlN1YmplY3QsJGJvZHkpOw0KICAgICAgaWYoJHJlc3VsdCAhPSAwKSB7DQogICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPkxhbmcoJ2V4ZWN1dGUnKSAuICR0aGlzLT5TZW5kbWFpbCwgc2VsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICB9DQogICAgfQ0KICAgIHJldHVybiB0cnVlOw0KICB9DQoNCiAgLyoqDQogICAqIFNlbmRzIG1haWwgdXNpbmcgdGhlIFBIUCBtYWlsKCkgZnVuY3Rpb24uDQogICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlciBUaGUgbWVzc2FnZSBoZWFkZXJzDQogICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgVGhlIG1lc3NhZ2UgYm9keQ0KICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgKiBAcmV0dXJuIGJvb2wNCiAgICovDQogIHByb3RlY3RlZCBmdW5jdGlvbiBNYWlsU2VuZCgkaGVhZGVyLCAkYm9keSkgew0KICAgICR0b0FyciA9IGFycmF5KCk7DQogICAgZm9yZWFjaCgkdGhpcy0+dG8gYXMgJHQpIHsNCiAgICAgICR0b0FycltdID0gJHRoaXMtPkFkZHJGb3JtYXQoJHQpOw0KICAgIH0NCiAgICAkdG8gPSBpbXBsb2RlKCcsICcsICR0b0Fycik7DQoNCiAgICAkcGFyYW1zID0gc3ByaW50ZigiLW9pIC1mICVzIiwgJHRoaXMtPlNlbmRlcik7DQogICAgaWYgKCR0aGlzLT5TZW5kZXIgIT0gJycgJiYgc3RybGVuKGluaV9nZXQoJ3NhZmVfbW9kZScpKTwgMSkgew0KICAgICAgJG9sZF9mcm9tID0gaW5pX2dldCgnc2VuZG1haWxfZnJvbScpOw0KICAgICAgaW5pX3NldCgnc2VuZG1haWxfZnJvbScsICR0aGlzLT5TZW5kZXIpOw0KICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbyA9PT0gdHJ1ZSAmJiBjb3VudCgkdG9BcnIpID4gMSkgew0KICAgICAgICBmb3JlYWNoICgkdG9BcnIgYXMgJGtleSA9PiAkdmFsKSB7DQogICAgICAgICAgJHJ0ID0gQG1haWwoJHZhbCwgJHRoaXMtPkVuY29kZUhlYWRlcigkdGhpcy0+U2VjdXJlSGVhZGVyKCR0aGlzLT5TdWJqZWN0KSksICRib2R5LCAkaGVhZGVyLCAkcGFyYW1zKTsNCiAgICAgICAgICAvLyBpbXBsZW1lbnQgY2FsbCBiYWNrIGZ1bmN0aW9uIGlmIGl0IGV4aXN0cw0KICAgICAgICAgICRpc1NlbnQgPSAoJHJ0ID09IDEpID8gMSA6IDA7DQogICAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soJGlzU2VudCwkdmFsLCR0aGlzLT5jYywkdGhpcy0+YmNjLCR0aGlzLT5TdWJqZWN0LCRib2R5KTsNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgJHJ0ID0gQG1haWwoJHRvLCAkdGhpcy0+RW5jb2RlSGVhZGVyKCR0aGlzLT5TZWN1cmVIZWFkZXIoJHRoaXMtPlN1YmplY3QpKSwgJGJvZHksICRoZWFkZXIsICRwYXJhbXMpOw0KICAgICAgICAvLyBpbXBsZW1lbnQgY2FsbCBiYWNrIGZ1bmN0aW9uIGlmIGl0IGV4aXN0cw0KICAgICAgICAkaXNTZW50ID0gKCRydCA9PSAxKSA/IDEgOiAwOw0KICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygkaXNTZW50LCR0bywkdGhpcy0+Y2MsJHRoaXMtPmJjYywkdGhpcy0+U3ViamVjdCwkYm9keSk7DQogICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgIGlmICgkdGhpcy0+U2luZ2xlVG8gPT09IHRydWUgJiYgY291bnQoJHRvQXJyKSA+IDEpIHsNCiAgICAgICAgZm9yZWFjaCAoJHRvQXJyIGFzICRrZXkgPT4gJHZhbCkgew0KICAgICAgICAgICRydCA9IEBtYWlsKCR2YWwsICR0aGlzLT5FbmNvZGVIZWFkZXIoJHRoaXMtPlNlY3VyZUhlYWRlcigkdGhpcy0+U3ViamVjdCkpLCAkYm9keSwgJGhlYWRlciwgJHBhcmFtcyk7DQogICAgICAgICAgLy8gaW1wbGVtZW50IGNhbGwgYmFjayBmdW5jdGlvbiBpZiBpdCBleGlzdHMNCiAgICAgICAgICAkaXNTZW50ID0gKCRydCA9PSAxKSA/IDEgOiAwOw0KICAgICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKCRpc1NlbnQsJHZhbCwkdGhpcy0+Y2MsJHRoaXMtPmJjYywkdGhpcy0+U3ViamVjdCwkYm9keSk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgICRydCA9IEBtYWlsKCR0bywgJHRoaXMtPkVuY29kZUhlYWRlcigkdGhpcy0+U2VjdXJlSGVhZGVyKCR0aGlzLT5TdWJqZWN0KSksICRib2R5LCAkaGVhZGVyKTsNCiAgICAgICAgLy8gaW1wbGVtZW50IGNhbGwgYmFjayBmdW5jdGlvbiBpZiBpdCBleGlzdHMNCiAgICAgICAgJGlzU2VudCA9ICgkcnQgPT0gMSkgPyAxIDogMDsNCiAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soJGlzU2VudCwkdG8sJHRoaXMtPmNjLCR0aGlzLT5iY2MsJHRoaXMtPlN1YmplY3QsJGJvZHkpOw0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoaXNzZXQoJG9sZF9mcm9tKSkgew0KICAgICAgaW5pX3NldCgnc2VuZG1haWxfZnJvbScsICRvbGRfZnJvbSk7DQogICAgfQ0KICAgIGlmKCEkcnQpIHsNCiAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPkxhbmcoJ2luc3RhbnRpYXRlJyksIHNlbGY6OlNUT1BfQ1JJVElDQUwpOw0KICAgIH0NCiAgICByZXR1cm4gdHJ1ZTsNCiAgfQ0KDQogIC8qKg0KICAgKiBTZW5kcyBtYWlsIHZpYSBTTVRQIHVzaW5nIFBocFNNVFANCiAgICogUmV0dXJucyBmYWxzZSBpZiB0aGVyZSBpcyBhIGJhZCBNQUlMIEZST00sIFJDUFQsIG9yIERBVEEgaW5wdXQuDQogICAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlciBUaGUgbWVzc2FnZSBoZWFkZXJzDQogICAqIEBwYXJhbSBzdHJpbmcgJGJvZHkgVGhlIG1lc3NhZ2UgYm9keQ0KICAgKiBAdXNlcyBTTVRQDQogICAqIEBhY2Nlc3MgcHJvdGVjdGVkDQogICAqIEByZXR1cm4gYm9vbA0KICAgKi8NCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIFNtdHBTZW5kKCRoZWFkZXIsICRib2R5KSB7DQogICAgcmVxdWlyZV9vbmNlICR0aGlzLT5QbHVnaW5EaXIgLiAnc210cC5waHAnOw0KICAgICRiYWRfcmNwdCA9IGFycmF5KCk7DQoNCiAgICBpZighJHRoaXMtPlNtdHBDb25uZWN0KCkpIHsNCiAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPkxhbmcoJ3NtdHBfY29ubmVjdF9mYWlsZWQnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgfQ0KICAgICRzbXRwX2Zyb20gPSAoJHRoaXMtPlNlbmRlciA9PSAnJykgPyAkdGhpcy0+RnJvbSA6ICR0aGlzLT5TZW5kZXI7DQogICAgaWYoISR0aGlzLT5zbXRwLT5NYWlsKCRzbXRwX2Zyb20pKSB7DQogICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5MYW5nKCdmcm9tX2ZhaWxlZCcpIC4gJHNtdHBfZnJvbSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgfQ0KDQogICAgLy8gQXR0ZW1wdCB0byBzZW5kIGF0dGFjaCBhbGwgcmVjaXBpZW50cw0KICAgIGZvcmVhY2goJHRoaXMtPnRvIGFzICR0bykgew0KICAgICAgaWYgKCEkdGhpcy0+c210cC0+UmVjaXBpZW50KCR0b1swXSkpIHsNCiAgICAgICAgJGJhZF9yY3B0W10gPSAkdG9bMF07DQogICAgICAgIC8vIGltcGxlbWVudCBjYWxsIGJhY2sgZnVuY3Rpb24gaWYgaXQgZXhpc3RzDQogICAgICAgICRpc1NlbnQgPSAwOw0KICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygkaXNTZW50LCR0b1swXSwnJywnJywkdGhpcy0+U3ViamVjdCwkYm9keSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICAvLyBpbXBsZW1lbnQgY2FsbCBiYWNrIGZ1bmN0aW9uIGlmIGl0IGV4aXN0cw0KICAgICAgICAkaXNTZW50ID0gMTsNCiAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soJGlzU2VudCwkdG9bMF0sJycsJycsJHRoaXMtPlN1YmplY3QsJGJvZHkpOw0KICAgICAgfQ0KICAgIH0NCiAgICBmb3JlYWNoKCR0aGlzLT5jYyBhcyAkY2MpIHsNCiAgICAgIGlmICghJHRoaXMtPnNtdHAtPlJlY2lwaWVudCgkY2NbMF0pKSB7DQogICAgICAgICRiYWRfcmNwdFtdID0gJGNjWzBdOw0KICAgICAgICAvLyBpbXBsZW1lbnQgY2FsbCBiYWNrIGZ1bmN0aW9uIGlmIGl0IGV4aXN0cw0KICAgICAgICAkaXNTZW50ID0gMDsNCiAgICAgICAgJHRoaXMtPmRvQ2FsbGJhY2soJGlzU2VudCwnJywkY2NbMF0sJycsJHRoaXMtPlN1YmplY3QsJGJvZHkpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgLy8gaW1wbGVtZW50IGNhbGwgYmFjayBmdW5jdGlvbiBpZiBpdCBleGlzdHMNCiAgICAgICAgJGlzU2VudCA9IDE7DQogICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKCRpc1NlbnQsJycsJGNjWzBdLCcnLCR0aGlzLT5TdWJqZWN0LCRib2R5KTsNCiAgICAgIH0NCiAgICB9DQogICAgZm9yZWFjaCgkdGhpcy0+YmNjIGFzICRiY2MpIHsNCiAgICAgIGlmICghJHRoaXMtPnNtdHAtPlJlY2lwaWVudCgkYmNjWzBdKSkgew0KICAgICAgICAkYmFkX3JjcHRbXSA9ICRiY2NbMF07DQogICAgICAgIC8vIGltcGxlbWVudCBjYWxsIGJhY2sgZnVuY3Rpb24gaWYgaXQgZXhpc3RzDQogICAgICAgICRpc1NlbnQgPSAwOw0KICAgICAgICAkdGhpcy0+ZG9DYWxsYmFjaygkaXNTZW50LCcnLCcnLCRiY2NbMF0sJHRoaXMtPlN1YmplY3QsJGJvZHkpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgLy8gaW1wbGVtZW50IGNhbGwgYmFjayBmdW5jdGlvbiBpZiBpdCBleGlzdHMNCiAgICAgICAgJGlzU2VudCA9IDE7DQogICAgICAgICR0aGlzLT5kb0NhbGxiYWNrKCRpc1NlbnQsJycsJycsJGJjY1swXSwkdGhpcy0+U3ViamVjdCwkYm9keSk7DQogICAgICB9DQogICAgfQ0KDQoNCiAgICBpZiAoY291bnQoJGJhZF9yY3B0KSA+IDAgKSB7IC8vQ3JlYXRlIGVycm9yIG1lc3NhZ2UgZm9yIGFueSBiYWQgYWRkcmVzc2VzDQogICAgICAkYmFkYWRkcmVzc2VzID0gaW1wbG9kZSgnLCAnLCAkYmFkX3JjcHQpOw0KICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+TGFuZygncmVjaXBpZW50c19mYWlsZWQnKSAuICRiYWRhZGRyZXNzZXMpOw0KICAgIH0NCiAgICBpZighJHRoaXMtPnNtdHAtPkRhdGEoJGhlYWRlciAuICRib2R5KSkgew0KICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+TGFuZygnZGF0YV9ub3RfYWNjZXB0ZWQnKSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgfQ0KICAgIGlmKCR0aGlzLT5TTVRQS2VlcEFsaXZlID09IHRydWUpIHsNCiAgICAgICR0aGlzLT5zbXRwLT5SZXNldCgpOw0KICAgIH0NCiAgICByZXR1cm4gdHJ1ZTsNCiAgfQ0KDQogIC8qKg0KICAgKiBJbml0aWF0ZXMgYSBjb25uZWN0aW9uIHRvIGFuIFNNVFAgc2VydmVyLg0KICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBvcGVyYXRpb24gZmFpbGVkLg0KICAgKiBAdXNlcyBTTVRQDQogICAqIEBhY2Nlc3MgcHVibGljDQogICAqIEByZXR1cm4gYm9vbA0KICAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIFNtdHBDb25uZWN0KCkgew0KICAgIGlmKGlzX251bGwoJHRoaXMtPnNtdHApKSB7DQogICAgICAkdGhpcy0+c210cCA9IG5ldyBTTVRQKCk7DQogICAgfQ0KDQogICAgJHRoaXMtPnNtdHAtPmRvX2RlYnVnID0gJHRoaXMtPlNNVFBEZWJ1ZzsNCiAgICAkaG9zdHMgPSBleHBsb2RlKCc7JywgJHRoaXMtPkhvc3QpOw0KICAgICRpbmRleCA9IDA7DQogICAgJGNvbm5lY3Rpb24gPSAkdGhpcy0+c210cC0+Q29ubmVjdGVkKCk7DQoNCiAgICAvLyBSZXRyeSB3aGlsZSB0aGVyZSBpcyBubyBjb25uZWN0aW9uDQogICAgdHJ5IHsNCiAgICAgIHdoaWxlKCRpbmRleCA8IGNvdW50KCRob3N0cykgJiYgISRjb25uZWN0aW9uKSB7DQogICAgICAgICRob3N0aW5mbyA9IGFycmF5KCk7DQogICAgICAgIGlmIChwcmVnX21hdGNoKCcvXiguKyk6KFswLTldKykkLycsICRob3N0c1skaW5kZXhdLCAkaG9zdGluZm8pKSB7DQogICAgICAgICAgJGhvc3QgPSAkaG9zdGluZm9bMV07DQogICAgICAgICAgJHBvcnQgPSAkaG9zdGluZm9bMl07DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgJGhvc3QgPSAkaG9zdHNbJGluZGV4XTsNCiAgICAgICAgICAkcG9ydCA9ICR0aGlzLT5Qb3J0Ow0KICAgICAgICB9DQoNCiAgICAgICAgJHRscyA9ICgkdGhpcy0+U01UUFNlY3VyZSA9PSAndGxzJyk7DQogICAgICAgICRzc2wgPSAoJHRoaXMtPlNNVFBTZWN1cmUgPT0gJ3NzbCcpOw0KDQogICAgICAgIGlmICgkdGhpcy0+c210cC0+Q29ubmVjdCgoJHNzbCA/ICdzc2w6Ly8nOicnKS4kaG9zdCwgJHBvcnQsICR0aGlzLT5UaW1lb3V0KSkgew0KDQogICAgICAgICAgJGhlbGxvID0gKCR0aGlzLT5IZWxvICE9ICcnID8gJHRoaXMtPkhlbG8gOiAkdGhpcy0+U2VydmVySG9zdG5hbWUoKSk7DQogICAgICAgICAgJHRoaXMtPnNtdHAtPkhlbGxvKCRoZWxsbyk7DQoNCiAgICAgICAgICBpZiAoJHRscykgew0KICAgICAgICAgICAgaWYgKCEkdGhpcy0+c210cC0+U3RhcnRUTFMoKSkgew0KICAgICAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5MYW5nKCd0bHMnKSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vV2UgbXVzdCByZXNlbmQgSEVMTyBhZnRlciB0bHMgbmVnb3RpYXRpb24NCiAgICAgICAgICAgICR0aGlzLT5zbXRwLT5IZWxsbygkaGVsbG8pOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgICRjb25uZWN0aW9uID0gdHJ1ZTsNCiAgICAgICAgICBpZiAoJHRoaXMtPlNNVFBBdXRoKSB7DQogICAgICAgICAgICBpZiAoISR0aGlzLT5zbXRwLT5BdXRoZW50aWNhdGUoJHRoaXMtPlVzZXJuYW1lLCAkdGhpcy0+UGFzc3dvcmQpKSB7DQogICAgICAgICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPkxhbmcoJ2F1dGhlbnRpY2F0ZScpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgJGluZGV4Kys7DQogICAgICAgIGlmICghJGNvbm5lY3Rpb24pIHsNCiAgICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5MYW5nKCdjb25uZWN0X2hvc3QnKSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9IGNhdGNoIChwaHBtYWlsZXJFeGNlcHRpb24gJGUpIHsNCiAgICAgICR0aGlzLT5zbXRwLT5SZXNldCgpOw0KICAgICAgdGhyb3cgJGU7DQogICAgfQ0KICAgIHJldHVybiB0cnVlOw0KICB9DQoNCiAgLyoqDQogICAqIENsb3NlcyB0aGUgYWN0aXZlIFNNVFAgc2Vzc2lvbiBpZiBvbmUgZXhpc3RzLg0KICAgKiBAcmV0dXJuIHZvaWQNCiAgICovDQogIHB1YmxpYyBmdW5jdGlvbiBTbXRwQ2xvc2UoKSB7DQogICAgaWYoIWlzX251bGwoJHRoaXMtPnNtdHApKSB7DQogICAgICBpZigkdGhpcy0+c210cC0+Q29ubmVjdGVkKCkpIHsNCiAgICAgICAgJHRoaXMtPnNtdHAtPlF1aXQoKTsNCiAgICAgICAgJHRoaXMtPnNtdHAtPkNsb3NlKCk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgLyoqDQogICogU2V0cyB0aGUgbGFuZ3VhZ2UgZm9yIGFsbCBjbGFzcyBlcnJvciBtZXNzYWdlcy4NCiAgKiBSZXR1cm5zIGZhbHNlIGlmIGl0IGNhbm5vdCBsb2FkIHRoZSBsYW5ndWFnZSBmaWxlLiAgVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgaXMgRW5nbGlzaC4NCiAgKiBAcGFyYW0gc3RyaW5nICRsYW5nY29kZSBJU08gNjM5LTEgMi1jaGFyYWN0ZXIgbGFuZ3VhZ2UgY29kZSAoZS5nLiBQb3J0dWd1ZXNlOiAiYnIiKQ0KICAqIEBwYXJhbSBzdHJpbmcgJGxhbmdfcGF0aCBQYXRoIHRvIHRoZSBsYW5ndWFnZSBmaWxlIGRpcmVjdG9yeQ0KICAqIEBhY2Nlc3MgcHVibGljDQogICovDQogIGZ1bmN0aW9uIFNldExhbmd1YWdlKCRsYW5nY29kZSA9ICdlbicsICRsYW5nX3BhdGggPSAnbGFuZ3VhZ2UvJykgew0KICAgIC8vRGVmaW5lIGZ1bGwgc2V0IG9mIHRyYW5zbGF0YWJsZSBzdHJpbmdzDQogICAgJFBIUE1BSUxFUl9MQU5HID0gYXJyYXkoDQogICAgICAncHJvdmlkZV9hZGRyZXNzJyA9PiAnWW91IG11c3QgcHJvdmlkZSBhdCBsZWFzdCBvbmUgcmVjaXBpZW50IGVtYWlsIGFkZHJlc3MuJywNCiAgICAgICdtYWlsZXJfbm90X3N1cHBvcnRlZCcgPT4gJyBtYWlsZXIgaXMgbm90IHN1cHBvcnRlZC4nLA0KICAgICAgJ2V4ZWN1dGUnID0+ICdDb3VsZCBub3QgZXhlY3V0ZTogJywNCiAgICAgICdpbnN0YW50aWF0ZScgPT4gJ0NvdWxkIG5vdCBpbnN0YW50aWF0ZSBtYWlsIGZ1bmN0aW9uLicsDQogICAgICAnYXV0aGVudGljYXRlJyA9PiAnU01UUCBFcnJvcjogQ291bGQgbm90IGF1dGhlbnRpY2F0ZS4nLA0KICAgICAgJ2Zyb21fZmFpbGVkJyA9PiAnVGhlIGZvbGxvd2luZyBGcm9tIGFkZHJlc3MgZmFpbGVkOiAnLA0KICAgICAgJ3JlY2lwaWVudHNfZmFpbGVkJyA9PiAnU01UUCBFcnJvcjogVGhlIGZvbGxvd2luZyByZWNpcGllbnRzIGZhaWxlZDogJywNCiAgICAgICdkYXRhX25vdF9hY2NlcHRlZCcgPT4gJ1NNVFAgRXJyb3I6IERhdGEgbm90IGFjY2VwdGVkLicsDQogICAgICAnY29ubmVjdF9ob3N0JyA9PiAnU01UUCBFcnJvcjogQ291bGQgbm90IGNvbm5lY3QgdG8gU01UUCBob3N0LicsDQogICAgICAnZmlsZV9hY2Nlc3MnID0+ICdDb3VsZCBub3QgYWNjZXNzIGZpbGU6ICcsDQogICAgICAnZmlsZV9vcGVuJyA9PiAnRmlsZSBFcnJvcjogQ291bGQgbm90IG9wZW4gZmlsZTogJywNCiAgICAgICdlbmNvZGluZycgPT4gJ1Vua25vd24gZW5jb2Rpbmc6ICcsDQogICAgICAnc2lnbmluZycgPT4gJ1NpZ25pbmcgRXJyb3I6ICcsDQogICAgICAnc210cF9lcnJvcicgPT4gJ1NNVFAgc2VydmVyIGVycm9yOiAnLA0KICAgICAgJ2VtcHR5X21lc3NhZ2UnID0+ICdNZXNzYWdlIGJvZHkgZW1wdHknLA0KICAgICAgJ2ludmFsaWRfYWRkcmVzcycgPT4gJ0ludmFsaWQgYWRkcmVzcycsDQogICAgICAndmFyaWFibGVfc2V0JyA9PiAnQ2Fubm90IHNldCBvciByZXNldCB2YXJpYWJsZTogJw0KICAgICk7DQogICAgLy9PdmVyd3JpdGUgbGFuZ3VhZ2Utc3BlY2lmaWMgc3RyaW5ncy4gVGhpcyB3YXkgd2UnbGwgbmV2ZXIgaGF2ZSBtaXNzaW5nIHRyYW5zbGF0aW9ucyAtIG5vIG1vcmUgImxhbmd1YWdlIHN0cmluZyBmYWlsZWQgdG8gbG9hZCIhDQogICAgJGwgPSB0cnVlOw0KICAgIGlmICgkbGFuZ2NvZGUgIT0gJ2VuJykgeyAvL1RoZXJlIGlzIG5vIEVuZ2xpc2ggdHJhbnNsYXRpb24gZmlsZQ0KICAgICAgJGwgPSBAaW5jbHVkZSAkbGFuZ19wYXRoLidwaHBtYWlsZXIubGFuZy0nLiRsYW5nY29kZS4nLnBocCc7DQogICAgfQ0KICAgICR0aGlzLT5sYW5ndWFnZSA9ICRQSFBNQUlMRVJfTEFORzsNCiAgICByZXR1cm4gKCRsID09IHRydWUpOyAvL1JldHVybnMgZmFsc2UgaWYgbGFuZ3VhZ2Ugbm90IGZvdW5kDQogIH0NCg0KICAvKioNCiAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgYXJyYXkgb2YgbGFuZ3VhZ2Ugc3RyaW5ncw0KICAqIEByZXR1cm4gYXJyYXkNCiAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIEdldFRyYW5zbGF0aW9ucygpIHsNCiAgICByZXR1cm4gJHRoaXMtPmxhbmd1YWdlOw0KICB9DQoNCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KICAvLyBNRVRIT0RTLCBNRVNTQUdFIENSRUFUSU9ODQogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCg0KICAvKioNCiAgICogQ3JlYXRlcyByZWNpcGllbnQgaGVhZGVycy4NCiAgICogQGFjY2VzcyBwdWJsaWMNCiAgICogQHJldHVybiBzdHJpbmcNCiAgICovDQogIHB1YmxpYyBmdW5jdGlvbiBBZGRyQXBwZW5kKCR0eXBlLCAkYWRkcikgew0KICAgICRhZGRyX3N0ciA9ICR0eXBlIC4gJzogJzsNCiAgICAkYWRkcmVzc2VzID0gYXJyYXkoKTsNCiAgICBmb3JlYWNoICgkYWRkciBhcyAkYSkgew0KICAgICAgJGFkZHJlc3Nlc1tdID0gJHRoaXMtPkFkZHJGb3JtYXQoJGEpOw0KICAgIH0NCiAgICAkYWRkcl9zdHIgLj0gaW1wbG9kZSgnLCAnLCAkYWRkcmVzc2VzKTsNCiAgICAkYWRkcl9zdHIgLj0gJHRoaXMtPkxFOw0KDQogICAgcmV0dXJuICRhZGRyX3N0cjsNCiAgfQ0KDQogIC8qKg0KICAgKiBGb3JtYXRzIGFuIGFkZHJlc3MgY29ycmVjdGx5Lg0KICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgKiBAcmV0dXJuIHN0cmluZw0KICAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIEFkZHJGb3JtYXQoJGFkZHIpIHsNCiAgICBpZiAoZW1wdHkoJGFkZHJbMV0pKSB7DQogICAgICByZXR1cm4gJHRoaXMtPlNlY3VyZUhlYWRlcigkYWRkclswXSk7DQogICAgfSBlbHNlIHsNCiAgICAgIHJldHVybiAkdGhpcy0+RW5jb2RlSGVhZGVyKCR0aGlzLT5TZWN1cmVIZWFkZXIoJGFkZHJbMV0pLCAncGhyYXNlJykgLiAiIDwiIC4gJHRoaXMtPlNlY3VyZUhlYWRlcigkYWRkclswXSkgLiAiPiI7DQogICAgfQ0KICB9DQoNCiAgLyoqDQogICAqIFdyYXBzIG1lc3NhZ2UgZm9yIHVzZSB3aXRoIG1haWxlcnMgdGhhdCBkbyBub3QNCiAgICogYXV0b21hdGljYWxseSBwZXJmb3JtIHdyYXBwaW5nIGFuZCBmb3IgcXVvdGVkLXByaW50YWJsZS4NCiAgICogT3JpZ2luYWwgd3JpdHRlbiBieSBwaGlsaXBwZS4NCiAgICogQHBhcmFtIHN0cmluZyAkbWVzc2FnZSBUaGUgbWVzc2FnZSB0byB3cmFwDQogICAqIEBwYXJhbSBpbnRlZ2VyICRsZW5ndGggVGhlIGxpbmUgbGVuZ3RoIHRvIHdyYXAgdG8NCiAgICogQHBhcmFtIGJvb2xlYW4gJHFwX21vZGUgV2hldGhlciB0byBydW4gaW4gUXVvdGVkLVByaW50YWJsZSBtb2RlDQogICAqIEBhY2Nlc3MgcHVibGljDQogICAqIEByZXR1cm4gc3RyaW5nDQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gV3JhcFRleHQoJG1lc3NhZ2UsICRsZW5ndGgsICRxcF9tb2RlID0gZmFsc2UpIHsNCiAgICAkc29mdF9icmVhayA9ICgkcXBfbW9kZSkgPyBzcHJpbnRmKCIgPSVzIiwgJHRoaXMtPkxFKSA6ICR0aGlzLT5MRTsNCiAgICAvLyBJZiB1dGYtOCBlbmNvZGluZyBpcyB1c2VkLCB3ZSB3aWxsIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0DQogICAgLy8gc3BsaXQgbXVsdGlieXRlIGNoYXJhY3RlcnMgd2hlbiB3ZSB3cmFwDQogICAgJGlzX3V0ZjggPSAoc3RydG9sb3dlcigkdGhpcy0+Q2hhclNldCkgPT0gInV0Zi04Iik7DQoNCiAgICAkbWVzc2FnZSA9ICR0aGlzLT5GaXhFT0woJG1lc3NhZ2UpOw0KICAgIGlmIChzdWJzdHIoJG1lc3NhZ2UsIC0xKSA9PSAkdGhpcy0+TEUpIHsNCiAgICAgICRtZXNzYWdlID0gc3Vic3RyKCRtZXNzYWdlLCAwLCAtMSk7DQogICAgfQ0KDQogICAgJGxpbmUgPSBleHBsb2RlKCR0aGlzLT5MRSwgJG1lc3NhZ2UpOw0KICAgICRtZXNzYWdlID0gJyc7DQogICAgZm9yICgkaT0wIDskaSA8IGNvdW50KCRsaW5lKTsgJGkrKykgew0KICAgICAgJGxpbmVfcGFydCA9IGV4cGxvZGUoJyAnLCAkbGluZVskaV0pOw0KICAgICAgJGJ1ZiA9ICcnOw0KICAgICAgZm9yICgkZSA9IDA7ICRlPGNvdW50KCRsaW5lX3BhcnQpOyAkZSsrKSB7DQogICAgICAgICR3b3JkID0gJGxpbmVfcGFydFskZV07DQogICAgICAgIGlmICgkcXBfbW9kZSBhbmQgKHN0cmxlbigkd29yZCkgPiAkbGVuZ3RoKSkgew0KICAgICAgICAgICRzcGFjZV9sZWZ0ID0gJGxlbmd0aCAtIHN0cmxlbigkYnVmKSAtIDE7DQogICAgICAgICAgaWYgKCRlICE9IDApIHsNCiAgICAgICAgICAgIGlmICgkc3BhY2VfbGVmdCA+IDIwKSB7DQogICAgICAgICAgICAgICRsZW4gPSAkc3BhY2VfbGVmdDsNCiAgICAgICAgICAgICAgaWYgKCRpc191dGY4KSB7DQogICAgICAgICAgICAgICAgJGxlbiA9ICR0aGlzLT5VVEY4Q2hhckJvdW5kYXJ5KCR3b3JkLCAkbGVuKTsNCiAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDEsIDEpID09ICI9Iikgew0KICAgICAgICAgICAgICAgICRsZW4tLTsNCiAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDIsIDEpID09ICI9Iikgew0KICAgICAgICAgICAgICAgICRsZW4gLT0gMjsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAkcGFydCA9IHN1YnN0cigkd29yZCwgMCwgJGxlbik7DQogICAgICAgICAgICAgICR3b3JkID0gc3Vic3RyKCR3b3JkLCAkbGVuKTsNCiAgICAgICAgICAgICAgJGJ1ZiAuPSAnICcgLiAkcGFydDsNCiAgICAgICAgICAgICAgJG1lc3NhZ2UgLj0gJGJ1ZiAuIHNwcmludGYoIj0lcyIsICR0aGlzLT5MRSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmIC4gJHNvZnRfYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkYnVmID0gJyc7DQogICAgICAgICAgfQ0KICAgICAgICAgIHdoaWxlIChzdHJsZW4oJHdvcmQpID4gMCkgew0KICAgICAgICAgICAgJGxlbiA9ICRsZW5ndGg7DQogICAgICAgICAgICBpZiAoJGlzX3V0ZjgpIHsNCiAgICAgICAgICAgICAgJGxlbiA9ICR0aGlzLT5VVEY4Q2hhckJvdW5kYXJ5KCR3b3JkLCAkbGVuKTsNCiAgICAgICAgICAgIH0gZWxzZWlmIChzdWJzdHIoJHdvcmQsICRsZW4gLSAxLCAxKSA9PSAiPSIpIHsNCiAgICAgICAgICAgICAgJGxlbi0tOw0KICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkd29yZCwgJGxlbiAtIDIsIDEpID09ICI9Iikgew0KICAgICAgICAgICAgICAkbGVuIC09IDI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkcGFydCA9IHN1YnN0cigkd29yZCwgMCwgJGxlbik7DQogICAgICAgICAgICAkd29yZCA9IHN1YnN0cigkd29yZCwgJGxlbik7DQoNCiAgICAgICAgICAgIGlmIChzdHJsZW4oJHdvcmQpID4gMCkgew0KICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAkcGFydCAuIHNwcmludGYoIj0lcyIsICR0aGlzLT5MRSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAkYnVmID0gJHBhcnQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICRidWZfbyA9ICRidWY7DQogICAgICAgICAgJGJ1ZiAuPSAoJGUgPT0gMCkgPyAkd29yZCA6ICgnICcgLiAkd29yZCk7DQoNCiAgICAgICAgICBpZiAoc3RybGVuKCRidWYpID4gJGxlbmd0aCBhbmQgJGJ1Zl9vICE9ICcnKSB7DQogICAgICAgICAgICAkbWVzc2FnZSAuPSAkYnVmX28gLiAkc29mdF9icmVhazsNCiAgICAgICAgICAgICRidWYgPSAkd29yZDsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgICRtZXNzYWdlIC49ICRidWYgLiAkdGhpcy0+TEU7DQogICAgfQ0KDQogICAgcmV0dXJuICRtZXNzYWdlOw0KICB9DQoNCiAgLyoqDQogICAqIEZpbmRzIGxhc3QgY2hhcmFjdGVyIGJvdW5kYXJ5IHByaW9yIHRvIG1heExlbmd0aCBpbiBhIHV0Zi04DQogICAqIHF1b3RlZCAocHJpbnRhYmxlKSBlbmNvZGVkIHN0cmluZy4NCiAgICogT3JpZ2luYWwgd3JpdHRlbiBieSBDb2xpbiBCcm93bi4NCiAgICogQGFjY2VzcyBwdWJsaWMNCiAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RlZFRleHQgdXRmLTggUVAgdGV4dA0KICAgKiBAcGFyYW0gaW50ICAgICRtYXhMZW5ndGggICBmaW5kIGxhc3QgY2hhcmFjdGVyIGJvdW5kYXJ5IHByaW9yIHRvIHRoaXMgbGVuZ3RoDQogICAqIEByZXR1cm4gaW50DQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gVVRGOENoYXJCb3VuZGFyeSgkZW5jb2RlZFRleHQsICRtYXhMZW5ndGgpIHsNCiAgICAkZm91bmRTcGxpdFBvcyA9IGZhbHNlOw0KICAgICRsb29rQmFjayA9IDM7DQogICAgd2hpbGUgKCEkZm91bmRTcGxpdFBvcykgew0KICAgICAgJGxhc3RDaHVuayA9IHN1YnN0cigkZW5jb2RlZFRleHQsICRtYXhMZW5ndGggLSAkbG9va0JhY2ssICRsb29rQmFjayk7DQogICAgICAkZW5jb2RlZENoYXJQb3MgPSBzdHJwb3MoJGxhc3RDaHVuaywgIj0iKTsNCiAgICAgIGlmICgkZW5jb2RlZENoYXJQb3MgIT09IGZhbHNlKSB7DQogICAgICAgIC8vIEZvdW5kIHN0YXJ0IG9mIGVuY29kZWQgY2hhcmFjdGVyIGJ5dGUgd2l0aGluICRsb29rQmFjayBibG9jay4NCiAgICAgICAgLy8gQ2hlY2sgdGhlIGVuY29kZWQgYnl0ZSB2YWx1ZSAodGhlIDIgY2hhcnMgYWZ0ZXIgdGhlICc9JykNCiAgICAgICAgJGhleCA9IHN1YnN0cigkZW5jb2RlZFRleHQsICRtYXhMZW5ndGggLSAkbG9va0JhY2sgKyAkZW5jb2RlZENoYXJQb3MgKyAxLCAyKTsNCiAgICAgICAgJGRlYyA9IGhleGRlYygkaGV4KTsNCiAgICAgICAgaWYgKCRkZWMgPCAxMjgpIHsgLy8gU2luZ2xlIGJ5dGUgY2hhcmFjdGVyLg0KICAgICAgICAgIC8vIElmIHRoZSBlbmNvZGVkIGNoYXIgd2FzIGZvdW5kIGF0IHBvcyAwLCBpdCB3aWxsIGZpdA0KICAgICAgICAgIC8vIG90aGVyd2lzZSByZWR1Y2UgbWF4TGVuZ3RoIHRvIHN0YXJ0IG9mIHRoZSBlbmNvZGVkIGNoYXINCiAgICAgICAgICAkbWF4TGVuZ3RoID0gKCRlbmNvZGVkQ2hhclBvcyA9PSAwKSA/ICRtYXhMZW5ndGggOg0KICAgICAgICAgICRtYXhMZW5ndGggLSAoJGxvb2tCYWNrIC0gJGVuY29kZWRDaGFyUG9zKTsNCiAgICAgICAgICAkZm91bmRTcGxpdFBvcyA9IHRydWU7DQogICAgICAgIH0gZWxzZWlmICgkZGVjID49IDE5MikgeyAvLyBGaXJzdCBieXRlIG9mIGEgbXVsdGkgYnl0ZSBjaGFyYWN0ZXINCiAgICAgICAgICAvLyBSZWR1Y2UgbWF4TGVuZ3RoIHRvIHNwbGl0IGF0IHN0YXJ0IG9mIGNoYXJhY3Rlcg0KICAgICAgICAgICRtYXhMZW5ndGggPSAkbWF4TGVuZ3RoIC0gKCRsb29rQmFjayAtICRlbmNvZGVkQ2hhclBvcyk7DQogICAgICAgICAgJGZvdW5kU3BsaXRQb3MgPSB0cnVlOw0KICAgICAgICB9IGVsc2VpZiAoJGRlYyA8IDE5MikgeyAvLyBNaWRkbGUgYnl0ZSBvZiBhIG11bHRpIGJ5dGUgY2hhcmFjdGVyLCBsb29rIGZ1cnRoZXIgYmFjaw0KICAgICAgICAgICRsb29rQmFjayArPSAzOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICAvLyBObyBlbmNvZGVkIGNoYXJhY3RlciBmb3VuZA0KICAgICAgICAkZm91bmRTcGxpdFBvcyA9IHRydWU7DQogICAgICB9DQogICAgfQ0KICAgIHJldHVybiAkbWF4TGVuZ3RoOw0KICB9DQoNCg0KICAvKioNCiAgICogU2V0IHRoZSBib2R5IHdyYXBwaW5nLg0KICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgKiBAcmV0dXJuIHZvaWQNCiAgICovDQogIHB1YmxpYyBmdW5jdGlvbiBTZXRXb3JkV3JhcCgpIHsNCiAgICBpZigkdGhpcy0+V29yZFdyYXAgPCAxKSB7DQogICAgICByZXR1cm47DQogICAgfQ0KDQogICAgc3dpdGNoKCR0aGlzLT5tZXNzYWdlX3R5cGUpIHsNCiAgICAgIGNhc2UgJ2FsdCc6DQogICAgICBjYXNlICdhbHRfYXR0YWNobWVudHMnOg0KICAgICAgICAkdGhpcy0+QWx0Qm9keSA9ICR0aGlzLT5XcmFwVGV4dCgkdGhpcy0+QWx0Qm9keSwgJHRoaXMtPldvcmRXcmFwKTsNCiAgICAgICAgYnJlYWs7DQogICAgICBkZWZhdWx0Og0KICAgICAgICAkdGhpcy0+Qm9keSA9ICR0aGlzLT5XcmFwVGV4dCgkdGhpcy0+Qm9keSwgJHRoaXMtPldvcmRXcmFwKTsNCiAgICAgICAgYnJlYWs7DQogICAgfQ0KICB9DQoNCiAgLyoqDQogICAqIEFzc2VtYmxlcyBtZXNzYWdlIGhlYWRlci4NCiAgICogQGFjY2VzcyBwdWJsaWMNCiAgICogQHJldHVybiBzdHJpbmcgVGhlIGFzc2VtYmxlZCBoZWFkZXINCiAgICovDQogIHB1YmxpYyBmdW5jdGlvbiBDcmVhdGVIZWFkZXIoKSB7DQogICAgJHJlc3VsdCA9ICcnOw0KDQogICAgLy8gU2V0IHRoZSBib3VuZGFyaWVzDQogICAgJHVuaXFfaWQgPSBtZDUodW5pcWlkKHRpbWUoKSkpOw0KICAgICR0aGlzLT5ib3VuZGFyeVsxXSA9ICdiMV8nIC4gJHVuaXFfaWQ7DQogICAgJHRoaXMtPmJvdW5kYXJ5WzJdID0gJ2IyXycgLiAkdW5pcV9pZDsNCg0KICAgICRyZXN1bHQgLj0gJHRoaXMtPkhlYWRlckxpbmUoJ0RhdGUnLCBzZWxmOjpSRkNEYXRlKCkpOw0KICAgIGlmKCR0aGlzLT5TZW5kZXIgPT0gJycpIHsNCiAgICAgICRyZXN1bHQgLj0gJHRoaXMtPkhlYWRlckxpbmUoJ1JldHVybi1QYXRoJywgdHJpbSgkdGhpcy0+RnJvbSkpOw0KICAgIH0gZWxzZSB7DQogICAgICAkcmVzdWx0IC49ICR0aGlzLT5IZWFkZXJMaW5lKCdSZXR1cm4tUGF0aCcsIHRyaW0oJHRoaXMtPlNlbmRlcikpOw0KICAgIH0NCg0KICAgIC8vIFRvIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSBtYWlsKCkNCiAgICBpZigkdGhpcy0+TWFpbGVyICE9ICdtYWlsJykgew0KICAgICAgaWYgKCR0aGlzLT5TaW5nbGVUbyA9PT0gdHJ1ZSkgew0KICAgICAgICBmb3JlYWNoKCR0aGlzLT50byBhcyAkdCkgew0KICAgICAgICAgICR0aGlzLT5TaW5nbGVUb0FycmF5W10gPSAkdGhpcy0+QWRkckZvcm1hdCgkdCk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGlmKGNvdW50KCR0aGlzLT50bykgPiAwKSB7DQogICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+QWRkckFwcGVuZCgnVG8nLCAkdGhpcy0+dG8pOw0KICAgICAgICB9IGVsc2VpZiAoY291bnQoJHRoaXMtPmNjKSA9PSAwKSB7DQogICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+SGVhZGVyTGluZSgnVG8nLCAndW5kaXNjbG9zZWQtcmVjaXBpZW50czo7Jyk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQoNCiAgICAkZnJvbSA9IGFycmF5KCk7DQogICAgJGZyb21bMF1bMF0gPSB0cmltKCR0aGlzLT5Gcm9tKTsNCiAgICAkZnJvbVswXVsxXSA9ICR0aGlzLT5Gcm9tTmFtZTsNCiAgICAkcmVzdWx0IC49ICR0aGlzLT5BZGRyQXBwZW5kKCdGcm9tJywgJGZyb20pOw0KDQogICAgLy8gc2VuZG1haWwgYW5kIG1haWwoKSBleHRyYWN0IENjIGZyb20gdGhlIGhlYWRlciBiZWZvcmUgc2VuZGluZw0KICAgIGlmKGNvdW50KCR0aGlzLT5jYykgPiAwKSB7DQogICAgICAkcmVzdWx0IC49ICR0aGlzLT5BZGRyQXBwZW5kKCdDYycsICR0aGlzLT5jYyk7DQogICAgfQ0KDQogICAgLy8gc2VuZG1haWwgYW5kIG1haWwoKSBleHRyYWN0IEJjYyBmcm9tIHRoZSBoZWFkZXIgYmVmb3JlIHNlbmRpbmcNCiAgICBpZigoKCR0aGlzLT5NYWlsZXIgPT0gJ3NlbmRtYWlsJykgfHwgKCR0aGlzLT5NYWlsZXIgPT0gJ21haWwnKSkgJiYgKGNvdW50KCR0aGlzLT5iY2MpID4gMCkpIHsNCiAgICAgICRyZXN1bHQgLj0gJHRoaXMtPkFkZHJBcHBlbmQoJ0JjYycsICR0aGlzLT5iY2MpOw0KICAgIH0NCg0KICAgIGlmKGNvdW50KCR0aGlzLT5SZXBseVRvKSA+IDApIHsNCiAgICAgICRyZXN1bHQgLj0gJHRoaXMtPkFkZHJBcHBlbmQoJ1JlcGx5LXRvJywgJHRoaXMtPlJlcGx5VG8pOw0KICAgIH0NCg0KICAgIC8vIG1haWwoKSBzZXRzIHRoZSBzdWJqZWN0IGl0c2VsZg0KICAgIGlmKCR0aGlzLT5NYWlsZXIgIT0gJ21haWwnKSB7DQogICAgICAkcmVzdWx0IC49ICR0aGlzLT5IZWFkZXJMaW5lKCdTdWJqZWN0JywgJHRoaXMtPkVuY29kZUhlYWRlcigkdGhpcy0+U2VjdXJlSGVhZGVyKCR0aGlzLT5TdWJqZWN0KSkpOw0KICAgIH0NCg0KICAgIGlmKCR0aGlzLT5NZXNzYWdlSUQgIT0gJycpIHsNCiAgICAgICRyZXN1bHQgLj0gJHRoaXMtPkhlYWRlckxpbmUoJ01lc3NhZ2UtSUQnLCR0aGlzLT5NZXNzYWdlSUQpOw0KICAgIH0gZWxzZSB7DQogICAgICAkcmVzdWx0IC49IHNwcmludGYoIk1lc3NhZ2UtSUQ6IDwlc0Alcz4lcyIsICR1bmlxX2lkLCAkdGhpcy0+U2VydmVySG9zdG5hbWUoKSwgJHRoaXMtPkxFKTsNCiAgICB9DQogICAgJHJlc3VsdCAuPSAkdGhpcy0+SGVhZGVyTGluZSgnWC1Qcmlvcml0eScsICR0aGlzLT5Qcmlvcml0eSk7DQogICAgJHJlc3VsdCAuPSAkdGhpcy0+SGVhZGVyTGluZSgnWC1NYWlsZXInLCAnUEhQTWFpbGVyICcuJHRoaXMtPlZlcnNpb24uJyAocGhwbWFpbGVyLnNvdXJjZWZvcmdlLm5ldCknKTsNCg0KICAgIGlmKCR0aGlzLT5Db25maXJtUmVhZGluZ1RvICE9ICcnKSB7DQogICAgICAkcmVzdWx0IC49ICR0aGlzLT5IZWFkZXJMaW5lKCdEaXNwb3NpdGlvbi1Ob3RpZmljYXRpb24tVG8nLCAnPCcgLiB0cmltKCR0aGlzLT5Db25maXJtUmVhZGluZ1RvKSAuICc+Jyk7DQogICAgfQ0KDQogICAgLy8gQWRkIGN1c3RvbSBoZWFkZXJzDQogICAgZm9yKCRpbmRleCA9IDA7ICRpbmRleCA8IGNvdW50KCR0aGlzLT5DdXN0b21IZWFkZXIpOyAkaW5kZXgrKykgew0KICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+SGVhZGVyTGluZSh0cmltKCR0aGlzLT5DdXN0b21IZWFkZXJbJGluZGV4XVswXSksICR0aGlzLT5FbmNvZGVIZWFkZXIodHJpbSgkdGhpcy0+Q3VzdG9tSGVhZGVyWyRpbmRleF1bMV0pKSk7DQogICAgfQ0KICAgIGlmICghJHRoaXMtPnNpZ25fa2V5X2ZpbGUpIHsNCiAgICAgICRyZXN1bHQgLj0gJHRoaXMtPkhlYWRlckxpbmUoJ01JTUUtVmVyc2lvbicsICcxLjAnKTsNCiAgICAgICRyZXN1bHQgLj0gJHRoaXMtPkdldE1haWxNSU1FKCk7DQogICAgfQ0KDQogICAgcmV0dXJuICRyZXN1bHQ7DQogIH0NCg0KICAvKioNCiAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBNSU1FLg0KICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgKiBAcmV0dXJuIHN0cmluZw0KICAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIEdldE1haWxNSU1FKCkgew0KICAgICRyZXN1bHQgPSAnJzsNCiAgICBzd2l0Y2goJHRoaXMtPm1lc3NhZ2VfdHlwZSkgew0KICAgICAgY2FzZSAncGxhaW4nOg0KICAgICAgICAkcmVzdWx0IC49ICR0aGlzLT5IZWFkZXJMaW5lKCdDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJywgJHRoaXMtPkVuY29kaW5nKTsNCiAgICAgICAgJHJlc3VsdCAuPSBzcHJpbnRmKCJDb250ZW50LVR5cGU6ICVzOyBjaGFyc2V0PVwiJXNcIiIsICR0aGlzLT5Db250ZW50VHlwZSwgJHRoaXMtPkNoYXJTZXQpOw0KICAgICAgICBicmVhazsNCiAgICAgIGNhc2UgJ2F0dGFjaG1lbnRzJzoNCiAgICAgIGNhc2UgJ2FsdF9hdHRhY2htZW50cyc6DQogICAgICAgIGlmKCR0aGlzLT5JbmxpbmVJbWFnZUV4aXN0cygpKXsNCiAgICAgICAgICAkcmVzdWx0IC49IHNwcmludGYoIkNvbnRlbnQtVHlwZTogJXM7JXNcdHR5cGU9XCJ0ZXh0L2h0bWxcIjslc1x0Ym91bmRhcnk9XCIlc1wiJXMiLCAnbXVsdGlwYXJ0L3JlbGF0ZWQnLCAkdGhpcy0+TEUsICR0aGlzLT5MRSwgJHRoaXMtPmJvdW5kYXJ5WzFdLCAkdGhpcy0+TEUpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPkhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvbWl4ZWQ7Jyk7DQogICAgICAgICAgJHJlc3VsdCAuPSAkdGhpcy0+VGV4dExpbmUoIlx0Ym91bmRhcnk9XCIiIC4gJHRoaXMtPmJvdW5kYXJ5WzFdIC4gJyInKTsNCiAgICAgICAgfQ0KICAgICAgICBicmVhazsNCiAgICAgIGNhc2UgJ2FsdCc6DQogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPkhlYWRlckxpbmUoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Jyk7DQogICAgICAgICRyZXN1bHQgLj0gJHRoaXMtPlRleHRMaW5lKCJcdGJvdW5kYXJ5PVwiIiAuICR0aGlzLT5ib3VuZGFyeVsxXSAuICciJyk7DQogICAgICAgIGJyZWFrOw0KICAgIH0NCg0KICAgIGlmKCR0aGlzLT5NYWlsZXIgIT0gJ21haWwnKSB7DQogICAgICAkcmVzdWx0IC49ICR0aGlzLT5MRS4kdGhpcy0+TEU7DQogICAgfQ0KDQogICAgcmV0dXJuICRyZXN1bHQ7DQogIH0NCg0KICAvKioNCiAgICogQXNzZW1ibGVzIHRoZSBtZXNzYWdlIGJvZHkuICBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLg0KICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgYXNzZW1ibGVkIG1lc3NhZ2UgYm9keQ0KICAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIENyZWF0ZUJvZHkoKSB7DQogICAgJGJvZHkgPSAnJzsNCg0KICAgIGlmICgkdGhpcy0+c2lnbl9rZXlfZmlsZSkgew0KICAgICAgJGJvZHkgLj0gJHRoaXMtPkdldE1haWxNSU1FKCk7DQogICAgfQ0KDQogICAgJHRoaXMtPlNldFdvcmRXcmFwKCk7DQoNCiAgICBzd2l0Y2goJHRoaXMtPm1lc3NhZ2VfdHlwZSkgew0KICAgICAgY2FzZSAnYWx0JzoNCiAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJycsICd0ZXh0L3BsYWluJywgJycpOw0KICAgICAgICAkYm9keSAuPSAkdGhpcy0+RW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkdGhpcy0+RW5jb2RpbmcpOw0KICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUuJHRoaXMtPkxFOw0KICAgICAgICAkYm9keSAuPSAkdGhpcy0+R2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzFdLCAnJywgJ3RleHQvaHRtbCcsICcnKTsNCiAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJHRoaXMtPkVuY29kaW5nKTsNCiAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFLiR0aGlzLT5MRTsNCiAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkVuZEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSk7DQogICAgICAgIGJyZWFrOw0KICAgICAgY2FzZSAncGxhaW4nOg0KICAgICAgICAkYm9keSAuPSAkdGhpcy0+RW5jb2RlU3RyaW5nKCR0aGlzLT5Cb2R5LCAkdGhpcy0+RW5jb2RpbmcpOw0KICAgICAgICBicmVhazsNCiAgICAgIGNhc2UgJ2F0dGFjaG1lbnRzJzoNCiAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkdldEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsxXSwgJycsICcnLCAnJyk7DQogICAgICAgICRib2R5IC49ICR0aGlzLT5FbmNvZGVTdHJpbmcoJHRoaXMtPkJvZHksICR0aGlzLT5FbmNvZGluZyk7DQogICAgICAgICRib2R5IC49ICR0aGlzLT5MRTsNCiAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkF0dGFjaEFsbCgpOw0KICAgICAgICBicmVhazsNCiAgICAgIGNhc2UgJ2FsdF9hdHRhY2htZW50cyc6DQogICAgICAgICRib2R5IC49IHNwcmludGYoIi0tJXMlcyIsICR0aGlzLT5ib3VuZGFyeVsxXSwgJHRoaXMtPkxFKTsNCiAgICAgICAgJGJvZHkgLj0gc3ByaW50ZigiQ29udGVudC1UeXBlOiAlczslcyIgLiAiXHRib3VuZGFyeT1cIiVzXCIlcyIsICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmUnLCAkdGhpcy0+TEUsICR0aGlzLT5ib3VuZGFyeVsyXSwgJHRoaXMtPkxFLiR0aGlzLT5MRSk7DQogICAgICAgICRib2R5IC49ICR0aGlzLT5HZXRCb3VuZGFyeSgkdGhpcy0+Ym91bmRhcnlbMl0sICcnLCAndGV4dC9wbGFpbicsICcnKSAuICR0aGlzLT5MRTsgLy8gQ3JlYXRlIHRleHQgYm9keQ0KICAgICAgICAkYm9keSAuPSAkdGhpcy0+RW5jb2RlU3RyaW5nKCR0aGlzLT5BbHRCb2R5LCAkdGhpcy0+RW5jb2RpbmcpOw0KICAgICAgICAkYm9keSAuPSAkdGhpcy0+TEUuJHRoaXMtPkxFOw0KICAgICAgICAkYm9keSAuPSAkdGhpcy0+R2V0Qm91bmRhcnkoJHRoaXMtPmJvdW5kYXJ5WzJdLCAnJywgJ3RleHQvaHRtbCcsICcnKSAuICR0aGlzLT5MRTsgLy8gQ3JlYXRlIHRoZSBIVE1MIGJvZHkNCiAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkVuY29kZVN0cmluZygkdGhpcy0+Qm9keSwgJHRoaXMtPkVuY29kaW5nKTsNCiAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkxFLiR0aGlzLT5MRTsNCiAgICAgICAgJGJvZHkgLj0gJHRoaXMtPkVuZEJvdW5kYXJ5KCR0aGlzLT5ib3VuZGFyeVsyXSk7DQogICAgICAgICRib2R5IC49ICR0aGlzLT5BdHRhY2hBbGwoKTsNCiAgICAgICAgYnJlYWs7DQogICAgfQ0KDQogICAgaWYgKCR0aGlzLT5Jc0Vycm9yKCkpIHsNCiAgICAgICRib2R5ID0gJyc7DQogICAgfSBlbHNlaWYgKCR0aGlzLT5zaWduX2tleV9maWxlKSB7DQogICAgICB0cnkgew0KICAgICAgICAkZmlsZSA9IHRlbXBuYW0oJycsICdtYWlsJyk7DQogICAgICAgIGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlLCAkYm9keSk7IC8vVE9ETyBjaGVjayB0aGlzIHdvcmtlZA0KICAgICAgICAkc2lnbmVkID0gdGVtcG5hbSgiIiwgInNpZ25lZCIpOw0KICAgICAgICBpZiAoQG9wZW5zc2xfcGtjczdfc2lnbigkZmlsZSwgJHNpZ25lZCwgImZpbGU6Ly8iLiR0aGlzLT5zaWduX2NlcnRfZmlsZSwgYXJyYXkoImZpbGU6Ly8iLiR0aGlzLT5zaWduX2tleV9maWxlLCAkdGhpcy0+c2lnbl9rZXlfcGFzcyksIE5VTEwpKSB7DQogICAgICAgICAgQHVubGluaygkZmlsZSk7DQogICAgICAgICAgQHVubGluaygkc2lnbmVkKTsNCiAgICAgICAgICAkYm9keSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRzaWduZWQpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIEB1bmxpbmsoJGZpbGUpOw0KICAgICAgICAgIEB1bmxpbmsoJHNpZ25lZCk7DQogICAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+TGFuZygic2lnbmluZyIpLm9wZW5zc2xfZXJyb3Jfc3RyaW5nKCkpOw0KICAgICAgICB9DQogICAgICB9IGNhdGNoIChwaHBtYWlsZXJFeGNlcHRpb24gJGUpIHsNCiAgICAgICAgJGJvZHkgPSAnJzsNCiAgICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7DQogICAgICAgICAgdGhyb3cgJGU7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4gJGJvZHk7DQogIH0NCg0KICAvKioNCiAgICogUmV0dXJucyB0aGUgc3RhcnQgb2YgYSBtZXNzYWdlIGJvdW5kYXJ5Lg0KICAgKiBAYWNjZXNzIHByaXZhdGUNCiAgICovDQogIHByaXZhdGUgZnVuY3Rpb24gR2V0Qm91bmRhcnkoJGJvdW5kYXJ5LCAkY2hhclNldCwgJGNvbnRlbnRUeXBlLCAkZW5jb2RpbmcpIHsNCiAgICAkcmVzdWx0ID0gJyc7DQogICAgaWYoJGNoYXJTZXQgPT0gJycpIHsNCiAgICAgICRjaGFyU2V0ID0gJHRoaXMtPkNoYXJTZXQ7DQogICAgfQ0KICAgIGlmKCRjb250ZW50VHlwZSA9PSAnJykgew0KICAgICAgJGNvbnRlbnRUeXBlID0gJHRoaXMtPkNvbnRlbnRUeXBlOw0KICAgIH0NCiAgICBpZigkZW5jb2RpbmcgPT0gJycpIHsNCiAgICAgICRlbmNvZGluZyA9ICR0aGlzLT5FbmNvZGluZzsNCiAgICB9DQogICAgJHJlc3VsdCAuPSAkdGhpcy0+VGV4dExpbmUoJy0tJyAuICRib3VuZGFyeSk7DQogICAgJHJlc3VsdCAuPSBzcHJpbnRmKCJDb250ZW50LVR5cGU6ICVzOyBjaGFyc2V0ID0gXCIlc1wiIiwgJGNvbnRlbnRUeXBlLCAkY2hhclNldCk7DQogICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7DQogICAgJHJlc3VsdCAuPSAkdGhpcy0+SGVhZGVyTGluZSgnQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycsICRlbmNvZGluZyk7DQogICAgJHJlc3VsdCAuPSAkdGhpcy0+TEU7DQoNCiAgICByZXR1cm4gJHJlc3VsdDsNCiAgfQ0KDQogIC8qKg0KICAgKiBSZXR1cm5zIHRoZSBlbmQgb2YgYSBtZXNzYWdlIGJvdW5kYXJ5Lg0KICAgKiBAYWNjZXNzIHByaXZhdGUNCiAgICovDQogIHByaXZhdGUgZnVuY3Rpb24gRW5kQm91bmRhcnkoJGJvdW5kYXJ5KSB7DQogICAgcmV0dXJuICR0aGlzLT5MRSAuICctLScgLiAkYm91bmRhcnkgLiAnLS0nIC4gJHRoaXMtPkxFOw0KICB9DQoNCiAgLyoqDQogICAqIFNldHMgdGhlIG1lc3NhZ2UgdHlwZS4NCiAgICogQGFjY2VzcyBwcml2YXRlDQogICAqIEByZXR1cm4gdm9pZA0KICAgKi8NCiAgcHJpdmF0ZSBmdW5jdGlvbiBTZXRNZXNzYWdlVHlwZSgpIHsNCiAgICBpZihjb3VudCgkdGhpcy0+YXR0YWNobWVudCkgPCAxICYmIHN0cmxlbigkdGhpcy0+QWx0Qm9keSkgPCAxKSB7DQogICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gJ3BsYWluJzsNCiAgICB9IGVsc2Ugew0KICAgICAgaWYoY291bnQoJHRoaXMtPmF0dGFjaG1lbnQpID4gMCkgew0KICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gJ2F0dGFjaG1lbnRzJzsNCiAgICAgIH0NCiAgICAgIGlmKHN0cmxlbigkdGhpcy0+QWx0Qm9keSkgPiAwICYmIGNvdW50KCR0aGlzLT5hdHRhY2htZW50KSA8IDEpIHsNCiAgICAgICAgJHRoaXMtPm1lc3NhZ2VfdHlwZSA9ICdhbHQnOw0KICAgICAgfQ0KICAgICAgaWYoc3RybGVuKCR0aGlzLT5BbHRCb2R5KSA+IDAgJiYgY291bnQoJHRoaXMtPmF0dGFjaG1lbnQpID4gMCkgew0KICAgICAgICAkdGhpcy0+bWVzc2FnZV90eXBlID0gJ2FsdF9hdHRhY2htZW50cyc7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgLyoqDQogICAqICBSZXR1cm5zIGEgZm9ybWF0dGVkIGhlYWRlciBsaW5lLg0KICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgKiBAcmV0dXJuIHN0cmluZw0KICAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIEhlYWRlckxpbmUoJG5hbWUsICR2YWx1ZSkgew0KICAgIHJldHVybiAkbmFtZSAuICc6ICcgLiAkdmFsdWUgLiAkdGhpcy0+TEU7DQogIH0NCg0KICAvKioNCiAgICogUmV0dXJucyBhIGZvcm1hdHRlZCBtYWlsIGxpbmUuDQogICAqIEBhY2Nlc3MgcHVibGljDQogICAqIEByZXR1cm4gc3RyaW5nDQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gVGV4dExpbmUoJHZhbHVlKSB7DQogICAgcmV0dXJuICR2YWx1ZSAuICR0aGlzLT5MRTsNCiAgfQ0KDQogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCiAgLy8gQ0xBU1MgTUVUSE9EUywgQVRUQUNITUVOVFMNCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KDQogIC8qKg0KICAgKiBBZGRzIGFuIGF0dGFjaG1lbnQgZnJvbSBhIHBhdGggb24gdGhlIGZpbGVzeXN0ZW0uDQogICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIGZpbGUgY291bGQgbm90IGJlIGZvdW5kDQogICAqIG9yIGFjY2Vzc2VkLg0KICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoIFBhdGggdG8gdGhlIGF0dGFjaG1lbnQuDQogICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgT3ZlcnJpZGVzIHRoZSBhdHRhY2htZW50IG5hbWUuDQogICAqIEBwYXJhbSBzdHJpbmcgJGVuY29kaW5nIEZpbGUgZW5jb2RpbmcgKHNlZSAkRW5jb2RpbmcpLg0KICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlIEZpbGUgZXh0ZW5zaW9uIChNSU1FKSB0eXBlLg0KICAgKiBAcmV0dXJuIGJvb2wNCiAgICovDQogIHB1YmxpYyBmdW5jdGlvbiBBZGRBdHRhY2htZW50KCRwYXRoLCAkbmFtZSA9ICcnLCAkZW5jb2RpbmcgPSAnYmFzZTY0JywgJHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykgew0KICAgIHRyeSB7DQogICAgICBpZiAoICFAaXNfZmlsZSgkcGF0aCkgKSB7DQogICAgICAgIHRocm93IG5ldyBwaHBtYWlsZXJFeGNlcHRpb24oJHRoaXMtPkxhbmcoJ2ZpbGVfYWNjZXNzJykgLiAkcGF0aCwgc2VsZjo6U1RPUF9DT05USU5VRSk7DQogICAgICB9DQogICAgICAkZmlsZW5hbWUgPSBiYXNlbmFtZSgkcGF0aCk7DQogICAgICBpZiAoICRuYW1lID09ICcnICkgew0KICAgICAgICAkbmFtZSA9ICRmaWxlbmFtZTsNCiAgICAgIH0NCg0KICAgICAgJHRoaXMtPmF0dGFjaG1lbnRbXSA9IGFycmF5KA0KICAgICAgICAwID0+ICRwYXRoLA0KICAgICAgICAxID0+ICRmaWxlbmFtZSwNCiAgICAgICAgMiA9PiAkbmFtZSwNCiAgICAgICAgMyA9PiAkZW5jb2RpbmcsDQogICAgICAgIDQgPT4gJHR5cGUsDQogICAgICAgIDUgPT4gZmFsc2UsICAvLyBpc1N0cmluZ0F0dGFjaG1lbnQNCiAgICAgICAgNiA9PiAnYXR0YWNobWVudCcsDQogICAgICAgIDcgPT4gMA0KICAgICAgKTsNCg0KICAgIH0gY2F0Y2ggKHBocG1haWxlckV4Y2VwdGlvbiAkZSkgew0KICAgICAgJHRoaXMtPlNldEVycm9yKCRlLT5nZXRNZXNzYWdlKCkpOw0KICAgICAgaWYgKCR0aGlzLT5leGNlcHRpb25zKSB7DQogICAgICAgIHRocm93ICRlOw0KICAgICAgfQ0KICAgICAgZWNobyAkZS0+Z2V0TWVzc2FnZSgpLiJcbiI7DQogICAgICBpZiAoICRlLT5nZXRDb2RlKCkgPT0gc2VsZjo6U1RPUF9DUklUSUNBTCApIHsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gdHJ1ZTsNCiAgfQ0KDQogIC8qKg0KICAqIFJldHVybiB0aGUgY3VycmVudCBhcnJheSBvZiBhdHRhY2htZW50cw0KICAqIEByZXR1cm4gYXJyYXkNCiAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIEdldEF0dGFjaG1lbnRzKCkgew0KICAgIHJldHVybiAkdGhpcy0+YXR0YWNobWVudDsNCiAgfQ0KDQogIC8qKg0KICAgKiBBdHRhY2hlcyBhbGwgZnMsIHN0cmluZywgYW5kIGJpbmFyeSBhdHRhY2htZW50cyB0byB0aGUgbWVzc2FnZS4NCiAgICogUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgb24gZmFpbHVyZS4NCiAgICogQGFjY2VzcyBwcml2YXRlDQogICAqIEByZXR1cm4gc3RyaW5nDQogICAqLw0KICBwcml2YXRlIGZ1bmN0aW9uIEF0dGFjaEFsbCgpIHsNCiAgICAvLyBSZXR1cm4gdGV4dCBvZiBib2R5DQogICAgJG1pbWUgPSBhcnJheSgpOw0KICAgICRjaWRVbmlxID0gYXJyYXkoKTsNCiAgICAkaW5jbCA9IGFycmF5KCk7DQoNCiAgICAvLyBBZGQgYWxsIGF0dGFjaG1lbnRzDQogICAgZm9yZWFjaCAoJHRoaXMtPmF0dGFjaG1lbnQgYXMgJGF0dGFjaG1lbnQpIHsNCiAgICAgIC8vIENoZWNrIGZvciBzdHJpbmcgYXR0YWNobWVudA0KICAgICAgJGJTdHJpbmcgPSAkYXR0YWNobWVudFs1XTsNCiAgICAgIGlmICgkYlN0cmluZykgew0KICAgICAgICAkc3RyaW5nID0gJGF0dGFjaG1lbnRbMF07DQogICAgICB9IGVsc2Ugew0KICAgICAgICAkcGF0aCA9ICRhdHRhY2htZW50WzBdOw0KICAgICAgfQ0KDQogICAgICBpZiAoaW5fYXJyYXkoJGF0dGFjaG1lbnRbMF0sICRpbmNsKSkgeyBjb250aW51ZTsgfQ0KICAgICAgJGZpbGVuYW1lICAgID0gJGF0dGFjaG1lbnRbMV07DQogICAgICAkbmFtZSAgICAgICAgPSAkYXR0YWNobWVudFsyXTsNCiAgICAgICRlbmNvZGluZyAgICA9ICRhdHRhY2htZW50WzNdOw0KICAgICAgJHR5cGUgICAgICAgID0gJGF0dGFjaG1lbnRbNF07DQogICAgICAkZGlzcG9zaXRpb24gPSAkYXR0YWNobWVudFs2XTsNCiAgICAgICRjaWQgICAgICAgICA9ICRhdHRhY2htZW50WzddOw0KICAgICAgJGluY2xbXSAgICAgID0gJGF0dGFjaG1lbnRbMF07DQogICAgICBpZiAoICRkaXNwb3NpdGlvbiA9PSAnaW5saW5lJyAmJiBpc3NldCgkY2lkVW5pcVskY2lkXSkgKSB7IGNvbnRpbnVlOyB9DQogICAgICAkY2lkVW5pcVskY2lkXSA9IHRydWU7DQoNCiAgICAgICRtaW1lW10gPSBzcHJpbnRmKCItLSVzJXMiLCAkdGhpcy0+Ym91bmRhcnlbMV0sICR0aGlzLT5MRSk7DQogICAgICAkbWltZVtdID0gc3ByaW50ZigiQ29udGVudC1UeXBlOiAlczsgbmFtZT1cIiVzXCIlcyIsICR0eXBlLCAkdGhpcy0+RW5jb2RlSGVhZGVyKCR0aGlzLT5TZWN1cmVIZWFkZXIoJG5hbWUpKSwgJHRoaXMtPkxFKTsNCiAgICAgICRtaW1lW10gPSBzcHJpbnRmKCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAlcyVzIiwgJGVuY29kaW5nLCAkdGhpcy0+TEUpOw0KDQogICAgICBpZigkZGlzcG9zaXRpb24gPT0gJ2lubGluZScpIHsNCiAgICAgICAgJG1pbWVbXSA9IHNwcmludGYoIkNvbnRlbnQtSUQ6IDwlcz4lcyIsICRjaWQsICR0aGlzLT5MRSk7DQogICAgICB9DQoNCiAgICAgICRtaW1lW10gPSBzcHJpbnRmKCJDb250ZW50LURpc3Bvc2l0aW9uOiAlczsgZmlsZW5hbWU9XCIlc1wiJXMiLCAkZGlzcG9zaXRpb24sICR0aGlzLT5FbmNvZGVIZWFkZXIoJHRoaXMtPlNlY3VyZUhlYWRlcigkbmFtZSkpLCAkdGhpcy0+TEUuJHRoaXMtPkxFKTsNCg0KICAgICAgLy8gRW5jb2RlIGFzIHN0cmluZyBhdHRhY2htZW50DQogICAgICBpZigkYlN0cmluZykgew0KICAgICAgICAkbWltZVtdID0gJHRoaXMtPkVuY29kZVN0cmluZygkc3RyaW5nLCAkZW5jb2RpbmcpOw0KICAgICAgICBpZigkdGhpcy0+SXNFcnJvcigpKSB7DQogICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICB9DQogICAgICAgICRtaW1lW10gPSAkdGhpcy0+TEUuJHRoaXMtPkxFOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgJG1pbWVbXSA9ICR0aGlzLT5FbmNvZGVGaWxlKCRwYXRoLCAkZW5jb2RpbmcpOw0KICAgICAgICBpZigkdGhpcy0+SXNFcnJvcigpKSB7DQogICAgICAgICAgcmV0dXJuICcnOw0KICAgICAgICB9DQogICAgICAgICRtaW1lW10gPSAkdGhpcy0+TEUuJHRoaXMtPkxFOw0KICAgICAgfQ0KICAgIH0NCg0KICAgICRtaW1lW10gPSBzcHJpbnRmKCItLSVzLS0lcyIsICR0aGlzLT5ib3VuZGFyeVsxXSwgJHRoaXMtPkxFKTsNCg0KICAgIHJldHVybiBqb2luKCcnLCAkbWltZSk7DQogIH0NCg0KICAvKioNCiAgICogRW5jb2RlcyBhdHRhY2htZW50IGluIHJlcXVlc3RlZCBmb3JtYXQuDQogICAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUuDQogICAqIEBwYXJhbSBzdHJpbmcgJHBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgZmlsZQ0KICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBUaGUgZW5jb2RpbmcgdG8gdXNlOyBvbmUgb2YgJ2Jhc2U2NCcsICc3Yml0JywgJzhiaXQnLCAnYmluYXJ5JywgJ3F1b3RlZC1wcmludGFibGUnDQogICAqIEBzZWUgRW5jb2RlRmlsZSgpDQogICAqIEBhY2Nlc3MgcHJpdmF0ZQ0KICAgKiBAcmV0dXJuIHN0cmluZw0KICAgKi8NCiAgcHJpdmF0ZSBmdW5jdGlvbiBFbmNvZGVGaWxlKCRwYXRoLCAkZW5jb2RpbmcgPSAnYmFzZTY0Jykgew0KICAgIHRyeSB7DQogICAgICBpZiAoIWlzX3JlYWRhYmxlKCRwYXRoKSkgew0KICAgICAgICB0aHJvdyBuZXcgcGhwbWFpbGVyRXhjZXB0aW9uKCR0aGlzLT5MYW5nKCdmaWxlX29wZW4nKSAuICRwYXRoLCBzZWxmOjpTVE9QX0NPTlRJTlVFKTsNCiAgICAgIH0NCiAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2dldF9tYWdpY19xdW90ZXMnKSkgew0KICAgICAgICBmdW5jdGlvbiBnZXRfbWFnaWNfcXVvdGVzKCkgew0KICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKFBIUF9WRVJTSU9OIDwgNikgew0KICAgICAgICAkbWFnaWNfcXVvdGVzID0gZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKCk7DQogICAgICAgIHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsNCiAgICAgIH0NCiAgICAgICRmaWxlX2J1ZmZlciAgPSBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7DQogICAgICAkZmlsZV9idWZmZXIgID0gJHRoaXMtPkVuY29kZVN0cmluZygkZmlsZV9idWZmZXIsICRlbmNvZGluZyk7DQogICAgICBpZiAoUEhQX1ZFUlNJT04gPCA2KSB7IHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgkbWFnaWNfcXVvdGVzKTsgfQ0KICAgICAgcmV0dXJuICRmaWxlX2J1ZmZlcjsNCiAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsNCiAgICAgICR0aGlzLT5TZXRFcnJvcigkZS0+Z2V0TWVzc2FnZSgpKTsNCiAgICAgIHJldHVybiAnJzsNCiAgICB9DQogIH0NCg0KICAvKioNCiAgICogRW5jb2RlcyBzdHJpbmcgdG8gcmVxdWVzdGVkIGZvcm1hdC4NCiAgICogUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgb24gZmFpbHVyZS4NCiAgICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSB0ZXh0IHRvIGVuY29kZQ0KICAgKiBAcGFyYW0gc3RyaW5nICRlbmNvZGluZyBUaGUgZW5jb2RpbmcgdG8gdXNlOyBvbmUgb2YgJ2Jhc2U2NCcsICc3Yml0JywgJzhiaXQnLCAnYmluYXJ5JywgJ3F1b3RlZC1wcmludGFibGUnDQogICAqIEBhY2Nlc3MgcHVibGljDQogICAqIEByZXR1cm4gc3RyaW5nDQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gRW5jb2RlU3RyaW5nICgkc3RyLCAkZW5jb2RpbmcgPSAnYmFzZTY0Jykgew0KICAgICRlbmNvZGVkID0gJyc7DQogICAgc3dpdGNoKHN0cnRvbG93ZXIoJGVuY29kaW5nKSkgew0KICAgICAgY2FzZSAnYmFzZTY0JzoNCiAgICAgICAgJGVuY29kZWQgPSBjaHVua19zcGxpdChiYXNlNjRfZW5jb2RlKCRzdHIpLCA3NiwgJHRoaXMtPkxFKTsNCiAgICAgICAgYnJlYWs7DQogICAgICBjYXNlICc3Yml0JzoNCiAgICAgIGNhc2UgJzhiaXQnOg0KICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT5GaXhFT0woJHN0cik7DQogICAgICAgIC8vTWFrZSBzdXJlIGl0IGVuZHMgd2l0aCBhIGxpbmUgYnJlYWsNCiAgICAgICAgaWYgKHN1YnN0cigkZW5jb2RlZCwgLShzdHJsZW4oJHRoaXMtPkxFKSkpICE9ICR0aGlzLT5MRSkNCiAgICAgICAgICAkZW5jb2RlZCAuPSAkdGhpcy0+TEU7DQogICAgICAgIGJyZWFrOw0KICAgICAgY2FzZSAnYmluYXJ5JzoNCiAgICAgICAgJGVuY29kZWQgPSAkc3RyOw0KICAgICAgICBicmVhazsNCiAgICAgIGNhc2UgJ3F1b3RlZC1wcmludGFibGUnOg0KICAgICAgICAkZW5jb2RlZCA9ICR0aGlzLT5FbmNvZGVRUCgkc3RyKTsNCiAgICAgICAgYnJlYWs7DQogICAgICBkZWZhdWx0Og0KICAgICAgICAkdGhpcy0+U2V0RXJyb3IoJHRoaXMtPkxhbmcoJ2VuY29kaW5nJykgLiAkZW5jb2RpbmcpOw0KICAgICAgICBicmVhazsNCiAgICB9DQogICAgcmV0dXJuICRlbmNvZGVkOw0KICB9DQoNCiAgLyoqDQogICAqIEVuY29kZSBhIGhlYWRlciBzdHJpbmcgdG8gYmVzdCAoc2hvcnRlc3QpIG9mIFEsIEIsIHF1b3RlZCBvciBub25lLg0KICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgKiBAcmV0dXJuIHN0cmluZw0KICAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIEVuY29kZUhlYWRlcigkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpIHsNCiAgICAkeCA9IDA7DQoNCiAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJHBvc2l0aW9uKSkgew0KICAgICAgY2FzZSAncGhyYXNlJzoNCiAgICAgICAgaWYgKCFwcmVnX21hdGNoKCcvW1wyMDAtXDM3N10vJywgJHN0cikpIHsNCiAgICAgICAgICAvLyBDYW4ndCB1c2UgYWRkc2xhc2hlcyBhcyB3ZSBkb24ndCBrbm93IHdoYXQgdmFsdWUgaGFzIG1hZ2ljX3F1b3Rlc19zeWJhc2UNCiAgICAgICAgICAkZW5jb2RlZCA9IGFkZGNzbGFzaGVzKCRzdHIsICJcMC4uXDM3XDE3N1xcXCIiKTsNCiAgICAgICAgICBpZiAoKCRzdHIgPT0gJGVuY29kZWQpICYmICFwcmVnX21hdGNoKCcvW15BLVphLXowLTkhIyQlJlwnKitcLz0/Xl9ge3x9fiAtXS8nLCAkc3RyKSkgew0KICAgICAgICAgICAgcmV0dXJuICgkZW5jb2RlZCk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiAoIlwiJGVuY29kZWRcIiIpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAkeCA9IHByZWdfbWF0Y2hfYWxsKCcvW15cMDQwXDA0MVwwNDMtXDEzM1wxMzUtXDE3Nl0vJywgJHN0ciwgJG1hdGNoZXMpOw0KICAgICAgICBicmVhazsNCiAgICAgIGNhc2UgJ2NvbW1lbnQnOg0KICAgICAgICAkeCA9IHByZWdfbWF0Y2hfYWxsKCcvWygpIl0vJywgJHN0ciwgJG1hdGNoZXMpOw0KICAgICAgICAvLyBGYWxsLXRocm91Z2gNCiAgICAgIGNhc2UgJ3RleHQnOg0KICAgICAgZGVmYXVsdDoNCiAgICAgICAgJHggKz0gcHJlZ19tYXRjaF9hbGwoJy9bXDAwMC1cMDEwXDAxM1wwMTRcMDE2LVwwMzdcMTc3LVwzNzddLycsICRzdHIsICRtYXRjaGVzKTsNCiAgICAgICAgYnJlYWs7DQogICAgfQ0KDQogICAgaWYgKCR4ID09IDApIHsNCiAgICAgIHJldHVybiAoJHN0cik7DQogICAgfQ0KDQogICAgJG1heGxlbiA9IDc1IC0gNyAtIHN0cmxlbigkdGhpcy0+Q2hhclNldCk7DQogICAgLy8gVHJ5IHRvIHNlbGVjdCB0aGUgZW5jb2Rpbmcgd2hpY2ggc2hvdWxkIHByb2R1Y2UgdGhlIHNob3J0ZXN0IG91dHB1dA0KICAgIGlmIChzdHJsZW4oJHN0cikvMyA8ICR4KSB7DQogICAgICAkZW5jb2RpbmcgPSAnQic7DQogICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSAmJiAkdGhpcy0+SGFzTXVsdGlCeXRlcygkc3RyKSkgew0KICAgICAgICAvLyBVc2UgYSBjdXN0b20gZnVuY3Rpb24gd2hpY2ggY29ycmVjdGx5IGVuY29kZXMgYW5kIHdyYXBzIGxvbmcNCiAgICAgICAgLy8gbXVsdGlieXRlIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXINCiAgICAgICAgJGVuY29kZWQgPSAkdGhpcy0+QmFzZTY0RW5jb2RlNSVXcmFwTUIoJHN0cik7DQogICAgICB9IGVsc2Ugew0KICAgICAgICAkZW5jb2RlZCA9IGJhc2U2NF9lbmNvZGUoJHN0cik7DQogICAgICAgICRtYXhsZW4gLT0gJG1heGxlbiAlIDQ7DQogICAgICAgICRlbmNvZGVkID0gdHJpbShjaHVua19zcGxpdCgkZW5jb2RlZCwgJG1heGxlbiwgIlxuIikpOw0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAkZW5jb2RpbmcgPSAnUSc7DQogICAgICAkZW5jb2RlZCA9ICR0aGlzLT5FbmNvZGVRKCRzdHIsICRwb3NpdGlvbik7DQogICAgICAkZW5jb2RlZCA9ICR0aGlzLT5XcmFwVGV4dCgkZW5jb2RlZCwgJG1heGxlbiwgdHJ1ZSk7DQogICAgICAkZW5jb2RlZCA9IHN0cl9yZXBsYWNlKCc9Jy4kdGhpcy0+TEUsICJcbiIsIHRyaW0oJGVuY29kZWQpKTsNCiAgICB9DQoNCiAgICAkZW5jb2RlZCA9IHByZWdfcmVwbGFjZSgnL14oLiopJC9tJywgIiA9PyIuJHRoaXMtPkNoYXJTZXQuIj8kZW5jb2Rpbmc/XFwxPz0iLCAkZW5jb2RlZCk7DQogICAgJGVuY29kZWQgPSB0cmltKHN0cl9yZXBsYWNlKCJcbiIsICR0aGlzLT5MRSwgJGVuY29kZWQpKTsNCg0KICAgIHJldHVybiAkZW5jb2RlZDsNCiAgfQ0KDQogIC8qKg0KICAgKiBDaGVja3MgaWYgYSBzdHJpbmcgY29udGFpbnMgbXVsdGlieXRlIGNoYXJhY3RlcnMuDQogICAqIEBhY2Nlc3MgcHVibGljDQogICAqIEBwYXJhbSBzdHJpbmcgJHN0ciBtdWx0aS1ieXRlIHRleHQgdG8gd3JhcCBlbmNvZGUNCiAgICogQHJldHVybiBib29sDQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gSGFzTXVsdGlCeXRlcygkc3RyKSB7DQogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykpIHsNCiAgICAgIHJldHVybiAoc3RybGVuKCRzdHIpID4gbWJfc3RybGVuKCRzdHIsICR0aGlzLT5DaGFyU2V0KSk7DQogICAgfSBlbHNlIHsgLy8gQXNzdW1lIG5vIG11bHRpYnl0ZXMgKHdlIGNhbid0IGhhbmRsZSB3aXRob3V0IG1ic3RyaW5nIGZ1bmN0aW9ucyBhbnl3YXkpDQogICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KICB9DQoNCiAgLyoqDQogICAqIENvcnJlY3RseSBlbmNvZGVzIGFuZCB3cmFwcyBsb25nIG11bHRpYnl0ZSBzdHJpbmdzIGZvciBtYWlsIGhlYWRlcnMNCiAgICogd2l0aG91dCBicmVha2luZyBsaW5lcyB3aXRoaW4gYSBjaGFyYWN0ZXIuDQogICAqIEFkYXB0ZWQgZnJvbSBhIGZ1bmN0aW9uIGJ5IHBhcmF2b2lkIGF0IGh0dHA6Ly91ay5waHAubmV0L21hbnVhbC9lbi9mdW5jdGlvbi5tYi1lbmNvZGUtbWltZWhlYWRlci5waHANCiAgICogQGFjY2VzcyBwdWJsaWMNCiAgICogQHBhcmFtIHN0cmluZyAkc3RyIG11bHRpLWJ5dGUgdGV4dCB0byB3cmFwIGVuY29kZQ0KICAgKiBAcmV0dXJuIHN0cmluZw0KICAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIEJhc2U2NEVuY29kZVdyYXBNQigkc3RyKSB7DQogICAgJHN0YXJ0ID0gIj0/Ii4kdGhpcy0+Q2hhclNldC4iP0I/IjsNCiAgICAkZW5kID0gIj89IjsNCiAgICAkZW5jb2RlZCA9ICIiOw0KDQogICAgJG1iX2xlbmd0aCA9IG1iX3N0cmxlbigkc3RyLCAkdGhpcy0+Q2hhclNldCk7DQogICAgLy8gRWFjaCBsaW5lIG11c3QgaGF2ZSBsZW5ndGggPD0gNzUsIGluY2x1ZGluZyAkc3RhcnQgYW5kICRlbmQNCiAgICAkbGVuZ3RoID0gNzUgLSBzdHJsZW4oJHN0YXJ0KSAtIHN0cmxlbigkZW5kKTsNCiAgICAvLyBBdmVyYWdlIG11bHRpLWJ5dGUgcmF0aW8NCiAgICAkcmF0aW8gPSAkbWJfbGVuZ3RoIC8gc3RybGVuKCRzdHIpOw0KICAgIC8vIEJhc2U2NCBoYXMgYSA0OjMgcmF0aW8NCiAgICAkb2Zmc2V0ID0gJGF2Z0xlbmd0aCA9IGZsb29yKCRsZW5ndGggKiAkcmF0aW8gKiAuNzUpOw0KDQogICAgZm9yICgkaSA9IDA7ICRpIDwgJG1iX2xlbmd0aDsgJGkgKz0gJG9mZnNldCkgew0KICAgICAgJGxvb2tCYWNrID0gMDsNCg0KICAgICAgZG8gew0KICAgICAgICAkb2Zmc2V0ID0gJGF2Z0xlbmd0aCAtICRsb29rQmFjazsNCiAgICAgICAgJGNodW5rID0gbWJfc3Vic3RyKCRzdHIsICRpLCAkb2Zmc2V0LCAkdGhpcy0+Q2hhclNldCk7DQogICAgICAgICRjaHVuayA9IGJhc2U2NF9lbmNvZGUoJGNodW5rKTsNCiAgICAgICAgJGxvb2tCYWNrKys7DQogICAgICB9DQogICAgICB3aGlsZSAoc3RybGVuKCRjaHVuaykgPiAkbGVuZ3RoKTsNCg0KICAgICAgJGVuY29kZWQgLj0gJGNodW5rIC4gJHRoaXMtPkxFOw0KICAgIH0NCg0KICAgIC8vIENob21wIHRoZSBsYXN0IGxpbmVmZWVkDQogICAgJGVuY29kZWQgPSBzdWJzdHIoJGVuY29kZWQsIDAsIC1zdHJsZW4oJHRoaXMtPkxFKSk7DQogICAgcmV0dXJuICRlbmNvZGVkOw0KICB9DQoNCiAgLyoqDQogICogRW5jb2RlIHN0cmluZyB0byBxdW90ZWQtcHJpbnRhYmxlLg0KICAqIE9ubHkgdXNlcyBzdGFuZGFyZCBQSFAsIHNsb3csIGJ1dCB3aWxsIGFsd2F5cyB3b3JrDQogICogQGFjY2VzcyBwdWJsaWMNCiAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgdGhlIHRleHQgdG8gZW5jb2RlDQogICogQHBhcmFtIGludGVnZXIgJGxpbmVfbWF4IE51bWJlciBvZiBjaGFycyBhbGxvd2VkIG9uIGEgbGluZSBiZWZvcmUgd3JhcHBpbmcNCiAgKiBAcmV0dXJuIHN0cmluZw0KICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gRW5jb2RlUVBwaHAoICRpbnB1dCA9ICcnLCAkbGluZV9tYXggPSA3NiwgJHNwYWNlX2NvbnYgPSBmYWxzZSkgew0KICAgICRoZXggPSBhcnJheSgnMCcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJ0EnLCdCJywnQycsJ0QnLCdFJywnRicpOw0KICAgICRsaW5lcyA9IHByZWdfc3BsaXQoJy8oPzpcclxufFxyfFxuKS8nLCAkaW5wdXQpOw0KICAgICRlb2wgPSAiXHJcbiI7DQogICAgJGVzY2FwZSA9ICc9JzsNCiAgICAkb3V0cHV0ID0gJyc7DQogICAgd2hpbGUoIGxpc3QoLCAkbGluZSkgPSBlYWNoKCRsaW5lcykgKSB7DQogICAgICAkbGlubGVuID0gc3RybGVuKCRsaW5lKTsNCiAgICAgICRuZXdsaW5lID0gJyc7DQogICAgICBmb3IoJGkgPSAwOyAkaSA8ICRsaW5sZW47ICRpKyspIHsNCiAgICAgICAgJGMgPSBzdWJzdHIoICRsaW5lLCAkaSwgMSApOw0KICAgICAgICAkZGVjID0gb3JkKCAkYyApOw0KICAgICAgICBpZiAoICggJGkgPT0gMCApICYmICggJGRlYyA9PSA0NiApICkgeyAvLyBjb252ZXJ0IGZpcnN0IHBvaW50IGluIHRoZSBsaW5lIGludG8gPTJFDQogICAgICAgICAgJGMgPSAnPTJFJzsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoICRkZWMgPT0gMzIgKSB7DQogICAgICAgICAgaWYgKCAkaSA9PSAoICRsaW5sZW4gLSAxICkgKSB7IC8vIGNvbnZlcnQgc3BhY2UgYXQgZW9sIG9ubHkNCiAgICAgICAgICAgICRjID0gJz0yMCc7DQogICAgICAgICAgfSBlbHNlIGlmICggJHNwYWNlX2NvbnYgKSB7DQogICAgICAgICAgICAkYyA9ICc9MjAnOw0KICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlaWYgKCAoJGRlYyA9PSA2MSkgfHwgKCRkZWMgPCAzMiApIHx8ICgkZGVjID4gMTI2KSApIHsgLy8gYWx3YXlzIGVuY29kZSAiXHQiLCB3aGljaCBpcyAqbm90KiByZXF1aXJlZA0KICAgICAgICAgICRoMiA9IGZsb29yKCRkZWMvMTYpOw0KICAgICAgICAgICRoMSA9IGZsb29yKCRkZWMlMTYpOw0KICAgICAgICAgICRjID0gJGVzY2FwZS4kaGV4WyRoMl0uJGhleFskaDFdOw0KICAgICAgICB9DQogICAgICAgIGlmICggKHN0cmxlbigkbmV3bGluZSkgKyBzdHJsZW4oJGMpKSA+PSAkbGluZV9tYXggKSB7IC8vIENSTEYgaXMgbm90IGNvdW50ZWQNCiAgICAgICAgICAkb3V0cHV0IC49ICRuZXdsaW5lLiRlc2NhcGUuJGVvbDsgLy8gIHNvZnQgbGluZSBicmVhazsgIiA9XHJcbiIgaXMgb2theQ0KICAgICAgICAgICRuZXdsaW5lID0gJyc7DQogICAgICAgICAgLy8gY2hlY2sgaWYgbmV3bGluZSBmaXJzdCBjaGFyYWN0ZXIgd2lsbCBiZSBwb2ludCBvciBub3QNCiAgICAgICAgICBpZiAoICRkZWMgPT0gNDYgKSB7DQogICAgICAgICAgICAkYyA9ICc9MkUnOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAkbmV3bGluZSAuPSAkYzsNCiAgICAgIH0gLy8gZW5kIG9mIGZvcg0KICAgICAgJG91dHB1dCAuPSAkbmV3bGluZS4kZW9sOw0KICAgIH0gLy8gZW5kIG9mIHdoaWxlDQogICAgcmV0dXJuICRvdXRwdXQ7DQogIH0NCg0KICAvKioNCiAgKiBFbmNvZGUgc3RyaW5nIHRvIFJGQzIwNDUgKDYuNykgcXVvdGVkLXByaW50YWJsZSBmb3JtYXQNCiAgKiBVc2VzIGEgUEhQNSBzdHJlYW0gZmlsdGVyIHRvIGRvIHRoZSBlbmNvZGluZyBhYm91dCA2NHggZmFzdGVyIHRoYW4gdGhlIG9sZCB2ZXJzaW9uDQogICogQWxzbyByZXN1bHRzIGluIHNhbWUgY29udGVudCBhcyB5b3Ugc3RhcnRlZCB3aXRoIGFmdGVyIGRlY29kaW5nDQogICogQHNlZSBFbmNvZGVRUHBocCgpDQogICogQGFjY2VzcyBwdWJsaWMNCiAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgdGhlIHRleHQgdG8gZW5jb2RlDQogICogQHBhcmFtIGludGVnZXIgJGxpbmVfbWF4IE51bWJlciBvZiBjaGFycyBhbGxvd2VkIG9uIGEgbGluZSBiZWZvcmUgd3JhcHBpbmcNCiAgKiBAcGFyYW0gYm9vbGVhbiAkc3BhY2VfY29udiBEdW1teSBwYXJhbSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIEVuY29kZVFQIGZ1bmN0aW9uDQogICogQHJldHVybiBzdHJpbmcNCiAgKiBAYXV0aG9yIE1hcmN1cyBCb2ludG9uDQogICovDQogIHB1YmxpYyBmdW5jdGlvbiBFbmNvZGVRUCgkc3RyaW5nLCAkbGluZV9tYXggPSA3NiwgJHNwYWNlTHluQGNvbnYgPSBmYWxzZSkgew0KICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3F1b3RlZF9wcmludGFibGVfZW5jb2RlJykpIHsgLy9Vc2UgbmF0aXZlIGZ1bmN0aW9uIGlmIGl0J3MgYXZhaWxhYmxlICg+PSBQSFA1LjMpDQogICAgICByZXR1cm4gcXVvdGVkX3ByaW50YWJsZV9lbmNvZGUoJHN0cmluZyk7DQogICAgfQ0KICAgICRmaWx0ZXJzID0gc3RyZWFtX2dldF9maWx0ZXJzKCk7DQogICAgaWYgKCFpbl9hcnJheSgnY29udmVydC4qJywgJGZpbHRlcnMpKSB7IC8vR290IGNvbnZlcnQgc3RyZWFtIGZpbHRlcj8NCiAgICAgIHJldHVybiAkdGhpcy0+RW5jb2RlUVBwaHAoJHN0cmluZywgJGxpbmVfbWF4LCAkc3BhY2VfY29udik7IC8vRmFsbCBiYWNrIHRvIG9sZCBpbXBsZW1lbnRhdGlvbg0KICAgIH0NCiAgICAkZnAgPSBmb3BlbigncGhwOi8vdGVtcC8nLCAncisnKTsNCiAgICAkc3RyaW5nID0gcHJlZ19yZXBsYWNlKCcvXHJcbj8vJywgJHRoaXMtPkxFLCAkc3RyaW5nKTsgLy9Ob3JtYWxpc2UgbGluZSBicmVha3MNCiAgICAkcGFyYW1zID0gYXJyYXkoJ2xpbmUtbGVuZ3RoJyA9PiAkbGluZV9tYXgsICdsaW5lLWJyZWFrLWNoYXJzJyA9PiAkdGhpcy0+TEUpOw0KICAgICRzID0gc3RyZWFtX2ZpbHRlcl9hcHBlbmQoJGZwLCAnY29udmVydC5xdW90ZWQtcHJpbnRhYmxlLWVuY29kZScsIFNUUkVBTV9GSUxURVJfUkVBRCwgJHBhcmFtcyk7DQogICAgZnB1dHMoJGZwLCAkc3RyaW5nKTsNCiAgICByZXdpbmQoJGZwKTsNCiAgICAkb3V0ID0gc3RyZWFtX2dldF9jb250ZW50cygkZnApOw0KICAgIHN0cmVhbV9maWx0ZXJfcmVtb3ZlKCRzKTsNCiAgICAkb3V0ID0gcHJlZ19yZXBsYWNlKCcvXlwuL20nLCAnPTJFJywgJG91dCk7IC8vRW5jb2RlIC4gaWYgaXQgaXMgZmlyc3QgY2hhciBvbiBhIGxpbmUsIHdvcmthcm91bmQgZm9yIGJ1ZyBpbiBFeGNoYW5nZQ0KICAgIGZjbG9zZSgkZnApOw0KICAgIHJldHVybiAkb3V0Ow0KICB9DQoNCiAgLyoqDQogICAqIEVuY29kZSBzdHJpbmcgdG8gcSBlbmNvZGluZy4NCiAgICogQGxpbmsgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjA0Nw0KICAgKiBAcGFyYW0gc3RyaW5nICRzdHIgdGhlIHRleHQgdG8gZW5jb2RlDQogICAqIEBwYXJhbSBzdHJpbmcgJHBvc2l0aW9uIFdoZXJlIHRoZSB0ZXh0IGlzIGdvaW5nIHRvIGJlIHVzZWQsIHNlZSB0aGUgUkZDIGZvciB3aGF0IHRoYXQgbWVhbnMNCiAgICogQGFjY2VzcyBwdWJsaWMNCiAgICogQHJldHVybiBzdHJpbmcNCiAgICovDQogIHB1YmxpYyBmdW5jdGlvbiBFbmNvZGVRICgkc3RyLCAkcG9zaXRpb24gPSAndGV4dCcpIHsNCiAgICAvLyBUaGVyZSBzaG91bGQgbm90IGJlIGFueSBFT0wgaW4gdGhlIHN0cmluZw0KICAgICRlbmNvZGVkID0gcHJlZ19yZXBsYWNlKCcvW1xyXG5dKi8nLCAnJywgJHN0cik7DQoNCiAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJHBvc2l0aW9uKSkgew0KICAgICAgY2FzZSAncGhyYXNlJzoNCiAgICAgICAgJGVuY29kZWQgPSBwcmVnX3JlcGxhY2UoIi8oW15BLVphLXowLTkhKitcLyAtXSkvZSIsICInPScuc3ByaW50ZignJTAyWCcsIG9yZCgnXFwxJykpIiwgJGVuY29kZWQpOw0KICAgICAgICBicmVhazsNCiAgICAgIGNhc2UgJ2NvbW1lbnQnOg0KICAgICAgICAkZW5jb2RlZCA9IHByZWdfcmVwbGFjZSgiLyhbXChcKVwiXSkvZSIsICInPScuc3ByaW50ZignJTAyWCcsIG9yZCgnXFwxJykpIiwgJGVuY29kZWQpOw0KICAgICAgY2FzZSAndGV4dCc6DQogICAgICBkZWZhdWx0Og0KICAgICAgICAvLyBSZXBsYWNlIGV2ZXJ5IGhpZ2ggYXNjaWksIGNvbnRyb2wgPSwgPyBhbmQgXyBjaGFyYWN0ZXJzDQogICAgICAgIC8vVE9ETyB1c2luZyAvZSAoZXF1aXZhbGVudCB0byBldmFsKCkpIGlzIHByb2JhYmx5IG5vdCBhIGdvb2QgaWRlYQ0KICAgICAgICAkZW5jb2RlZCA9IHByZWdfcmVwbGFjZSgnLyhbXDAwMC1cMDExXDAxM1wwMTRcMDE2LVwwMzdcMDc1XDA3N1wxMzdcMTc3LVwzNzddKS9lJywNCiAgICAgICAgICAgICAgIic9Jy5zcHJpbnRmKCclMDJYJywgb3JkKCdcXDEnKSkiLCAkZW5jb2RlZCk7DQogICAgICAgIGJyZWFrOw0KICAgIH0NCg0KICAgIC8vIFJlcGxhY2UgZXZlcnkgc3BhY2VzIHRvIF8gKG1vcmUgcmVhZGFibGUgdGhhbiA9MjApDQogICAgJGVuY29kZWQgPSBzdHJfcmVwbGFjZSgnICcsICdfJywgJGVuY29kZWQpOw0KDQogICAgcmV0dXJuICRlbmNvZGVkOw0KICB9DQoNCiAgLyoqDQogICAqIEFkZHMgYSBzdHJpbmcgb3IgYmluYXJ5IGF0dGFjaG1lbnQgKG5vbi1maWxlc3lzdGVtKSB0byB0aGUgbGlzdC4NCiAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIGFzY2lpIG9yIGJpbmFyeSBkYXRhLA0KICAgKiBzdWNoIGFzIGEgQkxPQiByZWNvcmQgZnJvbSBhIGRhdGFiYXNlLg0KICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcgU3RyaW5nIGF0dGFjaG1lbnQgZGF0YS4NCiAgICogQHBhcmFtIHN0cmluZyAkZmlsZW5hbWUgTmFtZSBvZiB0aGUgYXR0YWNobWVudC4NCiAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgRmlsZSBlbmNvZGluZyAoc2VlICRFbmNvZGluZykuDQogICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuDQogICAqIEByZXR1cm4gdm9pZA0KICAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIEFkZFN0cmluZ0F0dGFjaG1lbnQoJHN0cmluZywgJGZpbGVuYW1lLCAkZW5jb2RpbmcgPSAnYmFzZTY0JywgJHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykgew0KICAgIC8vIEFwcGVuZCB0byAkYXR0YWNobWVudCBhcnJheQ0KICAgICR0aGlzLT5hdHRhY2htZW50W10gPSBhcnJheSgNCiAgICAgIDAgPT4gJHN0cmluZywNCiAgICAgIDEgPT4gJGZpbGVuYW1lLA0KICAgICAgMiA9PiBiYXNlbmFtZSgkZmlsZW5hbWUpLA0KICAgICAgMyA9PiAkZW5jb2RpbmcsDQogICAgICA0ID0+ICR0eXBlLA0KICAgICAgNSA9PiB0cnVlLCAgLy8gaXNTdHJpbmdBdHRhY2htZW50DQogICAgICA2ID0+ICdhdHRhY2htZW50JywNCiAgICAgIDcgPT4gMA0KICAgICk7DQogIH0NCg0KICAvKioNCiAgICogQWRkcyBhbiBlbWJlZGRlZCBhdHRhY2htZW50LiAgVGhpcyBjYW4gaW5jbHVkZSBpbWFnZXMsIHNvdW5kcywgYW5kDQogICAqIGp1c3QgYWJvdXQgYW55IG90aGVyIGRvY3VtZW50LiAgTWFrZSBzdXJlIHRvIHNldCB0aGUgJHR5cGUgdG8gYW4NCiAgICogaW1hZ2UgdHlwZS4gIEZvciBKUEVHIGltYWdlcyB1c2UgImltYWdlL2pwZWciIGFuZCBmb3IgR0lGIGltYWdlcw0KICAgKiB1c2UgImltYWdlL2dpZiIuDQogICAqIEBwYXJhbSBzdHJpbmcgJHBhdGggUGF0aCB0byB0aGUgYXR0YWNobWVudC4NCiAgICogQHBhcmFtIHN0cmluZyAkY2lkIENvbnRlbnQgSUQgb2YgdGhlIGF0dGFjaG1lbnQuICBVc2UgdGhpcyB0byBpZGVudGlmeQ0KICAgKiAgICAgICAgdGhlIElkIGZvciBhY2Nlc3NpbmcgdGhlIGltYWdlIGluIGFuIEhUTUwgZm9ybS4NCiAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBPdmVycmlkZXMgdGhlIGF0dGFjaG1lbnQgbmFtZS4NCiAgICogQHBhcmFtIHN0cmluZyAkZW5jb2RpbmcgRmlsZSBlbmNvZGluZyAoc2VlICRFbmNvZGluZykuDQogICAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgRmlsZSBleHRlbnNpb24gKE1JTUUpIHR5cGUuDQogICAqIEByZXR1cm4gYm9vbA0KICAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIEFkZEVtYmVkZGVkSW1hZ2UoJHBhdGgsICRjaWQsICRuYW1lID0gJycsICRlbmNvZGluZyA9ICdiYXNlNjQnLCAkdHlwZSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKSB7DQoNCiAgICBpZiAoICFAaXNfZmlsZSgkcGF0aCkgKSB7DQogICAgICAkdGhpcy0+U2V0RXJyb3IoJHRoaXMtPkxhbmcoJ2ZpbGVfYWNjZXNzJykgLiAkcGF0aCk7DQogICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgJGZpbGVuYW1lID0gYmFzZW5hbWUoJHBhdGgpOw0KICAgIGlmICggJG5hbWUgPT0gJycgKSB7DQogICAgICAkbmFtZSA9ICRmaWxlbmFtZTsNCiAgICB9DQoNCiAgICAvLyBBcHBlbmQgdG8gJGF0dGFjaG1lbnQgYXJyYXkNCiAgICAkdGhpcy0+YXR0YWNobWVudFtdID0gYXJyYXkoDQogICAgICAwID0+ICRwYXRoLA0KICAgICAgMSA9PiAkZmlsZW5hbWUsDQogICAgICAyID0+ICRuYW1lLA0KICAgICAgMyA9PiAkZW5jb2RpbmcsDQogICAgICA0ID0+ICR0eXBlLA0KICAgICAgNSA9PiBmYWxzZSwgIC8vIGlzU3RyaW5nQXR0YWNobWVudA0KICAgICAgNiA9PiAnaW5saW5lJywNCiAgICAgIDcgPT4gJGNpZA0KICAgICk7DQoNCiAgICByZXR1cm4gdHJ1ZTsNCiAgfQ0KDQogIC8qKg0KICAgKiBSZXR1cm5zIHRydWUgaWYgYW4gaW5saW5lIGF0dGFjaG1lbnQgaXMgcHJlc2VudC4NCiAgICogQGFjY2VzcyBwdWJsaWMNCiAgICogQHJldHVybiBib29sDQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gSW5saW5lSW1hZ2VFeGlzdHMoKSB7DQogICAgZm9yZWFjaCgkdGhpcy0+YXR0YWNobWVudCBhcyAkYXR0YWNobWVudCkgew0KICAgICAgaWYgKCRhdHRhY2htZW50WzZdID09ICdpbmxpbmUnKSB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gZmFsc2U7DQogIH0NCg0KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQogIC8vIENMQVNTIE1FVEhPRFMsIE1FU1NBR0UgUkVTRVQNCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KDQogIC8qKg0KICAgKiBDbGVhcnMgYWxsIHJlY2lwaWVudHMgYXNzaWduZWQgaW4gdGhlIFRPIGFycmF5LiAgUmV0dXJucyB2b2lkLg0KICAgKiBAcmV0dXJuIHZvaWQNCiAgICovDQogIHB1YmxpYyBmdW5jdGlvbiBDbGVhckFkZHJlc3NlcygpIHsNCiAgICBmb3JlYWNoKCR0aGlzLT50byBhcyAkdG8pIHsNCiAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCR0b1swXSldKTsNCiAgICB9DQogICAgJHRoaXMtPnRvID0gYXJyYXkoKTsNCiAgfQ0KDQogIC8qKg0KICAgKiBDbGVhcnMgYWxsIHJlY2lwaWVudHMgYXNzaWduZWQgaW4gdGhlIENDIGFycmF5LiAgUmV0dXJucyB2b2lkLg0KICAgKiBAcmV0dXJuIHZvaWQNCiAgICovDQogIHB1YmxpYyBmdW5jdGlvbiBDbGVhckNDcygpIHsNCiAgICBmb3JlYWNoKCR0aGlzLT5jYyBhcyAkY2MpIHsNCiAgICAgIHVuc2V0KCR0aGlzLT5hbGxfcmVjaXBpZW50c1tzdHJ0b2xvd2VyKCRjY1swXSldKTsNCiAgICB9DQogICAgJHRoaXMtPmNjID0gYXJyYXkoKTsNCiAgfQ0KDQogIC8qKg0KICAgKiBDbGVhcnMgYWxsIHJlY2lwaWVudHMgYXNzaWduZWQgaW4gdGhlIEJDQyBhcnJheS4gIFJldHVybnMgdm9pZC4NCiAgICogQHJldHVybiB2b2lkDQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gQ2xlYXJCQ0NzKCkgew0KICAgIGZvcmVhY2goJHRoaXMtPmJjYyBhcyAkYmNjKSB7DQogICAgICB1bnNldCgkdGhpcy0+YWxsX3JlY2lwaWVudHNbc3RydG9sb3dlcigkYmNjWzBdKV0pOw0KICAgIH0NCiAgICAkdGhpcy0+YmNjID0gYXJyYXkoKTsNCiAgfQ0KDQogIC8qKg0KICAgKiBDbGVhcnMgYWxsIHJlY2lwaWVudHMgYXNzaWduZWQgaW4gdGhlIFJlcGx5VG8gYXJyYXkuICBSZXR1cm5zIHZvaWQuDQogICAqIEByZXR1cm4gdm9pZA0KICAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIENsZWFyUmVwbHlUb3MoKSB7DQogICAgJHRoaXMtPlJlcGx5VG8gPSBhcnJheSgpOw0KICB9DQoNCiAgLyoqDQogICAqIENsZWFycyBhbGwgcmVjaXBpZW50cyBhc3NpZ25lZCBpbiB0aGUgVE8sIENDIGFuZCBCQ0MNCiAgICogYXJyYXkuICBSZXR1cm5zIHZvaWQuDQogICAqIEByZXR1cm4gdm9pZA0KICAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIENsZWFyQWxsUmVjaXBpZW50cygpIHsNCiAgICAkdGhpcy0+dG8gPSBhcnJheSgpOw0KICAgICR0aGlzLT5jYyA9IGFycmF5KCk7DQogICAgJHRoaXMtPmJjYyA9IGFycmF5KCk7DQogICAgJHRoaXMtPmFsbF9yZWNpcGllbnRzID0gYXJyYXkoKTsNCiAgfQ0KDQogIC8qKg0KICAgKiBDbGVhcnMgYWxsIHByZXZpb3VzbHkgc2V0IGZpbGVzeXN0ZW0sIHN0cmluZywgYW5kIGJpbmFyeQ0KICAgKiBhdHRhY2htZW50cy4gIFJldHVybnMgdm9pZC4NCiAgICogQHJldHVybiB2b2lkDQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gQ2xlYXJBdHRhY2htZW50cygpIHsNCiAgICAkdGhpcy0+YXR0YWNobWVudCA9IGFycmF5KCk7DQogIH0NCg0KICAvKioNCiAgICogQ2xlYXJzIGFsbCBjdXN0b20gaGVhZGVycy4gIFJldHVybnMgdm9pZC4NCiAgICogQHJldHVybiB2b2lkDQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gQ2xlYXJDdXN0b21IZWFkZXJzKCkgew0KICAgICR0aGlzLT5DdXN0b21IZWFkZXIgPSBhcnJheSgpOw0KICB9DQoNCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KICAvLyBDTEFTUyBNRVRIT0RTLCBNSVNDRUxMQU5FT1VTDQogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCg0KICAvKioNCiAgICogQWRkcyB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aGUgZXJyb3IgY29udGFpbmVyLg0KICAgKiBAYWNjZXNzIHByb3RlY3RlZA0KICAgKiBAcmV0dXJuIHZvaWQNCiAgICovDQogIHByb3RlY3RlZCBmdW5jdGlvbiBTZXRFcnJvcigkbXNnKSB7DQogICAgJHRoaXMtPmVycm9yX2NvdW50Kys7DQogICAgaWYgKCR0aGlzLT5NYWlsZXIgPT0gJ3NtdHAnIGFuZCAhaXNfbnVsbCgkdGhpcy0+c210cCkpIHsNCiAgICAgICRsYXN0ZXJyb3IgPSAkdGhpcy0+c210cC0+Z2V0RXJyb3IoKTsNCiAgICAgIGlmICghZW1wdHkoJGxhc3RlcnJvcikgYW5kIGFycmF5X2tleV9leGlzdHMoJ3NtdHBfbXNnJywgJGxhc3RlcnJvcikpIHsNCiAgICAgICAgJG1zZyAuPSAnPHA+JyAuICR0aGlzLT5MYW5nKCdzbXRwX2Vycm9yJykgLiAkbGFzdGVycm9yWydzbXRwX21zZyddIC4gIjwvcD5cbiI7DQogICAgICB9DQogICAgfQ0KICAgICR0aGlzLT5FcnJvckluZm8gPSAkbXNnOw0KICB9DQoNCiAgLyoqDQogICAqIFJldHVybnMgdGhlIHByb3BlciBSRkMgODIyIGZvcm1hdHRlZCBkYXRlLg0KICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgKiBAcmV0dXJuIHN0cmluZw0KICAgKiBAc3RhdGljDQogICAqLw0KICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFJGQ0RhdGUoKSB7DQogICAgJHR6ID0gZGF0ZSgnWicpOw0KICAgICR0enMgPSAoJHR6IDwgMCkgPyAnLScgOiAnKyc7DQogICAgJHR6ID0gYWJzKCR0eik7DQogICAgJHR6ID0gKGludCkoJHR6LzM2MDApKjEwMCArICgkdHolMzYwMCkvNjA7DQogICAgJHJlc3VsdCA9IHNwcmludGYoIiVzICVzJTA0ZCIsIGRhdGUoJ0QsIGogTSBZIEg6aTpzJyksICR0enMsICR0eik7DQoNCiAgICByZXR1cm4gJHJlc3VsdDsNCiAgfQ0KDQogIC8qKg0KICAgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgaG9zdG5hbWUgb3IgJ2xvY2FsaG9zdC5sb2NhbGRvbWFpbicgaWYgdW5rbm93bi4NCiAgICogQGFjY2VzcyBwcml2YXRlDQogICAqIEByZXR1cm4gc3RyaW5nDQogICAqLw0KICBwcml2YXRlIGZ1bmN0aW9uIFNlcnZlckhvc3RuYW1lKCkgew0KICAgIGlmICghZW1wdHkoJHRoaXMtPkhvc3RuYW1lKSkgew0KICAgICAgJHJlc3VsdCA9ICR0aGlzLT5Ib3N0bmFtZTsNCiAgICB9IGVsc2VpZiAoaXNzZXQoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pKSB7DQogICAgICAkcmVzdWx0ID0gJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ107DQogICAgfSBlbHNlIHsNCiAgICAgICRyZXN1bHQgPSAnbG9jYWxob3N0LmxvY2FsZG9tYWluJzsNCiAgICB9DQoNCiAgICByZXR1cm4gJHJlc3VsdDsNCiAgfQ0KDQogIC8qKg0KICAgKiBSZXR1cm5zIGEgbWVzc2FnZSBpbiB0aGUgYXBwcm9wcmlhdGUgbGFuZ3VhZ2UuDQogICAqIEBhY2Nlc3MgcHJpdmF0ZQ0KICAgKiBAcmV0dXJuIHN0cmluZw0KICAgKi8NCiAgcHJpdmF0ZSBmdW5jdGlvbiBMYW5nKCRrZXkpIHsNCiAgICBpZihjb3VudCgkdGhpcy0+bGFuZ3VhZ2UpIDwgMSkgew0KICAgICAgJHRoaXMtPlNldExhbmd1YWdlKCdlbicpOyAvLyBzZXQgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UNCiAgICB9DQoNCiAgICBpZihpc3NldCgkdGhpcy0+bGFuZ3VhZ2VbJGtleV0pKSB7DQogICAgICByZXR1cm4gJHRoaXMtPmxhbmd1YWdlWyRrZXldOw0KICAgIH0gZWxzZSB7DQogICAgICByZXR1cm4gJ0xhbmd1YWdlIHN0cmluZyBmYWlsZWQgdG8gbG9hZDogJyAuICRrZXk7DQogICAgfQ0KICB9DQoNCiAgLyoqDQogICAqIFJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZC4NCiAgICogQGFjY2VzcyBwdWJsaWMNCiAgICogQHJldHVybiBib29sDQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gSXNFcnJvcigpIHsNCiAgICByZXR1cm4gKCR0aGlzLT5lcnJvcl9jb3VudCA+IDApOw0KICB9DQoNCiAgLyoqDQogICAqIENoYW5nZXMgZXZlcnkgZW5kIG9mIGxpbmUgZnJvbSBDUiBvciBMRiB0byBDUkxGLg0KICAgKiBAYWNjZXNzIHByaXZhdGUNCiAgICogQHJldHVybiBzdHJpbmcNCiAgICovDQogIHByaXZhdGUgZnVuY3Rpb24gRml4RU9MKCRzdHIpIHsNCiAgICAkc3RyID0gc3RyX3JlcGxhY2UoIlxyXG4iLCAiXG4iLCAkc3RyKTsNCiAgICAkc3RyID0gc3RyX3JlcGxhY2UoIlxyIiwgIlxuIiwgJHN0cik7DQogICAgJHN0ciA9IHN0cl9yZXBsYWNlKCJcbiIsICR0aGlzLT5MRSwgJHN0cik7DQogICAgcmV0dXJuICRzdHI7DQogIH0NCg0KICAvKioNCiAgICogQWRkcyBhIGN1c3RvbSBoZWFkZXIuDQogICAqIEBhY2Nlc3MgcHVibGljDQogICAqIEByZXR1cm4gdm9pZA0KICAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIEFkZEN1c3RvbUhlYWRlcigkY3VzdG9tX2hlYWRlcikgew0KICAgICR0aGlzLT5DdXN0b21IZWFkZXJbXSA9IGV4cGxvZGUoJzonLCAkY3VzdG9tX2hlYWRlciwgMik7DQogIH0NCg0KICAvKioNCiAgICogRXZhbHVhdGVzIHRoZSBtZXNz%YWdlIGFu7oZCByZXR1%cm5zIG1vZGlmaWNhdGlvbnMgZm9yIGlubGluZSBpbWFnZXMgYW5kIGJhY2tncm91bmRzDQogICAqIEBhY2Nlc3MgcHVibGljDQogICAqIEByZXR1cm4gJG1lc3NhZ2UNCiAgICovDQogIHB1YmxpYyBmdW5jdGlvbiBNc2dIVE1MKCRtZXNzYWdlLCAkYmFzZWRpciA9ICcnKSB7DQogICAgcHJlZ19tYXRjaF9hbGwoIi8oc3JjfGJhY2tncm91bmQpPVwiKC4qKVwiL1VpIiwgJG1lc3NhZ2UsICRpbWFnZXMpOw0KICAgIGlmKGlzc2V0KCRpbWFnZXNbMl0pKSB7DQogICAgICBmb3JlYWNoKCRpbWFnZXNbMl0gYXMgJGkgPT4gJHVybCkgew0KICAgICAgICAvLyBkbyBub3QgY2hhbmdlIHVybHMgZm9yIGFic29sdXRlIGltYWdlcyAodGhhbmtzIHRvIGNvcnZ1c2NvcmF4KQ0KICAgICAgICBpZiAoIXByZWdfbWF0Y2goJyNeW0Etel0rOi8vIycsJHVybCkpIHsNCiAgICAgICAgICAkZmlsZW5hbWUgPSBiYXNlbmFtZSgkdXJsKTsNCiAgICAgICAgICAkZGlyZWN0b3J5ID0gZGlybmFtZSgkdXJsKTsNCiAgICAgICAgICAoJGRpcmVjdG9yeSA9PSAnLicpPyRkaXJlY3Rvcnk9Jyc6Jyc7DQogICAgICAgICAgJGNpZCA9ICdjaWQ6JyAuIG1kNSgkZmlsZW5hbWUpOw0KICAgICAgICAgICRleHQgPSBwYXRoaW5mbygkZmlsZW5hbWUsIFBBVEhJTkZPX0VYVEVOU0lPTik7DQogICAgICAgICAgJG1pbWVUeXBlICA9IHNlbGY6Ol9taW1lX3R5cGVzKCRleHQpOw0KICAgICAgICAgIGlmICggc3RybGVuKCRiYXNlZGlyKSA+IDEgJiYgc3Vic3RyKCRiYXNlZGlyLC0xKSAhPSAnLycpIHsgJGJhc2VkaXIgLj0gJy8nOyB9DQogICAgICAgICAgaWYgKCBzdHJsZW4oJGRpcmVjdG9yeSkgPiAxICYmIHN1YnN0cigkZGlyZWN0b3J5LC0xKSAhPSAnLycpIHsgJGRpcmVjdG9yeSAuPSAnLyc7IH0NCiAgICAgICAgICBpZiAoICR0aGlzLT5BZGRFbWJlZGRlZEltYWdlKCRiYXNlZGlyLiRkaXJlY3RvcnkuJGZpbGVuYW1lLCBtZDUoJGZpbGVuYW1lKSwgJGZpbGVuYW1lLCAnYmFzZTY0JywkbWltZVR5cGUpICkgew0KICAgICAgICAgICAgJG1lc3NhZ2UgPSBwcmVnX3JlcGxhY2UoIi8iLiRpbWFnZXNbMV1bJGldLiI9XCIiLnByZWdfcXVvdGUoJHVybCwgJy8nKS4iXCIvVWkiLCAkaW1hZ2VzWzFdWyRpXS4iPVwiIi4kY2lkLiJcIiIsICRtZXNzYWdlKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgJHRoaXMtPklzSFRNTCh0cnVlKTsNCiAgICAkdGhpcy0+Qm9keSA9ICRtZXNzYWdlOw0KICAgICR0ZXh0TXNnID0gdHJpbShzdHJpcF90YWdzKHByZWdfcmVwbGFjZSgnLzwoaGVhZHx0aXRsZXxzdHlsZXxzY3JpcHQpW14+XSo+Lio/PFwvXFwxPi9zJywnJywkbWVzc2FnZSkpKTsNCiAgICBpZiAoIWVtcHR5KCR0ZXh0TXNnKSAmJiBlbXB0eSgkdGhpcy0+QWx0Qm9keSkpIHsNCiAgICAgICR0aGlzLT5BbHRCb2R5ID0gaHRtbF9lbnRpdHlfZGVjb2RlKCR0ZXh0TXNnKTsNCiAgICB9DQogICAgaWYgKGVtcHR5KCR0aGlzLT5BbHRCb2R5KSkgew0KICAgICAgJHRoaXMtPkFsdEJvZHkgPSAnVG8gdmlldyB0aGlzIGVtYWlsIG1lc3NhZ2UsIG9wZW4gaXQgaW4gYSBwcm9ncmFtIHRoYXQgdW5kZXJzdGFuZHMgSFRNTCEnIC4gIlxuXG4iOw0KICAgIH0NCiAgfQ0KDQogIC8qKg0KICAgKiBHZXRzIHRoZSBNSU1FIHR5cGUgb2YgdGhlIGVtYmVkZGVkIG9yIGlubGluZSBpbWFnZQ0KICAgKiBAcGFyYW0gc3RyaW5nIEZpbGUgZXh0ZW5zaW9uDQogICAqIEBhY2Nlc3MgcHVibGljDQogICAqIEByZXR1cm4gc3RyaW5nIE1JTUUgdHlwZSBvZiBleHQNCiAgICogQHN0YXRpYw0KICAgKi8NCiAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBfbWltZV90eXBlcygkZXh0ID0gJycpIHsNCiAgICAkbWltZXMgPSBhcnJheSgNCiAgICAgICdocXgnICAgPT4gICdhcHBsaWNhdGlvbi9tYWMtYmluaGV4NDAnLA0KICAgICAgJ2NwdCcgICA9PiAgJ2FwcGxpY2F0aW9uL21hYy1jb21wYWN0cHJvJywNCiAgICAgICdkb2MnICAgPT4gICdhcHBsaWNhdGlvbi9tc3dvcmQnLA0KICAgICAgJ2JpbicgICA9PiAgJ2FwcGxpY2F0aW9uL21hY2JpbmFyeScsDQogICAgICAnZG1zJyAgID0+ICAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywNCiAgICAgICdsaGEnICAgPT4gICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLA0KICAgICAgJ2x6aCcgICA9PiAgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsDQogICAgICAnZXhlJyAgID0+ICAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywNCiAgICAgICdjbGFzcycgPT4gICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLA0KICAgICAgJ3BzZCcgICA9PiAgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsDQogICAgICAnc28nICAgID0+ICAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywNCiAgICAgICdzZWEnICAgPT4gICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLA0KICAgICAgJ2RsbCcgICA9PiAgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsDQogICAgICAnb2RhJyAgID0+ICAnYXBwbGljYXRpb24vb2RhJywNCiAgICAgICdwZGYnICAgPT4gICdhcHBsaWNhdGlvbi9wZGYnLA0KICAgICAgJ2FpJyAgICA9PiAgJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLA0KICAgICAgJ2VwcycgICA9PiAgJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLA0KICAgICAgJ3BzJyAgICA9PiAgJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLA0KICAgICAgJ3NtaScgICA9PiAgJ2FwcGxpY2F0aW9uL3NtaWwnLA0KICAgICAgJ3NtaWwnICA9PiAgJ2FwcGxpY2F0aW9uL3NtaWwnLA0KICAgICAgJ21pZicgICA9PiAgJ2FwcGxpY2F0aW9uL3ZuZC5taWYnLA0KICAgICAgJ3hscycgICA9PiAgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcsDQogICAgICAncHB0JyAgID0+ICAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLA0KICAgICAgJ3dieG1sJyA9PiAgJ2FwcGxpY2F0aW9uL3ZuZC53YXAud2J4bWwnLA0KICAgICAgJ3dtbGMnICA9PiAgJ2FwcGxpY2F0aW9uL3ZuZC53YXAud21sYycsDQogICAgICAnZGNyJyAgID0+ICAnYXBwbGljYXRpb24veC1kaXJlY3RvcicsDQogICAgICAnZGlyJyAgID0+ICAnYXBwbGljYXRpb24veC1kaXJlY3RvcicsDQogICAgICAnZHhyJyAgID0+ICAnYXBwbGljYXRpb24veC1kaXJlY3RvcicsDQogICAgICAnZHZpJyAgID0+ICAnYXBwbGljYXRpb24veC1kdmknLA0KICAgICAgJ2d0YXInICA9PiAgJ2FwcGxpY2F0aW9uL3gtZ3RhcicsDQogICAgICAncGhwJyAgID0+ICAnYXBwbGljYXRpb24veC1odHRwZC1waHAnLA0KICAgICAgJ3BocDQnICA9PiAgJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwJywNCiAgICAgICdwaHAzJyAgPT4gICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCcsDQogICAgICAncGh0bWwnID0+ICAnYXBwbGljYXRpb24veC1odHRwZC1waHAnLA0KICAgICAgJ3BocHMnICA9PiAgJ2FwcGxpY2F0aW9uL3gtaHR0cGQtcGhwLXNvdXJjZScsDQogICAgICAnanMnICAgID0+ICAnYXBwbGljYXRpb24veC1qYXZhc2NyaXB0JywNCiAgICAgICdzd2YnICAgPT4gICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcsDQogICAgICAnc2l0JyAgID0+ICAnYXBwbGljYXRpb24veC1zdHVmZml0JywNCiAgICAgICd0YXInICAgPT4gICdhcHBsaWNhdGlvbi94LXRhcicsDQogICAgICAndGd6JyAgID0+ICAnYXBwbGljYXRpb24veC10YXInLA0KICAgICAgJ3hodG1sJyA9PiAgJ2FwcGxpY2F0aW9uL3hodG1sK3htbCcsDQogICAgICAneGh0JyAgID0+ICAnYXBwbGljYXRpb24veGh0bWwreG1sJywNCiAgICAgICd6aXAnICAgPT4gICdhcHBsaWNhdGlvbi96aXAnLA0KICAgICAgJ21pZCcgICA9PiAgJ2F1ZGlvL21pZGknLA0KICAgICAgJ21pZGknICA9PiAgJ2F1ZGlvL21pZGknLA0KICAgICAgJ21wZ2EnICA9PiAgJ2F1ZGlvL21wZWcnLA0KICAgICAgJ21wMicgICA9PiAgJ2F1ZGlvL21wZWcnLA0KICAgICAgJ21wMycgICA9PiAgJ2F1ZGlvL21wZWcnLA0KICAgICAgJ2FpZicgICA9PiAgJ2F1ZGlvL3gtYWlmZicsDQogICAgICAnYWlmZicgID0+ICAnYXVkaW8veC1haWZmJywNCiAgICAgICdhaWZjJyAgPT4gICdhdWRpby94LWFpZmYnLA0KICAgICAgJ3JhbScgICA9PiAgJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvJywNCiAgICAgICdybScgICAgPT4gICdhdWRpby94LXBuLXJlYWxhdWRpbycsDQogICAgICAncnBtJyAgID0+ICAnYXVkaW8veC1wbi1yZWFsYXVkaW8tcGx1Z2luJywNCiAgICAgICdyYScgICAgPT4gICdhdWRpby94LXJlYWxhdWRpbycsDQogICAgICAncnYnICAgID0+ICAndmlkZW8vdm5kLnJuLXJlYWx2aWRlbycsDQogICAgICAnd2F2JyAgID0+ICAnYXVkaW8veC13YXYnLA0KICAgICAgJ2JtcCcgICA9PiAgJ2ltYWdlL2JtcCcsDQogICAgICAnZ2lmJyAgID0+ICAnaW1hZ2UvZ2lmJywNCiAgICAgICdqcGVnJyAgPT4gICdpbWFnZS9qcGVnJywNCiAgICAgICdqcGcnICAgPT4gICdpbWFnZS9qcGVnJywNCiAgICAgICdqcGUnICAgPT4gICdpbWFnZS9qcGVnJywNCiAgICAgICdwbmcnICAgPT4gICdpbWFnZS9wbmcnLA0KICAgICAgJ3RpZmYnICA9PiAgJ2ltYWdlL3RpZmYnLA0KICAgICAgJ3RpZicgICA9PiAgJ2ltYWdlL3RpZmYnLA0KICAgICAgJ2NzcycgICA9PiAgJ3RleHQvY3NzJywNCiAgICAgICdodG1sJyAgPT4gICd0ZXh0L2h0bWwnLA0KICAgICAgJ2h0bScgICA9PiAgJ3RleHQvaHRtbCcsDQogICAgICAnc2h0bWwnID0+ICAndGV4dC9odG1sJywNCiAgICAgICd0eHQnICAgPT4gICd0ZXh0L3BsYWluJywNCiAgICAgICd0ZXh0JyAgPT4gICd0ZXh0L3BsYWluJywNCiAgICAgICdsb2cnICAgPT4gICd0ZXh0L3BsYWluJywNCiAgICAgICdydHgnICAgPT4gICd0ZXh0L3JpY2h0ZXh0JywNCiAgICAgICdydGYnICAgPT4gICd0ZXh0L3J0ZicsDQogICAgICAneG1sJyAgID0+ICAndGV4dC94bWwnLA0KICAgICAgJ3hzbCcgICA9PiAgJ3RleHQveG1sJywNCiAgICAgICdtcGVnJyAgPT4gICd2aWRlby9tcGVnJywNCiAgICAgICdtcGcnICAgPT4gICd2aWRlby9tcGVnJywNCiAgICAgICdtcGUnICAgPT4gICd2aWRlby9tcGVnJywNCiAgICAgICdxdCcgICAgPT4gICd2aWRlby9xdWlja3RpbWUnLA0KICAgICAgJ21vdicgICA9PiAgJ3ZpZGVvL3F1aWNrdGltZScsDQogICAgICAnYXZpJyAgID0+ICAndmlkZW8veC1tc3ZpZGVvJywNCiAgICAgICdtb3ZpZScgPT4gICd2aWRlby94LXNnaS1tb3ZpZScsDQogICAgICAnZG9jJyAgID0+ICAnYXBwbGljYXRpb24vbXN3b3JkJywNCiAgICAgICd3b3JkJyAgPT4gICdhcHBsaWNhdGlvbi9tc3dvcmQnLA0KICAgICAgJ3hsJyAgICA9PiAgJ2FwcGxpY2F0aW9uL2V4Y2VsJywNCiAgICAgICdlbWwnICAgPT4gICdtZXNzYWdlL3JmYzgyMicNCiAgICApOw0KICAgIHJldHVybiAoIWlzc2V0KCRtaW1lc1tzdHJ0b2xvd2VyKCRleHQpXSkpID8gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgOiAkbWltZXNbc3RydG9sb3dlcigkZXh0KV07DQogIH0NCg0KICAvKioNCiAgKiBTZXQgKG9yIHJlc2V0KSBDbGFzcyBPYmplY3RzICh2YXJpYWJsZXMpDQogICoNCiAgKiBVc2FnZSBFeGFtcGxlOg0KICAqICRwYWdlLT5zZXQoJ1gtUHJpb3JpdHknLCAnMycpOw0KICAqDQogICogQGFjY2VzcyBwdWJsaWMNCiAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIFBhcmFtZXRlciBOYW1lDQogICogQHBhcmFtIG1peGVkICR2YWx1ZSBQYXJhbWV0ZXIgVmFsdWUNCiAgKiBOT1RFOiB3aWxsIG5vdCB3b3JrIHdpdGggYXJyYXlzLCB0aGVyZSBhcmUgbm8gYXJyYXlzIHRvIHNldC9yZXNldA0KICAqIEB0b2RvIFNob3VsZCB0aGlzIG5vdCBiZSB1c2luZyBfX3NldCgpIG1hZ2ljIGZ1bmN0aW9uPw0KICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gc2V0KCRuYW1lLCAkdmFsdWUgPSAnJykgew0KICAgIHRyeSB7DQogICAgICBpZiAoaXNzZXQoJHRoaXMtPiRuYW1lKSApIHsNCiAgICAgICAgJHRoaXMtPiRuYW1lID0gJHZhbHVlOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhyb3cgbmV3IHBocG1haWxlckV4Y2VwdGlvbigkdGhpcy0+TGFuZygndmFyaWFibGVfc2V0JykgLiAkbmFtZSwgc2VsZjo6U1RPUF9DUklUSUNBTCk7DQogICAgICB9DQogICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7DQogICAgICAkdGhpcy0+U2V0RXJyb3IoJGUtPmdldE1lc3NhZ2UoKSk7DQogICAgICBpZiAoJGUtPmdldENvZGUoKSA9PSBzZWxmOjpTVE9QX0NSSVRJQ0FMKSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHRydWU7DQogIH0NCg0KICAvKioNCiAgICogU3RyaXBzIG5ld2xpbmVzIHRvIHByZXZlbnQgaGVhZGVyIGluamVjdGlvbi4NCiAgICogQGFjY2VzcyBwdWJsaWMNCiAgICogQHBhcmFtIHN0cmluZyAkc3RyIFN0cmluZw0KICAgKiBAcmV0dXJuIHN0cmluZw0KICAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIFNlY3VyZUhlYWRlcigkc3RyKSB7DQogICAgJHN0ciA9IHN0cl9yZXBsYWNlKCJcciIsICcnLCAkc3RyKTsNCiAgICAkc3RyID0gc3RyX3JlcGxhY2UoIlxuIiwgJycsICRzdHIpOw0KICAgIHJldHVybiB0cmltKCRzdHIpOw0KICB9DQoNCiAgLyoqDQogICAqIFNldCB0aGUgcHJpdmF0ZSBrZXkgZmlsZSBhbmQgcGFzc3dvcmQgdG8gc2lnbiB0aGUgbWVzc2FnZS4NCiAgICoNCiAgICogQGFjY2VzcyBwdWJsaWMNCiAgICogQHBhcmFtIHN0cmluZyAka2V5X2ZpbGVuYW1lIFBhcmFtZXRlciBGaWxlIE5hbWUNCiAgICogQHBhcmFtIHN0cmluZyAka2V5X3Bhc3MgUGFzc3dvcmQgZm9yIHByaXZhdGUga2V5DQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gU2lnbigkY2VydF9maWxlbmFtZSwgJGtleV9maWxlbmFtZSwgJGtleV9wYXNzKSB7DQogICAgJHRoaXMtPnNpZ25fY2VydF9maWxlID0gJGNlcnRfZmlsZW5hbWU7DQogICAgJHRoaXMtPnNpZ25fa2V5X2ZpbGUgPSAka2V5X2ZpbGVuYW1lOw0KICAgICR0aGlzLT5zaWduX2tleV9wYXNzID0gJGtleV9wYXNzOw0KICB9DQoNCiAgLyoqDQogICAqIFNldCB0aGUgcHJpdmF0ZSBrZXkgZmlsZSBhbmQgcGFzc3dvcmQgdG8gc2lnbiB0aGUgbWVzc2FnZS4NCiAgICoNCiAgICogQGFjY2VzcyBwdWJsaWMNCiAgICogQHBhcmFtIHN0cmluZyAka2V5X2ZpbGVuYW1lIFBhcmFtZXRlciBGaWxlIE5hbWUNCiAgICogQHBhcmFtIHN0cmluZyAka2V5X3Bhc3MgUGFzc3dvcmQgZm9yIHByaXZhdGUga2V5DQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gREtJTV9RUCgkdHh0KSB7DQogICAgJHRtcD0iIjsNCiAgICAkbGluZT0iIjsNCiAgICBmb3IgKCRpPTA7JGk8c3RybGVuKCR0eHQpOyRpKyspIHsNCiAgICAgICRvcmQ9b3JkKCR0eHRbJGldKTsNCiAgICAgIGlmICggKCgweDIxIDw9ICRvcmQpICYmICgkb3JkIDw9IDB4M0EpKSB8fCAkb3JkID09IDB4M0MgfHwgKCgweDNFIDw9ICRvcmQpICYmICgkb3JkIDw9IDB4N0UpKSApIHsNCiAgICAgICAgJGxpbmUuPSR0eHRbJGldOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgJGxpbmUuPSI9Ii5zcHJpbnRmKCIlMDJYIiwkb3JkKTsNCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuICRsaW5lOw0KICB9DQoNCiAgLyoqDQogICAqIEdlbmVyYXRlIERLSU0gc2lnbmF0dXJlDQogICAqDQogICAqIEBhY2Nlc3MgcHVibGljDQogICAqIEBwYXJhbSBzdHJpbmcgJHMgSGVhZGVyDQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gREtJTV9TaWduKCRzKSB7DQogICAgJHByaXZLZXlTdHIgPSBmaWxlX2dldF9jb250ZW50cygkdGhpcy0+REtJTV9wcml2YXRlKTsNCiAgICBpZiAoJHRoaXMtPkRLSU1fcGFzc3BocmFzZSE9JycpIHsNCiAgICAgICRwcml2S2V5ID0gb3BlbnNzbF9wa2V5X2dldF9wcml2YXRlKCRwcml2S2V5U3RyLCR0aGlzLT5ES0lNX3Bhc3NwaHJhc2UpOw0KICAgIH0gZWxzZSB7DQogICAgICAkcHJpdktleSA9ICRwcml2S2V5U3RyOw0KICAgIH0NCiAgICBpZiAob3BlbnNzbF9zaWduKCRzLCAkc2lnbmF0dXJlLCAkcHJpdktleSkpIHsNCiAgICAgIHJldHVybiBiYXNlNjRfZW5jb2RlKCRzaWduYXR1cmUpOw0KICAgIH0NCiAgfQ0KDQogIC8qKg0KICAgKiBHZW5lcmF0ZSBES0lNIENhbm9uaWNhbGl6YXRpb24gSGVhZGVyDQogICAqDQogICAqIEBhY2Nlc3MgcHVibGljDQogICAqIEBwYXJhbSBzdHJpbmcgJHMgSGVhZGVyDQogICAqLw0KICBwdWJsaWMgZnVuY3Rpb24gREtJTV9IZWFkZXJDKCRzKSB7DQogICAgJHM9cHJlZ19yZXBsYWNlKCIvXHJcblxzKy8iLCIgIiwkcyk7DQogICAgJGxpbmVzPWV4cGxvZGUoIlxyXG4iLCRzKTsNCiAgICBmb3JlYWNoICgkbGluZXMgYXMgJGtleT0+JGxpbmUpIHsNCiAgICAgIGxpc3QoJGhlYWRpbmcsJHZhbHVlKT1leHBsb2RlKCI6IiwkbGluZSwyKTsNCiAgICAgICRoZWFkaW5nPXN0cnRvbG93ZXIoJGhlYWRpbmcpOw0KICAgICAgJHZhbHVlPXByZWdfcmVwbGFjZSgiL1xzKy8iLCIgIiwkdmFsdWUpIDsgLy8gQ29tcHJlc3MgdXNlbGVzcyBzcGFjZXMNCiAgICAgICRsaW5lc1ska2V5XT0kaGVhZGluZy4iOiIudHJpbSgkdmFsdWUpIDsgLy8gRG9uJ3QgZm9yZ2V0IHRvIHJlbW92ZSBXU1AgYXJvdW5kIHRoZSB2YWx1ZQ0KICAgIH0NCiAgICAkcz1pbXBsb2RlKCJcclxuIiwkbGluZXMpOw0KICAgIHJldHVybiAkczsNCiAgfQ0KDQogIC8qKg0KICAgKiBHZW5lcmF0ZSBES0lNIENhbm9uaWNhbGl6YXRpb24gQm9keQ0KICAgKg0KICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IE1lc3NhZ2UgQm9keQ0KICAgKi8NCiAgcHVibGljIGZ1bmN0aW9uIERLSU1fQm9keUMoJGJvZHkpIHsNCiAgICBpZiAoJGJvZHkgPT0gJycpIHJldHVybiAiXHJcbiI7DQogICAgLy8gc3RhYmlsaXplIGxpbmUgZW5kaW5ncw0KICAgICRib2R5PXN0cl9yZXBsYWNlKCJcclxuIiwiXG4iLCRib2R5KTsNCiAgICAkYm9keT1zdHJfcmVwbGFjZSgiXG4iLCJcclxuIiwkYm9keSk7DQogICAgLy8gRU5EIHN0YWJpbGl6ZSBsaW5lIGVuZGluZ3MNCiAgICB3aGlsZSAoc3Vic3RyKCRib2R5LHN0cmxlbigkYm9keSktNCw0KSA9PSAiXHJcblxyXG4iKSB7DQogICAgICAkYm9keT1zdWJzdHIoJGJvZHksMCxzdHJsZW4oJGJvZHkpLTIpOw0KICAgIH0NCiAgICByZXR1cm4gJGJvZHk7DQogIH0NCg0KICAvKioNCiAgICogQ3JlYXRlIHRoZSBES0lNIGhlYWRlciwgYm9keSwgYXMgbmV3IGhlYWRlcg0KICAgKg0KICAgKiBAYWNjZXNzIHB1YmxpYw0KICAgKiBAcGFyYW0gc3RyaW5nICRoZWFkZXJzX2xpbmUgSGVhZGVyIGxpbmVzDQogICAqIEBwYXJhbSBzdHJpbmcgJHN1YmplY3QgU3ViamVjdA0KICAgKiBAcGFyYW0gc3RyaW5nICRib2R5IEJvZHkNCiAgICovDQogIHB1YmxpYyBmdW5jdGlvbiBES0lNX0FkZCgkaGVhZGVyc19saW5lLCRzdWJqZWN0LCRib2R5KSB7DQogICAgJERLSU1zaWduYXR1cmVUeXBlICAgID0gJ3JzYS1zaGExJzsgLy8gU2lnbmF0dXJlICYgaGFzaCBhbGdvcml0aG1zDQogICAgJERLSU1jYW5vbmljYWxpemF0aW9uID0gJ3JlbGF4ZWQvc2ltcGxlJzsgLy8gQ2Fub25pY2FsaXphdGlvbiBvZiBoZWFkZXIvYm9keQ0KICAgICRES0lNcXVlcnkgICAgICAgICAgICA9ICdkbnMvdHh0JzsgLy8gUXVlcnkgbWV0aG9kDQogICAgJERLSU10aW1lICAgICAgICAgICAgID0gdGltZSgpIDsgLy8gU2lnbmF0dXJlIFRpbWVzdGFtcCA9IHNlY29uZHMgc2luY2UgMDA6MDA6MDAgLSBKYW4gMSwgMTk3MCAoVVRDIHRpbWUgem9uZSkNCiAgICAkc3ViamVjdF9oZWFkZXIgICAgICAgPSAiU3ViamVjdDogJHN1YmplY3QiOw0KICAgICRoZWFkZXJzICAgICAgICAgICAgICA9IGV4cGxvZGUoIlxyXG4iLCRoZWFkZXJzX2xpbmUpOw0KICAgIGZvcmVhY2goJGhlYWRlcnMgYXMgJGhlYWRlcikgew0KICAgICAgaWYgKHN0cnBvcygkaGVhZGVyLCdGcm9tOicpID09PSAwKSB7DQogICAgICAgICRmcm9tX2hlYWRlcj0kaGVhZGVyOw0KICAgICAgfSBlbHNlaWYgKHN0cnBvcygkaGVhZGVyLCdUbzonKSA9PT0gMCkgew0KICAgICAgICAkdG9faGVhZGVyPSRoZWFkZXI7DQogICAgICB9DQogICAgfQ0KICAgICRmcm9tICAgICA9IHN0cl9yZXBsYWNlKCd8JywnPTdDJywkdGhpcy0+REtJTV9RUCgkZnJvbV9oZWFkZXIpKTsNCiAgICAkdG8gICAgICAgPSBzdHJfcmVwbGFjZSgnfCcsJz03QycsJHRoaXMtPkRLSU1fUVAoJHRvX2hlYWRlcikpOw0KICAgICRzdWJqZWN0ICA9IHN0cl9yZXBsYWNlKCd8JywnPTdDJywkdGhpcy0+REtJTV9RUCgkc3ViamVjdF9oZWFkZXIpKSA7IC8vIENvcGllZCBoZWFkZXIgZmllbGRzIChka2ltLXF1b3RlZC1wcmludGFibGUNCiAgICAkYm9keSAgICAgPSAkdGhpcy0+REtJTV9Cb2R5QygkYm9keSk7DQogICAgJERLSU1sZW4gID0gc3RybGVuKCRib2R5KSA7IC8vIExlbmd0aCBvZiBib2R5DQogICAgJERLSU1iNjQgID0gYmFzZTY0X2VuY29kZShwYWNrKCJIKiIsIHNoYTEoJGJvZHkpKSkgOyAvLyBCYXNlNjQgb2YgcGFja2VkIGJpbmFyeSBTSEEtMSBoYXNoIG9mIGJvZHkNCiAgICAkaWRlbnQgICAgPSAoJHRoaXMtPkRLSU1faWRlbnRpdHkgPT0gJycpPyAnJyA6ICIgaT0iIC4gJHRoaXMtPkRLSU1faWRlbnRpdHkgLiAiOyI7DQogICAgJGRraW1oZHJzID0gIkRLSU0tU2lnbmF0dXJlOiB2PTE7IGE9IiAuICRES0lNc2lnbmF0dXJlVHlwZSAuICI7IHE9IiAuICRES0lNcXVlcnkgLiAiOyBsPSIgLiAkREtJTWxlbiAuICI7IHM9IiAuICR0aGlzLT5ES0lNX3NlbGVjdG9yIC4gIjtcclxuIi4NCiAgICAgICAgICAgICAgICAiXHR0PSIgLiAkREtJTXRpbWUgLiAiOyBjPSIgLiAkREtJTWNhbm9uaWNhbGl6YXRpb24gLiAiO1xyXG4iLg0KICAgICAgICAgICAgICAgICJcdGg9RnJvbTpUbzpTdWJqZWN0O1xyXG4iLg0KICAgICAgICAgICAgICAgICJcdGQ9IiAuICR0aGlzLT5ES0lNX2RvbWFpbiAuICI7IiAuICRpZGVudCAuICJcclxuIi4NCiAgICAgICAgICAgICAgICAiXHR6PSRmcm9tXHJcbiIuDQogICAgICAgICAgICAgICAgIlx0fCR0b1xyXG4iLg0KICAgICAgICAgICAgICAgICJcdHwkc3ViamVjdDtcclxuIi4NCiAgICAgICAgICAgICAgICAiXHRiaD0iIC4gJERLSU1iNjQgLiAiO1xyXG4iLg0KICAgICAgICAgICAgICAgICJcdGI9IjsNCiAgICAkdG9TaWduICAgPSAkdGhpcy0+REtJTV9IZWFkZXJDKCRmcm9tX2hlYWRlciAuICJcclxuIiAuICR0b19oZWFkZXIgLiAiXHJcbiIgLiAkc3ViamVjdF9oZWFkZXIgLiAiXHJcbiIgLiAkZGtpbWhkcnMpOw0KICAgICRzaWduZWQgICA9ICR0aGlzLT5ES0lNX1NpZ24oJHRvU2lnbik7DQogICAgcmV0dXJuICJYLVBIUE1BSUxFUi1ES0lNOiBwaHBtYWlsZXIud29yeHdhcmUuY29tXHJcbiIuJGRraW1oZHJzLiRzaWduZWQuIlxyXG4iOw0KICB9DQoNCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIGRvQ2FsbGJhY2soJGlzU2VudCwkdG8sJGNjLCRiY2MsJHN1YmplY3QsJGJvZHkpIHsNCiAgICBpZiAoIWVtcHR5KCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24pICYmIGZ1bmN0aW9uX2V4aXN0cygkdGhpcy0+YWN0aW9uX2Z1bmN0aW9uKSkgew0KICAgICAgJHBhcmFtcyA9IGFycmF5KCRpc1NlbnQsJHRvLCRjYywkYmNjLCRzdWJqZWN0LCRib2R5KTsNCiAgICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KCR0aGlzLT5hY3Rpb25fZnVuY3Rpb24sJHBhcmFtcyk7DQogICAgfQ0KICB9DQp9DQoNCmNsYXNzIHBocG1haWxlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7DQogIHB1YmxpYyBmdW5jdGlvbiBlcnJvck1lc3NhZ2UoKSB7DQogICAgJGVycm9yTXNnID0gJzxzdHJvbmc+JyAuICR0aGlzLT5nZXRNZXNzYWdlKCkgLiAiPC9zdHJvbmc+PGJyIC8+XG4iOw0KICAgIHJldHVybiAkZXJyb3JNc2c7DQogIH0NCn0NCj8+DQoxMSBGZWIgMjAxNQ0KTmjDo246IERvY3VtZW50DQpOZXh0DQpUaGlzIGlzIHRoZSBtb3N0IHJlY2VudCBwb3N0Lg0KUHJldmlvdXMNCkhvdyB0byBtYWtlIGdyZWF0IGRlY2lzaW9ucyA/DQpSZWxhdGVkIFBvc3RzDQoNCiAgICBDaGnhur9uIGThu4tjaCBGYWNlYm9vayBtYXJrZXRpbmcgY+G7p2EgdsOhbmcgc+G7r2EgbW9udGVDaGnhur9uIGThu4tjaCBGYWNlYm9vayBtYXJrZXRpbmcgY+G7p2EgdsOhbmcgc+G7r2EgbW9udGUNCiAgICAxMiBOb3YgMjAxMzENCg0KICAgIFRyw6puIHRo4buLIHRyxrDhu51uZyBz4buvYSBWaeG7h3QgTmFtLCB2w6FuZyBz4buvYSBNb250ZSBuaOG6rXAga2jhuql1IGNow61uaCB0aOG7qWMgdOG7qyDEkOG7qWMgbMOgIHPhuqNuIHBo4bqpbSDEkcaw4bujYyAuLi4gxJDhu41jIHRow6ptIMK7DQoNCjAgbmjhuq1uIHjDqXQgOg0KDQrEkMSDbmcgbmjhuq1uIHjDqXQNCg0KOikgOikpIDsoKCA6LSkgPSkpIDsoIDstKCA6ZCA6LWQgQC0pIDpwIDpvIDo+KSAobykgWy0oIDotPyAocCkgOi1zIChtKSA4LSkgOi10IDotYiBiLSggOi0jID1wfiAkLSkgKGIpIChmKSB4LSkgKGspIChoKSAoYykgY2hlZXINCkNsaWNrIHRvIHNlZSB0aGUgY29kZSENClRvIGluc2VydCBlbW90aWNvbiB5b3UgbXVzdCBhZGRlZCBhdCBsZWFzdCBvbmUgc3BhY2UgYmVmb3JlIHRoZSBjb2RlLg0KDQogICAgUG9wdWxhcnMNCiAgICBDb21tZW50cw0KICAgIEFyY2hpdmUNCg0KICAgIENsYXNzaWZpY2F0aW9uIGVzc2F5cyBvbiBmcmllbmRzDQogICAgVGhlcmUncyBub3RoaW5nIG1vcmUgdmFsdWFibGUgdGhhbiBoYXZpbmcgbWFueSBnb29kIGZyaWVuZHMgaW4geW91ciBsaWZlISBGcmllbmRzIGFyZSBpbXBvcnRhbnQgdG8gaGF2ZSBiZWNhdXNlIHRoZXkgYXJlIGEgZnVsLi4uDQogICAgU2xpZGUgVEFDTjEgLSBDb21tZXJjaWFsIENvcnJlc3BvbmRlbmNlIEZUVQ0KICAgIFNsaWRlIG3DtG4gVGnhur9uZyBBbmggQ2h1ecOqbiBOZ8OgbmggMToNCiAgICDigJxDaMahaSBGb3JleOKAnSAtIHLhu6dpIHJvIGtow7RuIGzGsOG7nW5nISAoS+G7syAxKQ0KICAgICBUaOG7nWkgZ2lhbiBn4bqnbiDEkcOieSwga2hpIHRo4buLIHRyxrDhu51uZyBjaOG7qW5nIGtob8OhbiB0cuG7k2kgc+G7pXQgdGjhuqV0IHRoxrDhu51uZywgc8OgbiBnaWFvIGThu4tjaCB2w6BuZyBi4buLIMSRw7NuZyBj4butYSB0aMOsIHRyb25nIGdp4bubaSDEkeG6p3UgdMawIHLhu5kgbMOqbiBwaG9uZyB0csOgbyAuLi4NCiAgICBXaXRoIEEgUGllY2UgT2YgQ2hhbGsNCiAgICAiIFdlIGFsbCBoYXZlIGEgdGFsZW50LCBzb21ldGltZXMgaXQncyBzaG93aW5nIG90aGVycyB0aGF0IHRhbGVudCBhbmQgc29tZXRpbWVzIGl0J3MgdGVhY2hpbmcgb3RoZXJzIHRvbyAuIiBMaWZlIHN0b3J5Li4uDQogICAgVG8gbXkgbG92ZS4uLg0KICAgICAgMyBnaeG7nSAxNyBwaMO6dCBzw6FuZy4uLi4gICBBbmggbmjhu5sgZW0sIG5o4bubIGVtIG5oaeG7gXUgbOG6r20uICAgR2nhu50gY2jhuq9jIGVtIMSRw6Mgbmfhu6cgbmdvbiwgbeG7l2kga2hpIG5naMSpIHLhurFuZyBlbSDEkWFuZyBuZ+G7pyBuZ29uIGFuaCBj4bqjbSB0aOG6pS4uLg0KICAgIEPDoWNoIHjDoWMgbWluaCB0w6BpIGtob+G6o24gRmFjZWJvb2sgbeG6oW5nIFZpZXR0ZWwgMTAwJSB0aMOgbmggY8O0bmcuLg0KICAgIE5oxrAgY8OhYyBi4bqhbiDEkcOjIGJp4bq/dCBraGkgeMOhYyBtaW5oIHPhu5EgxJFp4buHbiB0aG/huqFpIG3huqFuZyBWaWV0dGVsIHRow6wgY2jDum5nIHRhIHPhur0gY2jhurNuZyBiYW8gZ2nhu50gbmjhuq1uIMSRxrDhu6NjIHRpbiBuaOG6r24gdOG7qyBGYWNlYm9vay4g4buoYyBxdcOhIG3DrG5oIMSRw6BuLi4uDQoNCg0KbG9nbzENCkludGVybmFsIGxpbmsNCg0KICAgIEZhY2Vib29rDQoNCkdldCBpbiB0b3VjaA0KDQoNClR5cm9uZQ0KbWFpbA0KemluZ2t1dGUxQGdtYWlsLmNvbQ0Kc2t5cGUNCk1pbGsuZnR1DQpOaeG7gW0gdGluIGtow6F0IGtoYW8gwqkgMjAxMy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NClRvcA0KMTENCkZlYg0KMjAxNQ0KTmjDo246IERvY3VtZW50DQpH4butaSBlbWFpbCBiw6BpIMSRxINuZyBuw6B5DQogDQpCbG9nVGhpcyENCiANCkNoaWEgc+G6uyBsw6puIFR3aXR0ZXINCiANCkNoaWEgc+G6uyBsw6puIEZhY2Vib29rDQogDQpOZXh0DQpUaGlzIGlzIHRoZSBtb3N0IHJlY2VudCBwb3N0Lg0KUHJldmlvdXMNCkhvdyB0byBtYWtlIGdyZWF0IGRlY2lzaW9ucyA/DQpSRUxBVEVEIFBPU1RTDQpDaGnhur9uICBk4buLY2ggRmFjZWJvb2sgbWFya2V0aW5nIGPhu6dhIHbDoW5nIHPhu69hIG1vbnRlDQpDaGnhur9uIGThu4tjaCBGYWNlYm9vayBtYXJrZXRpbmcgY+G7p2EgdsOhbmcgc+G7r2EgbW9udGUNCjEyIE5vdiAyMDEzMQ0KVHLDqm4gdGjhu4sgdHLGsOG7nW5nIHPhu69hIFZp4buHdCBOYW0sIHbDoW5nIHPhu69hIE1vbnRlIG5o4bqtcCBraOG6qXUgY2jDrW5oIHRo4bupYyB04burIMSQ4bupYyBsw6Agc+G6o24gcGjhuqltIMSRxrDhu6NjIC4uLiDEkOG7jWMgdGjDqm0gwrsNCjAgTkjhuqxOIFjDiVQgOg0KxJDEg25nIG5o4bqtbiB4w6l0DQogOikgOikpIDsoKCA6LSkgPSkpIDsoIDstKCA6ZCA6LWQgQC0pIDpwIDpvIDo+KSAobykgWy0oIDotPyAocCkgOi1zIChtKSA4LSkgOi10IDotYiAgYi0oIDotIyA9cH4gJC0pIChiKSAoZikgeC0pIChrKSAoaCkgKGMpIGNoZWVyIA0KQ2xpY2sgdG8gc2VlIHRoZSBjb2RlIQ0KVG8gaW5zZXJ0IGVtb3RpY29uIHlvdSBtdXN0IGFkZGVkIGF0IGxlYXN0IG9uZSBzcGFjZSBiZWZvcmUgdGhlIGNvZGUuDQoNClBvcHVsYXJzDQpDb21tZW50cw0KQXJjaGl2ZQ0KIA0KQ2xhc3NpZmljYXRpb24gZXNzYXlzIG9uIGZyaWVuZHMNClRoZXJlJ3Mgbm90aGluZyBtb3JlIHZhbHVhYmxlIHRoYW4gaGF2aW5nIG1hbnkgZ29vZCBmcmllbmRzIGluIHlvdXIgbGlmZSEgRnJpZW5kcyBhcmUgaW1wb3J0YW50IHRvIGhhdmUgYmVjYXVzZSB0aGV5IGFyZSBhIGZ1bC4uLg0KIA0KVG8gbXkgbG92ZS4uLg0KICAzIGdp4budIDE3IHBow7p0IHPDoW5nLi4uLiAgIEFuaCBuaOG7myBlbSwgbmjhu5sgZW0gbmhp4buBdSBs4bqvbS4gICBHaeG7nSBjaOG6r2MgZW0gxJHDoyBuZ+G7pyBuZ29uLCBt4buXaSBraGkgbmdoxKkgcuG6sW5nIGVtIMSRYW5nIG5n4bunIG5nb24gYW5oIGPhuqNtIHRo4bqlLi4uDQogDQpUaGUgTWVhbmluZyBvZiBMaWZlDQpJbiBvbmUgb2YgbXkgd3JpdGluZ3MgSSB0ZWxsIHRoZSBzdG9yeSBvZiBhIG1hbiB3aG8gc2VhcmNoZXMgdGhlIHdob2xlIHdvcmxkIGZvciBzb21lb25lIHdobyBjYW4gdGVsbCBoaW0gdGhlIG1lYW5pbmcgb2YgbGlmZS4gRmluYWxsLi4uDQogDQpDw6FjaCB4w6FjIG1pbmggdMOgaSBraG/huqNuIEZhY2Vib29rIG3huqFuZyBWaWV0dGVsIDEwMCUgdGjDoG5oIGPDtG5nLi4NCk5oxrAgY8OhYyBi4bqhbiDEkcOjIGJp4bq/dCBraGkgeMOhYyBtaW5oIHPhu5EgxJFp4buHbiB0aG/huqFpIG3huqFuZyBWaWV0dGVsIHRow6wgY2jDum5nIHRhIHPhur0gY2jhurNuZyBiYW8gZ2nhu50gbmjhuq1uIMSRxrDhu6NjIHRpbiBuaOG6r24gdOG7qyBGYWNlYm9vay4g4buoYyBxdcOhIG3DrG5oIMSRw6BuLi4uDQogDQpOb3QgZGVjaWRpbmcgaXMgcnVpbmluZyB5b3VyIGxpZmUhDQpJZiB5b3UgYXJlIG5vdCBhY3RpdmVseSBkZWNpZGluZyB0byBkbyBzb21ldGhpbmcsIOKAi2FueXRoaW5n4oCLLCAgeW91IGFyZSBsaWtlbHkgbGl2aW5nIGluIGZlYXIsIGluZGVjaXNpb24sIG9wdGlvbnMgb3ZlcndoZWxtIG9yIHdpdGggeW91ciBoZS4uLg0KIA0KQXdlc29tZSAzRCBTdHJlZXQgQXJ0DQpGdWxsIGFsYnVtIOG6o25oIEZhY2Vib29rOiAgaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL21lZGlhL3NldC8/c2V0PWEuMjE2NTEwMDY4NTIxNDQwLjEwNzM3NDE4MjguMjE1MTk0Mzc4NjUzMDA5JnR5cGU9Mw0KIA0KbG9nbzENCkZvbGxvdyBieSBFbWFpbA0KDQoNCkVtYWlsIGFkZHJlc3MuLi4NCiBTdWJtaXQNCkludGVybmFsIGxpbmsNCg0KRmFjZWJvb2sNCkdldCBpbiB0b3VjaA0KDQoNCg0KZmFjZWJvb2sNClR5cm9uZQ0KbWFpbA0KemluZ2t1dGUxQGdtYWlsLmNvbQ0Kc2t5cGUNCk1pbGsuZnR1DQpOaeG7gW0gdGluIGtow6F0IGtoYW8gwqkgMjAxMy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVG9w
Next
This is the most recent post.
Previous
Bài đăng Cũ hơn

0 nhận xét :

Đăng nhận xét

 
Top