a2e0123475ab3372ff284fabde7e63f2.json 158 KB

1
  1. {"remainingRequest":"D:\\front\\item\\zyAdmin\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\front\\item\\zyAdmin\\src\\pages\\product\\productAdd\\index.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\front\\item\\zyAdmin\\src\\pages\\product\\productAdd\\index.vue","mtime":1761614939049},{"path":"D:\\front\\item\\zyAdmin\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1761614927801},{"path":"D:\\front\\item\\zyAdmin\\node_modules\\babel-loader\\lib\\index.js","mtime":1761614927320},{"path":"D:\\front\\item\\zyAdmin\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1761614927801},{"path":"D:\\front\\item\\zyAdmin\\node_modules\\vue-loader\\lib\\index.js","mtime":1761614937402}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:DQppbXBvcnQgdXNlckxhYmVsIGZyb20gJ0AvY29tcG9uZW50cy9sYWJlbExpc3QnOw0KaW1wb3J0IHVzZUxhYmVsIGZyb20gJ0AvY29tcG9uZW50cy9nb29kc0xhYmVsL3VzZUxhYmVsJzsNCmltcG9ydCBnb29kc0xhYmVsIGZyb20gJ0AvY29tcG9uZW50cy9nb29kc0xhYmVsJzsNCmltcG9ydCB7IG1hcFN0YXRlIH0gZnJvbSAndnVleCc7DQppbXBvcnQgdXBsb2FkUGljdHVyZXMgZnJvbSAnQC9jb21wb25lbnRzL3VwbG9hZFBpY3R1cmVzJzsNCmltcG9ydCBmcmVpZ2h0VGVtcGxhdGUgZnJvbSAnQC9jb21wb25lbnRzL2ZyZWlnaHRUZW1wbGF0ZSc7DQppbXBvcnQgY291cG9uTGlzdCBmcm9tICdAL2NvbXBvbmVudHMvY291cG9uTGlzdCc7DQppbXBvcnQgYWRkQXR0ciBmcm9tICcuLi9wcm9kdWN0QXR0ci9hZGRBdHRyJzsNCmltcG9ydCBnb29kc0xpc3QgZnJvbSAnQC9jb21wb25lbnRzL2dvb2RzTGlzdC9pbmRleCc7DQppbXBvcnQgdGFvQmFvIGZyb20gJy4vdGFvQmFvJzsNCmltcG9ydCB7IHVzZXJMYWJlbEFkZEFwaSB9IGZyb20gJ0AvYXBpL3VzZXInOw0KaW1wb3J0IHsNCiAgcHJvZHVjdEluZm9BcGksDQogIGNhc2NhZGVyTGlzdEFwaSwNCiAgcHJvZHVjdEFkZEFwaSwNCiAgZ2VuZXJhdGVBdHRyQXBpLA0KICBwcm9kdWN0R2V0UnVsZUFwaSwNCiAgcHJvZHVjdEdldFRlbXBsYXRlQXBpLA0KICBwcm9kdWN0R2V0VGVtcEtleXNBcGksDQogIGNoZWNrQWN0aXZpdHlBcGksDQogIHByb2R1Y3RDYWNoZSwNCiAgY2FjaGVEZWxldGUsDQogIHVwbG9hZFR5cGUsDQogIGltcG9ydENhcmQsDQogIHByb2R1Y3RDcmVhdGVBcGksDQogIGdldFByb2R1Y3RUeXBlQ29uZmlnLA0KICBydWxlQWRkQXBpLA0KICBwYXJhbUxpc3RBcGksDQogIHBhcmFtSW5mb0FwaSwNCiAgcHJvZHVjdFByb3RlY3Rpb25MaXN0QXBpLA0KICBwcm9kdWN0TGFiZWxVc2VMaXN0QXBpLA0KfSBmcm9tICdAL2FwaS9wcm9kdWN0JzsNCmltcG9ydCBTZXR0aW5nIGZyb20gJ0Avc2V0dGluZyc7DQppbXBvcnQgeyBnZXRDb29raWVzIH0gZnJvbSAnQC9saWJzL3V0aWwnOw0KaW1wb3J0IHsgdXBsb2FkQnlQaWVjZXMgfSBmcm9tICdAL3V0aWxzL3VwbG9hZCc7IC8v5byV5YWldXBsb2FkQnlQaWVjZXPmlrnms5UNCmltcG9ydCB7IGlzRmlsZVVwbG9hZCwgaXNWaWRlb1VwbG9hZCwgYXJyYXlzRXF1YWwgfSBmcm9tICdAL3V0aWxzJzsNCmltcG9ydCBjaGVja0FycmF5IGZyb20gJ0AvbGlicy9wZXJtaXNzaW9uJzsNCmltcG9ydCB7DQogIEdvb2RzVGFibGVIZWFkLA0KICBWaXJ0dWFsVGFibGVIZWFkLA0KICBWaXJ0dWFsVGFibGVIZWFkMiwNCiAgY29sdW1uczIsDQogIGNvbHVtbnMzLA0KICBDdXN0b21MaXN0LA0KICBSdWxlVmFsaWRhdGUsDQp9IGZyb20gJy4vZGVmYXVsdERhdGEuanMnOw0KaW1wb3J0IEJhc2ljSW5mbyBmcm9tICcuL2NvbXBvbmVudHMvQmFzaWNJbmZvLnZ1ZSc7DQppbXBvcnQgU3BlY1N0b2NrIGZyb20gJy4vY29tcG9uZW50cy9TcGVjU3RvY2sudnVlJzsNCmltcG9ydCBQcm9kdWN0RGV0YWlsIGZyb20gJy4vY29tcG9uZW50cy9Qcm9kdWN0RGV0YWlsLnZ1ZSc7DQppbXBvcnQgTG9naXN0aWNzU2V0dGluZyBmcm9tICcuL2NvbXBvbmVudHMvTG9naXN0aWNzU2V0dGluZy52dWUnOw0KaW1wb3J0IFByaWNlQ29tbWlzc2lvbiBmcm9tICcuL2NvbXBvbmVudHMvUHJpY2VDb21taXNzaW9uLnZ1ZSc7DQppbXBvcnQgTWFya2V0aW5nU2V0dGluZyBmcm9tICcuL2NvbXBvbmVudHMvTWFya2V0aW5nU2V0dGluZy52dWUnOw0KaW1wb3J0IE90aGVyU2V0dGluZyBmcm9tICcuL2NvbXBvbmVudHMvT3RoZXJTZXR0aW5nLnZ1ZSc7DQppbXBvcnQgeyBmb3JtYXRSaWNoVGV4dCB9IGZyb20gJ0AvdXRpbHMvZWRpdG9ySW1nJzsNCg0KZXhwb3J0IGRlZmF1bHQgew0KICBuYW1lOiAnUHJvZHVjdEFkZCcsDQogIGNvbXBvbmVudHM6IHsNCiAgICB1cGxvYWRQaWN0dXJlcywNCiAgICBmcmVpZ2h0VGVtcGxhdGUsDQogICAgYWRkQXR0ciwNCiAgICBjb3Vwb25MaXN0LA0KICAgIHRhb0JhbywNCiAgICBnb29kc0xpc3QsDQogICAgdXNlckxhYmVsLA0KICAgIGdvb2RzTGFiZWwsDQogICAgdXNlTGFiZWwsDQogICAgQmFzaWNJbmZvLA0KICAgIFNwZWNTdG9jaywNCiAgICBQcm9kdWN0RGV0YWlsLA0KICAgIExvZ2lzdGljc1NldHRpbmcsDQogICAgUHJpY2VDb21taXNzaW9uLA0KICAgIE1hcmtldGluZ1NldHRpbmcsDQogICAgT3RoZXJTZXR0aW5nLA0KICB9LA0KICBkYXRhKCkgew0KICAgIHJldHVybiB7DQogICAgICBsYWJlbFNob3c6IGZhbHNlLA0KICAgICAgdGFnU2hvdzogZmFsc2UsDQogICAgICBkYXRhTGFiZWw6IFtdLA0KICAgICAgaGVhZFRhYjogWw0KICAgICAgICB7IHRpdDogJ+WfuuehgOS/oeaBrycsIG5hbWU6ICcxJyB9LA0KICAgICAgICB7IHRpdDogJ+inhOagvOW6k+WtmCcsIG5hbWU6ICcyJyB9LA0KICAgICAgICB7IHRpdDogJ+WVhuWTgeivpuaDhScsIG5hbWU6ICczJyB9LA0KICAgICAgICB7IHRpdDogJ+eJqea1geiuvue9ricsIG5hbWU6ICc0JyB9LA0KICAgICAgICB7IHRpdDogJ+S8muWRmOS7ty/kvaPph5EnLCBuYW1lOiAnNScgfSwNCiAgICAgICAgeyB0aXQ6ICfokKXplIDorr7nva4nLCBuYW1lOiAnNicgfSwNCiAgICAgICAgeyB0aXQ6ICflhbbku5borr7nva4nLCBuYW1lOiAnNycgfSwNCiAgICAgIF0sDQogICAgICB2aXJ0dWFsOiBbDQogICAgICAgIHsgdGl0OiAn5pmu6YCa5ZWG5ZOBJywgaWQ6IDAsIHRpdDI6ICfnianmtYHlj5HotKcnIH0sDQogICAgICAgIHsgdGl0OiAn5Y2h5a+GL+e9keebmCcsIGlkOiAxLCB0aXQyOiAn6Ieq5Yqo5Y+R6LSnJyB9LA0KICAgICAgICB7IHRpdDogJ+S8mOaDoOWIuCcsIGlkOiAyLCB0aXQyOiAn6Ieq5Yqo5Y+R6LSnJyB9LA0KICAgICAgICB7IHRpdDogJ+iZmuaLn+WVhuWTgScsIGlkOiAzLCB0aXQyOiAn6Jma5ouf5Y+R6LSnJyB9LA0KICAgICAgXSwNCiAgICAgIHNlbGV0VmlkZW86IDAsIC8v6YCJ5oup6KeG6aKR57G75Z6LDQogICAgICBjdXN0b21CdG46IDAsIC8v6Ieq5a6a5LmJ55WZ6KiA5byA5YWzDQogICAgICBjb250ZW50OiAnJywNCiAgICAgIGNvbnRlbnRzOiAnJywNCiAgICAgIGZpbGVVcmw6IFNldHRpbmcuYXBpQmFzZVVSTCArICcvZmlsZS91cGxvYWQnLA0KICAgICAgZmlsZVVybDI6IFNldHRpbmcuYXBpQmFzZVVSTCArICcvZmlsZS92aWRlb191cGxvYWQnLA0KICAgICAgY2FyZFVybDogU2V0dGluZy5hcGlCYXNlVVJMICsgJy9maWxlL3VwbG9hZC8xJywNCiAgICAgIHVwbG9hZF90eXBlOiAnJywgLy/op4bpopHkuIrkvKDnsbvlnosgMSDmnKzlnLDkuIrkvKAgMiAzIDQgT1NT5LiK5LygDQogICAgICB1cGxvYWREYXRhOiB7fSwgLy8g5LiK5Lyg5Y+C5pWwDQogICAgICBoZWFkZXI6IHt9LA0KICAgICAgdHlwZTogMCwNCiAgICAgIG1vZGFsczogZmFsc2UsDQogICAgICBnb29kc19tb2RhbHM6IGZhbHNlLA0KICAgICAgc3BpblNob3c6IGZhbHNlLA0KICAgICAgb3BlblN1YmltaXQ6IGZhbHNlLA0KICAgICAgdmlydHVhbExpc3Q6IFsNCiAgICAgICAgew0KICAgICAgICAgIGtleTogJycsDQogICAgICAgICAgdmFsdWU6ICcnLA0KICAgICAgICB9LA0KICAgICAgXSwNCiAgICAgIC8vIOaJuemHj+iuvue9ruihqOagvGRhdGENCiAgICAgIG9uZUZvcm1CYXRjaDogWw0KICAgICAgICB7DQogICAgICAgICAgcGljOiAnJywNCiAgICAgICAgICBwcmljZTogdm9pZCAwLA0KICAgICAgICAgIGNvc3Q6IHZvaWQgMCwNCiAgICAgICAgICBvdF9wcmljZTogdm9pZCAwLA0KICAgICAgICAgIHN0b2NrOiB2b2lkIDAsDQogICAgICAgICAgYmFyX2NvZGU6ICcnLA0KICAgICAgICAgIGJhcl9jb2RlX251bWJlcjogJycsDQogICAgICAgICAgd2VpZ2h0OiB2b2lkIDAsDQogICAgICAgICAgdm9sdW1lOiB2b2lkIDAsDQogICAgICAgICAgdmlydHVhbF9saXN0OiBbXSwNCiAgICAgICAgfSwNCiAgICAgIF0sDQoNCiAgICAgIC8vIOinhOagvOaVsOaNrg0KICAgICAgZm9ybUR5bmFtaWM6IHsNCiAgICAgICAgYXR0cnNOYW1lOiAnJywNCiAgICAgICAgYXR0cnNWYWw6ICcnLA0KICAgICAgfSwNCiAgICAgIGRpc2tfdHlwZTogMSwgLy/ljaHlr4bnsbvlnosNCiAgICAgIHRhYkluZGV4OiAwLA0KICAgICAgdGFiTmFtZTogJycsDQogICAgICBmb3JtRHluYW1pY05hbWVEYXRhOiBbXSwNCiAgICAgIGlzQnRuOiBmYWxzZSwNCiAgICAgIGNvbHVtbnMyOiBjb2x1bW5zMiwNCiAgICAgIGNvbHVtbnMzOiBjb2x1bW5zMywNCiAgICAgIGNvbHVtbnM6IFtdLA0KICAgICAgY29sdW1uc0luc3RhbGw6IFtdLA0KICAgICAgY29sdW1uc0luc3RhbDI6IFtdLA0KICAgICAgZ3JpZFBpYzogew0KICAgICAgICB4bDogNiwNCiAgICAgICAgbGc6IDgsDQogICAgICAgIG1kOiAxMiwNCiAgICAgICAgc206IDEyLA0KICAgICAgICB4czogMTIsDQogICAgICB9LA0KICAgICAgZ3JpZEJ0bjogew0KICAgICAgICB4bDogNCwNCiAgICAgICAgbGc6IDgsDQogICAgICAgIG1kOiA4LA0KICAgICAgICBzbTogOCwNCiAgICAgICAgeHM6IDgsDQogICAgICB9LA0KICAgICAgLy/oh6rlrprkuYnnlZnoqIDkuIvmi4npgInmi6kNCiAgICAgIEN1c3RvbUxpc3Q6IEN1c3RvbUxpc3QsDQogICAgICAvL+iHquWumuS5ieeVmeiogOWGheWuuQ0KICAgICAgY3VycmVudEluZGV4OiAwLA0KDQogICAgICBmb3JtVmFsaWRhdGU6IHsNCiAgICAgICAgc2hhcmU6IDAsDQogICAgICAgIGlzX3BhY2s6IDAsLy/mmK/lkKbmiqXljZUNCiAgICAgICAgZGlza19pbmZvOiAnJywgLy/ljaHlr4bnsbvlnosNCiAgICAgICAgbG9naXN0aWNzOiBbJzEnXSwgLy/pgInmi6nnianmtYHmlrnlvI8NCiAgICAgICAgZnJlaWdodDogMiwgLy/ov5DotLnorr7nva4NCiAgICAgICAgcG9zdGFnZTogMCwgLy/orr7nva7ov5DotLnph5Hpop0NCiAgICAgICAgcmVjb21tZW5kOiBbXSwgLy/llYblk4HmjqjojZANCiAgICAgICAgcHJlc2FsZV9kYXk6IDEsIC8v6aKE5ZSu5Y+R6LSn5pe26Ze0Lee7k+adnw0KICAgICAgICBwcmVzYWxlOiBmYWxzZSwgLy/pooTllK7llYblk4HlvIDlhbMNCiAgICAgICAgaXNfbGltaXQ6IGZhbHNlLA0KICAgICAgICBsaW1pdF90eXBlOiAwLA0KICAgICAgICBsaW1pdF9udW06IDAsDQogICAgICAgIHZpcF9wcm9kdWN0OiBmYWxzZSwgLy/ku5jotLnkvJrlkZjkuJPlsZ7lvIDlhbMNCiAgICAgICAgY3VzdG9tX2Zvcm06IFtdLCAvL+iHquWumuS5ieeVmeiogA0KICAgICAgICBzdG9yZV9uYW1lOiAnJywNCiAgICAgICAgY2F0ZV9pZDogW10sDQogICAgICAgIGxhYmVsX2lkOiBbXSwNCiAgICAgICAga2V5d29yZDogJycsDQogICAgICAgIHVuaXRfbmFtZTogJycsDQogICAgICAgIHN0b3JlX2luZm86ICcnLA0KICAgICAgICBpbWFnZTogJycsDQogICAgICAgIHJlY29tbWVuZF9pbWFnZTogJycsDQogICAgICAgIHNsaWRlcl9pbWFnZTogW10sDQogICAgICAgIGRlc2NyaXB0aW9uOiAnJywNCiAgICAgICAgZmljdGk6IDAsDQogICAgICAgIGdpdmVfaW50ZWdyYWw6IDAsDQogICAgICAgIHNvcnQ6IDAsDQogICAgICAgIGlzX3Nob3c6IDEsDQogICAgICAgIGlzX2dpZnQ6IDAsIC8vIOW8gOWQr+mAgeekvOWTgQ0KICAgICAgICBnaWZ0X3ByaWNlOiAwLA0KICAgICAgICBpc19ob3Q6IDAsDQogICAgICAgIGlzX2JlbmVmaXQ6IDAsDQogICAgICAgIGlzX2Jlc3Q6IDAsDQogICAgICAgIGlzX25ldzogMCwNCiAgICAgICAgaXNfZ29vZDogMCwNCiAgICAgICAgaXNfcG9zdGFnZTogMCwNCiAgICAgICAgaXNfc3ViOiBbXSwNCiAgICAgICAgcmVjb21tZW5kX2xpc3Q6IFtdLA0KICAgICAgICBwYXJhbXNfbGlzdDogW10sIC8v5ZWG5ZOB5Y+C5pWwDQogICAgICAgIHZpcnR1YWxfdHlwZTogMCwNCiAgICAgICAgLy8gaXNfc3ViOiAwLA0KICAgICAgICBpZDogMCwNCiAgICAgICAgc3BlY190eXBlOiAwLA0KICAgICAgICBpc192aXJ0dWFsOiAwLA0KICAgICAgICB2aWRlb19saW5rOiAnJywNCiAgICAgICAgLy8gcG9zdGFnZTogMCwNCiAgICAgICAgdGVtcF9pZDogJycsDQogICAgICAgIGF0dHJzOiBbXSwNCiAgICAgICAgaXRlbXM6IFsNCiAgICAgICAgICB7DQogICAgICAgICAgICBwaWM6ICcnLA0KICAgICAgICAgICAgcHJpY2U6IDAsDQogICAgICAgICAgICBjb3N0OiAwLA0KICAgICAgICAgICAgb3RfcHJpY2U6IDAsDQogICAgICAgICAgICBzdG9jazogMCwNCiAgICAgICAgICAgIGJhcl9jb2RlOiAnJywNCiAgICAgICAgICAgIGJhcl9jb2RlX251bWJlcjogJycsDQogICAgICAgICAgfSwNCiAgICAgICAgXSwNCiAgICAgICAgYWN0aXZpdHk6IFsn6buY6K6kJywgJ+enkuadgCcsICfnoI3ku7cnLCAn5ou85ZuiJ10sDQogICAgICAgIGNvdXBvbk5hbWU6IFtdLA0KICAgICAgICBoZWFkZXI6IFtdLA0KICAgICAgICBzZWxlY3RSdWxlOiAnJywNCiAgICAgICAgY291cG9uX2lkczogW10sDQogICAgICAgIGNvbW1hbmRfd29yZDogJycsDQogICAgICAgIG1pbl9xdHk6IDEsDQogICAgICAgIGxhYmVsX2xpc3Q6IFtdLA0KICAgICAgICBwcm90ZWN0aW9uX2xpc3Q6IFtdLA0KICAgICAgfSwNCiAgICAgIHJ1bGVMaXN0OiBbXSwNCiAgICAgIHRlbXBsYXRlTGlzdDogW10sDQogICAgICBjcmVhdGVCbnQ6IHRydWUsDQogICAgICBzaG93SXB1dDogZmFsc2UsDQogICAgICBtYW55Rm9ybVZhbGlkYXRlOiBbXSwNCiAgICAgIC8vIOWNleinhOagvOihqOagvGRhdGENCiAgICAgIG9uZUZvcm1WYWxpZGF0ZTogWw0KICAgICAgICB7DQogICAgICAgICAgcGljOiAnJywNCiAgICAgICAgICBwcmljZTogMCwNCiAgICAgICAgICBjb3N0OiAwLA0KICAgICAgICAgIG90X3ByaWNlOiAwLA0KICAgICAgICAgIHN0b2NrOiAwLA0KICAgICAgICAgIGJhcl9jb2RlOiAnJywNCiAgICAgICAgICBiYXJfY29kZV9udW1iZXI6ICcnLA0KICAgICAgICAgIHdlaWdodDogMCwNCiAgICAgICAgICB2b2x1bWU6IDAsDQogICAgICAgICAgYnJva2VyYWdlOiAwLA0KICAgICAgICAgIGJyb2tlcmFnZV90d286IDAsDQogICAgICAgICAgdmlwX3ByaWNlOiAwLA0KICAgICAgICAgIHZpcnR1YWxfbGlzdDogW10sDQogICAgICAgICAgY291cG9uX2lkOiAwLA0KICAgICAgICB9LA0KICAgICAgXSwNCiAgICAgIGltYWdlczogW10sDQogICAgICBpbWFnZXNUYWJsZTogJycsDQogICAgICBjdXJyZW50VGFiOiAnMScsDQogICAgICBpc0Nob2ljZTogJycsDQogICAgICBsb2FkaW5nOiBmYWxzZSwNCiAgICAgIG1vZGFsUGljOiBmYWxzZSwNCiAgICAgIGFkZFZpcnR1YWxNb2RlbDogZmFsc2UsDQogICAgICB0ZW1wbGF0ZTogZmFsc2UsDQogICAgICB1cGxvYWRMaXN0OiBbXSwNCiAgICAgIHRyZWVTZWxlY3Q6IFtdLA0KICAgICAgcGljVGl0OiAnJywNCiAgICAgIHRhYmxlSW5kZXg6IDAsDQogICAgICBydWxlVmFsaWRhdGU6IFJ1bGVWYWxpZGF0ZSwNCiAgICAgIG1hbnlCcm9rZXJhZ2U6IHVuZGVmaW5lZCwNCiAgICAgIG1hbnlCcm9rZXJhZ2VUd286IHVuZGVmaW5lZCwNCiAgICAgIG1hbnlWaXBQcmljZTogdW5kZWZpbmVkLA0KICAgICAgbWFueVZpcERpc2NvdW50OiB1bmRlZmluZWQsDQogICAgICB1cGxvYWQ6IHsNCiAgICAgICAgdmlkZW9Jbmc6IGZhbHNlLCAvLyDmmK/lkKbmmL7npLrov5vluqbmnaHvvJsNCiAgICAgIH0sDQogICAgICB2aWRlb0luZzogZmFsc2UsIC8vIOaYr+WQpuaYvuekuui/m+W6puadoe+8mw0KICAgICAgcHJvZ3Jlc3M6IDAsIC8vIOi/m+W6puadoem7mOiupDANCiAgICAgIHN0b2NrOiAwLA0KICAgICAgZGlza19pbmZvOiAnJywNCiAgICAgIHZpZGVvTGluazogJycsDQogICAgICBhdHRyczogW10sDQogICAgICBhY3Rpdml0eTogeyDpu5jorqQ6ICdyZWQnLCDnp5LmnYA6ICdibHVlJywg56CN5Lu3OiAnZ3JlZW4nLCDmi7zlm6I6ICd5ZWxsb3cnIH0sDQogICAgICBjb3Vwb25OYW1lOiBbXSwNCiAgICAgIHVwZGF0ZUlkczogW10sDQogICAgICB1cGRhdGVOYW1lOiBbXSwNCiAgICAgIGNvdXBvbklkczogJycsDQogICAgICBjb3Vwb25OYW1lczogW10sDQogICAgICByYWtlQmFjazogWw0KICAgICAgICB7DQogICAgICAgICAgdGl0bGU6ICfkuIDnuqfov5TkvaMo5YWDKScsDQogICAgICAgICAgc2xvdDogJ2Jyb2tlcmFnZScsDQogICAgICAgICAgYWxpZ246ICdjZW50ZXInLA0KICAgICAgICAgIHdpZHRoOiA5NSwNCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAgIHRpdGxlOiAn5LqM57qn6L+U5L2jKOWFgyknLA0KICAgICAgICAgIHNsb3Q6ICdicm9rZXJhZ2VfdHdvJywNCiAgICAgICAgICBhbGlnbjogJ2NlbnRlcicsDQogICAgICAgICAgd2lkdGg6IDk1LA0KICAgICAgICB9LA0KICAgICAgXSwNCiAgICAgIG1lbWJlcjogWw0KICAgICAgICB7DQogICAgICAgICAgdGl0bGU6ICfkvJrlkZjku7cnLA0KICAgICAgICAgIHNsb3Q6ICd2aXBfcHJpY2UnLA0KICAgICAgICAgIGFsaWduOiAnY2VudGVyJywNCiAgICAgICAgICB3aWR0aDogOTUsDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgICB0aXRsZTogJ+S8muWRmOaKmOaJoycsDQogICAgICAgICAgc2xvdDogJ3ZpcF9wcm9wb3J0aW9uJywNCiAgICAgICAgICBhbGlnbjogJ2NlbnRlcicsDQogICAgICAgICAgd2lkdGg6IDk1LA0KICAgICAgICB9LA0KICAgICAgXSwNCiAgICAgIGNvbHVtbnNJbnN0YWxNOiBbXSwNCiAgICAgIG1vdmVJbmRleDogJycsDQogICAgICBhZGRWYWx1ZTogJycsDQogICAgICB2aXNpYmxlOiBmYWxzZSwNCiAgICAgIHR5cGVDb25maWc6IFtdLA0KICAgICAgZ29vZHNUeXBlOiBbXSwNCiAgICAgIHBhcmFtc1R5cGVMaXN0OiBbXSwNCiAgICAgIHBhcmFtc1R5cGU6IG51bGwsDQogICAgICBjYW5TZWw6IHRydWUsIC8vIOinhOagvOWbvueJh+a3u+WKoOWIpOaWrQ0KICAgICAgY2hhbmdlQXR0clZhbHVlOiAnJywgLy/kv67mlLnnmoTop4TmoLzlgLwNCiAgICAgIHRhYmxlS2V5OiAwLA0KICAgICAgcHJvdGVjdGlvbkxpc3Q6IFtdLCAvLyDmnI3liqHkv53pmpwNCiAgICAgIGxhYmVsTGlzdDogW10sDQogICAgICB0aWxlTGFiZWxMaXN0OiBbXSwNCiAgICB9Ow0KICB9LA0KICBjb21wdXRlZDogew0KICAgIC4uLm1hcFN0YXRlKCdtZWRpYScsIFsnaXNNb2JpbGUnXSksDQogICAgbGFiZWxXaWR0aCgpIHsNCiAgICAgIHJldHVybiB0aGlzLmlzTW9iaWxlID8gdW5kZWZpbmVkIDogJzEyMHB4JzsNCiAgICB9LA0KICAgIGxhYmVsUG9zaXRpb24oKSB7DQogICAgICByZXR1cm4gdGhpcy5pc01vYmlsZSA/ICd0b3AnIDogJ3JpZ2h0JzsNCiAgICB9LA0KICAgIGxhYmVsQm90dG9tKCkgew0KICAgICAgcmV0dXJuIHRoaXMuaXNNb2JpbGUgPyB1bmRlZmluZWQgOiAnMTVweCc7DQogICAgfSwNCiAgfSwNCiAgd2F0Y2g6IHsNCiAgICB0eXBlQ29uZmlnKHZhbCkgew0KICAgICAgaWYgKHZhbC5sZW5ndGgpIHsNCiAgICAgICAgLy8g5a+5dmlydHVhbOS4reeahGlk562J5LqOdmFs5Lit55qEaWTnmoQNCiAgICAgICAgdGhpcy5nb29kc1R5cGUgPSB0aGlzLnZpcnR1YWwuZmlsdGVyKChpdGVtKSA9PiB7DQogICAgICAgICAgcmV0dXJuIHZhbC5pbmNsdWRlcyhpdGVtLmlkICsgJycpOw0KICAgICAgICB9KTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuZ29vZHNUeXBlID0gdGhpcy52aXJ0dWFsOw0KICAgICAgfQ0KICAgIH0sDQogIH0sDQogIGJlZm9yZVJvdXRlVXBkYXRlKHRvLCBmcm9tLCBuZXh0KSB7DQogICAgdGhpcy5idXMuJGVtaXQoJ29uVGFnc1ZpZXdSZWZyZXNoUm91dGVyVmlldycsIHRoaXMuJHJvdXRlLnBhdGgpOw0KICAgIG5leHQoKTsNCiAgfSwNCiAgY3JlYXRlZCgpIHsNCiAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMyLnNsaWNlKDAsIDgpOw0KICAgIHRoaXMuZ2V0VG9rZW4oKTsNCiAgfSwNCiAgYXN5bmMgbW91bnRlZCgpIHsNCiAgICBpZiAodGhpcy4kcm91dGUucGFyYW1zLmlkICE9PSAnMCcgJiYgdGhpcy4kcm91dGUucGFyYW1zLmlkKSB7DQogICAgICBhd2FpdCB0aGlzLmdldEluZm8oKTsNCiAgICB9IGVsc2UgaWYgKHRoaXMuJHJvdXRlLnBhcmFtcy5pZCA9PT0gJzAnKSB7DQogICAgICB0aGlzLmdldFByb2R1Y3RDYWNoZSgpOw0KICAgIH0gZWxzZSB7DQogICAgICB0aGlzLmdldHByb2R1Y3RMYWJlbFVzZUxpc3RBcGkoKTsNCiAgICB9DQogICAgaWYgKHRoaXMuJHJvdXRlLnF1ZXJ5LnR5cGUpIHsNCiAgICAgIHRoaXMubW9kYWxzID0gdHJ1ZTsNCiAgICAgIHRoaXMudHlwZSA9IHRoaXMuJHJvdXRlLnF1ZXJ5LnR5cGU7DQogICAgfSBlbHNlIHsNCiAgICAgIHRoaXMudHlwZSA9IDA7DQogICAgfQ0KICAgIHRoaXMuZ29vZHNDYXRlZ29yeSgpOw0KICAgIHRoaXMucHJvZHVjdEdldFJ1bGUoKTsNCiAgICB0aGlzLnByb2R1Y3RHZXRUZW1wbGF0ZSgpOw0KICAgIHRoaXMucGFyYW1zR2V0VGVtcGxhdGUoKTsNCiAgICB0aGlzLnVwbG9hZFR5cGUoKTsNCiAgICB0aGlzLnByb2R1Y3RDb25maWcoKTsNCiAgICB0aGlzLndhdGNoQWN0aXZpdHkoKTsNCiAgICB0aGlzLmdldFByb3RlY3Rpb25MaXN0KCk7DQogIH0sDQogIG1ldGhvZHM6IHsNCiAgICBnZXRQcm9kdWN0Q2FjaGUoKSB7DQogICAgICBwcm9kdWN0Q2FjaGUoKQ0KICAgICAgICAudGhlbigocmVzKSA9PiB7DQogICAgICAgICAgbGV0IGRhdGEgPSByZXMuZGF0YS5pbmZvOw0KICAgICAgICAgIHRoaXMuZ2V0cHJvZHVjdExhYmVsVXNlTGlzdEFwaSgpOw0KDQogICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7DQogICAgICAgICAgICBsZXQgY2F0ZV9pZCA9IGRhdGEuY2F0ZV9pZC5tYXAoTnVtYmVyKTsNCiAgICAgICAgICAgIGxldCBsYWJlbF9pZCA9IGRhdGEubGFiZWxfaWQubWFwKE51bWJlcik7DQogICAgICAgICAgICB0aGlzLmF0dHJzID0gZGF0YS5pdGVtcyB8fCBbXTsNCiAgICAgICAgICAgIGxldCBpZHMgPSBbXTsNCiAgICAgICAgICAgIGlmIChkYXRhLmNvdXBvbnMpIHsNCiAgICAgICAgICAgICAgZGF0YS5jb3Vwb25zLm1hcCgoaXRlbSkgPT4gew0KICAgICAgICAgICAgICAgIGlkcy5wdXNoKGl0ZW0uaWQpOw0KICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgdGhpcy5jb3Vwb25OYW1lID0gZGF0YS5jb3Vwb25zOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZSA9IGRhdGE7DQogICAgICAgICAgICB0aGlzLmRhdGFMYWJlbCA9IGRhdGEubGFiZWxfaWQ7DQogICAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5jb3Vwb25faWRzID0gaWRzOw0KICAgICAgICAgICAgdGhpcy51cGRhdGVJZHMgPSBpZHM7DQogICAgICAgICAgICB0aGlzLnVwZGF0ZU5hbWUgPSBkYXRhLmNvdXBvbnM7DQogICAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5jYXRlX2lkID0gY2F0ZV9pZDsNCiAgICAgICAgICAgIHRoaXMub25lRm9ybVZhbGlkYXRlID0gZGF0YS5hdHRyczsNCiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVIZWFkZXIodGhpcy5hdHRycyk7DQogICAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5sb2dpc3RpY3MgPSBkYXRhLmxvZ2lzdGljcyB8fCBbJzEnXTsNCiAgICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmhlYWRlciA9IFtdOw0KICAgICAgICAgICAgdGhpcy5tYW55Rm9ybVZhbGlkYXRlID0gZGF0YS5hdHRyczsNCiAgICAgICAgICAgIHRoaXMuc3BlY190eXBlID0gZGF0YS5zcGVjX3R5cGU7DQogICAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5pc192aXJ0dWFsID0gZGF0YS5pc192aXJ0dWFsOw0KICAgICAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuY3VzdG9tX2Zvcm0gPSBkYXRhLmN1c3RvbV9mb3JtIHx8IFtdOw0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkYXRlLmN1c3RvbV9mb3JtLmxlbmd0aCAhPSAwKSB7DQogICAgICAgICAgICAgIHRoaXMuY3VzdG9tQnRuID0gMTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuYXR0cnMubWFwKChpdGVtKSA9PiB7DQogICAgICAgICAgICAgIGlmIChpdGVtLmFkZF9waWMpIHRoaXMuY2FuU2VsID0gZmFsc2U7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIHRoaXMudmlydHVhbGJ0bihkYXRhLnZpcnR1YWxfdHlwZSwgMSk7DQogICAgICAgICAgICBpZiAoZGF0YS5zcGVjX3R5cGUgPT09IDApIHsNCiAgICAgICAgICAgICAgdGhpcy5tYW55Rm9ybVZhbGlkYXRlID0gW107DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUJudCA9IHRydWU7DQogICAgICAgICAgICAgIHRoaXMub25lRm9ybVZhbGlkYXRlID0gWw0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgIHBpYzogZGF0YS5pbWFnZSwNCiAgICAgICAgICAgICAgICAgIHByaWNlOiAwLA0KICAgICAgICAgICAgICAgICAgY29zdDogMCwNCiAgICAgICAgICAgICAgICAgIG90X3ByaWNlOiAwLA0KICAgICAgICAgICAgICAgICAgc3RvY2s6IDAsDQogICAgICAgICAgICAgICAgICBiYXJfY29kZTogJycsDQogICAgICAgICAgICAgICAgICBiYXJfY29kZV9udW1iZXI6ICcnLA0KICAgICAgICAgICAgICAgICAgd2VpZ2h0OiAwLA0KICAgICAgICAgICAgICAgICAgdm9sdW1lOiAwLA0KICAgICAgICAgICAgICAgICAgYnJva2VyYWdlOiAwLA0KICAgICAgICAgICAgICAgICAgYnJva2VyYWdlX3R3bzogMCwNCiAgICAgICAgICAgICAgICAgIHZpcF9wcmljZTogMCwNCiAgICAgICAgICAgICAgICAgIHZpcnR1YWxfbGlzdDogW10sDQogICAgICAgICAgICAgICAgICBjb3Vwb25faWQ6IDAsDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMud2F0Y2hBY3Rpdml0eSgpOw0KICAgICAgICAgICAgdGhpcy5zcGluU2hvdyA9IGZhbHNlOw0KICAgICAgICAgIH0NCiAgICAgICAgfSkNCiAgICAgICAgLmNhdGNoKChlcnIpID0+IHsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKGVyci5tc2cpOw0KICAgICAgICB9KTsNCiAgICB9LA0KICAgIGdldFByb3RlY3Rpb25MaXN0KCkgew0KICAgICAgcHJvZHVjdFByb3RlY3Rpb25MaXN0QXBpKHsgcGFnZTogMCwgbGltaXQ6IDAsIHN0YXR1czogMSB9KS50aGVuKChyZXMpID0+IHsNCiAgICAgICAgdGhpcy5wcm90ZWN0aW9uTGlzdCA9IHJlcy5kYXRhLmxpc3Q7DQogICAgICB9KTsNCiAgICB9LA0KICAgIGdldHByb2R1Y3RMYWJlbFVzZUxpc3RBcGkoKSB7DQogICAgICBwcm9kdWN0TGFiZWxVc2VMaXN0QXBpKCkudGhlbigocmVzKSA9PiB7DQogICAgICAgIC8vIOWQiOW5tuaVsOe7hOS4reaJgOacieeahGxpc3QNCiAgICAgICAgdGhpcy50aWxlTGFiZWxMaXN0ID0gcmVzLmRhdGEuZmxhdE1hcCgoaXRlbSkgPT4gaXRlbS5saXN0KTsNCiAgICAgICAgbGV0IGxhYmVsTGlzdCA9IHJlcy5kYXRhOw0KICAgICAgICBpZiAodGhpcy5mb3JtVmFsaWRhdGUubGFiZWxfbGlzdC5sZW5ndGgpIHsNCiAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5sYWJlbF9saXN0Lm1hcCgoZWwpID0+IHsNCiAgICAgICAgICAgIGxhYmVsTGlzdC5tYXAoKHJlKSA9PiB7DQogICAgICAgICAgICAgIHJlLmxpc3QubWFwKChsYWJlbCkgPT4gew0KICAgICAgICAgICAgICAgIGlmIChsYWJlbC5pZCA9PT0gZWwpIHsNCiAgICAgICAgICAgICAgICAgIGxhYmVsLmFjdGl2ZSA9IHRydWU7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgIGxhYmVsLmFjdGl2ZSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICB9KTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBsYWJlbExpc3QubWFwKChlbCkgPT4gew0KICAgICAgICAgICAgZWwubGlzdC5tYXAoKGxhYmVsKSA9PiB7DQogICAgICAgICAgICAgIGxhYmVsLmFjdGl2ZSA9IGZhbHNlOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5sYWJlbExpc3QgPSBsYWJlbExpc3Q7DQogICAgICB9KTsNCiAgICB9LA0KICAgIGFkZFByb3RlY3Rpb24oKSB7DQogICAgICB0aGlzLiRyb3V0ZXIucHVzaCh7IHBhdGg6IHRoaXMuJHJvdXRlUHJvU3RyICsgJy9wcm9kdWN0L3Byb3RlY3Rpb24vbGlzdCcgfSk7DQogICAgfSwNCiAgICBwcm9kdWN0Q29uZmlnKCkgew0KICAgICAgZ2V0UHJvZHVjdFR5cGVDb25maWcoKS50aGVuKChyZXMpID0+IHsNCiAgICAgICAgdGhpcy50eXBlQ29uZmlnID0gcmVzLmRhdGE7DQogICAgICB9KTsNCiAgICB9LA0KICAgIGJlZm9yZVVwbG9hZChmaWxlKSB7DQogICAgICByZXR1cm4gaXNGaWxlVXBsb2FkKGZpbGUpOw0KICAgIH0sDQogICAgLy8g5YiG54mH5LiK5LygDQogICAgdmlkZW9TYXZlVG9VcmwoZmlsZSkgew0KICAgICAgaWYgKGlzVmlkZW9VcGxvYWQoZmlsZSkpIHsNCiAgICAgICAgdXBsb2FkQnlQaWVjZXMoew0KICAgICAgICAgIGZpbGU6IGZpbGUsIC8vIOinhumikeWunuS9kw0KICAgICAgICAgIHBpZWNlU2l6ZTogMywgLy8g5YiG54mH5aSn5bCPDQogICAgICAgICAgc3VjY2VzczogKGRhdGEpID0+IHsNCiAgICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnZpZGVvX2xpbmsgPSBkYXRhLmZpbGVfcGF0aDsNCiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MgPSAxMDA7DQogICAgICAgICAgfSwNCiAgICAgICAgICBlcnJvcjogKGUpID0+IHsNCiAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoZS5tc2cpOw0KICAgICAgICAgIH0sDQogICAgICAgICAgdXBsb2FkaW5nOiAoY2h1bmssIGFsbENodW5rKSA9PiB7DQogICAgICAgICAgICB0aGlzLnZpZGVvSW5nID0gdHJ1ZTsNCiAgICAgICAgICAgIGxldCBzdCA9IE1hdGguZmxvb3IoKGNodW5rIC8gYWxsQ2h1bmspICogMTAwKTsNCiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBzdDsNCiAgICAgICAgICB9LA0KICAgICAgICB9KTsNCiAgICAgIH0NCiAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9LA0KICAgIC8vIOexu+Wei+mAieaLqS/loavlhaXlhoXlrrnliKTmlq0NCiAgICB2aXJ0dWFsYnRuKGluZGV4LCB0eXBlKSB7DQogICAgICBpZiAodHlwZSAhPSAxKSB7DQogICAgICAgIGlmICh0aGlzLiRyb3V0ZS5wYXJhbXMuaWQpIHJldHVybiB0aGlzLiRtZXNzYWdlLmVycm9yKCfnvJbovpHllYblk4HkuI3mlK/mjIHliIfmjaLllYblk4HnsbvlnosnKTsNCiAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuaXNfc3ViID0gW107DQogICAgICAgIGxldCBpZCA9IHRoaXMuJHJvdXRlLnBhcmFtcy5pZDsNCiAgICAgICAgaWYgKGlkKSB7DQogICAgICAgICAgY2hlY2tBY3Rpdml0eUFwaShpZCkNCiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHt9KQ0KICAgICAgICAgICAgLmNhdGNoKChyZXMpID0+IHsNCiAgICAgICAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuc3BlY190eXBlID0gdGhpcy5zcGVjX3R5cGU7DQogICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IocmVzLm1zZyk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBpZiAodGhpcy5mb3JtVmFsaWRhdGUuc3BlY190eXBlID09IDEpIHsNCiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGUoMSk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgICAvLyDlrprkuYnln7rnoYDllYblk4HlkozomZrmi5/llYblk4HnmoTmoIfnrb7pobXphY3nva4NCiAgICAgIGNvbnN0IGJhc2VIZWFkVGFicyA9IFsNCiAgICAgICAgeyB0aXQ6ICfln7rnoYDkv6Hmga8nLCBuYW1lOiAnMScgfSwNCiAgICAgICAgeyB0aXQ6ICfop4TmoLzlupPlrZgnLCBuYW1lOiAnMicgfSwNCiAgICAgICAgeyB0aXQ6ICfllYblk4Hor6bmg4UnLCBuYW1lOiAnMycgfSwNCiAgICAgICAgeyB0aXQ6ICfnianmtYHorr7nva4nLCBuYW1lOiAnNCcgfSwNCiAgICAgICAgeyB0aXQ6ICfkvJrlkZjku7cv5L2j6YeRJywgbmFtZTogJzUnIH0sDQogICAgICAgIHsgdGl0OiAn6JCl6ZSA6K6+572uJywgbmFtZTogJzYnIH0sDQogICAgICAgIHsgdGl0OiAn5YW25LuW6K6+572uJywgbmFtZTogJzcnIH0sDQogICAgICBdOw0KICAgICAgY29uc3QgdmlydHVhbEhlYWRUYWJzID0gWw0KICAgICAgICB7IHRpdDogJ+WfuuehgOS/oeaBrycsIG5hbWU6ICcxJyB9LA0KICAgICAgICB7IHRpdDogJ+inhOagvOW6k+WtmCcsIG5hbWU6ICcyJyB9LA0KICAgICAgICB7IHRpdDogJ+WVhuWTgeivpuaDhScsIG5hbWU6ICczJyB9LA0KICAgICAgICB7IHRpdDogJ+S8muWRmOS7ty/kvaPph5EnLCBuYW1lOiAnNCcgfSwNCiAgICAgICAgeyB0aXQ6ICfokKXplIDorr7nva4nLCBuYW1lOiAnNScgfSwNCiAgICAgICAgeyB0aXQ6ICflhbbku5borr7nva4nLCBuYW1lOiAnNicgfSwNCiAgICAgIF07DQoNCiAgICAgIHN3aXRjaCAoaW5kZXgpIHsNCiAgICAgICAgY2FzZSAwOiAvLyDmma7pgJrllYblk4ENCiAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS52aXJ0dWFsX3R5cGUgPSAwOw0KICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmlzX3ZpcnR1YWwgPSAwOw0KICAgICAgICAgIHRoaXMuaGVhZFRhYiA9IGJhc2VIZWFkVGFiczsNCiAgICAgICAgICBicmVhazsNCg0KICAgICAgICBjYXNlIDE6IC8vIOWNoeWvhi/nvZHnm5jllYblk4ENCiAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS52aXJ0dWFsX3R5cGUgPSAxOw0KICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnBvc3RhZ2UgPSAwOw0KICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmlzX3ZpcnR1YWwgPSAxOw0KICAgICAgICAgIHRoaXMuaGVhZFRhYiA9IHZpcnR1YWxIZWFkVGFiczsNCiAgICAgICAgICBicmVhazsNCg0KICAgICAgICBjYXNlIDI6IC8vIOS8mOaDoOWIuOWVhuWTgQ0KICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnZpcnR1YWxfdHlwZSA9IDI7DQogICAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuaXNfdmlydHVhbCA9IDE7DQogICAgICAgICAgdGhpcy5oZWFkVGFiID0gdmlydHVhbEhlYWRUYWJzOw0KICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgIGNhc2UgMzogLy8g6Jma5ouf5ZWG5ZOBDQogICAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUudmlydHVhbF90eXBlID0gMzsNCiAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5pc192aXJ0dWFsID0gMTsNCiAgICAgICAgICB0aGlzLmhlYWRUYWIgPSB2aXJ0dWFsSGVhZFRhYnM7DQogICAgICAgICAgYnJlYWs7DQogICAgICB9DQogICAgfSwNCiAgICAvLyDmlrDlop7liIbnsbsNCiAgICBhZGRDYXRlKCkgew0KICAgICAgdGhpcy4kbW9kYWxGb3JtKHByb2R1Y3RDcmVhdGVBcGkoKSkudGhlbigoKSA9PiB0aGlzLmdvb2RzQ2F0ZWdvcnkoKSk7DQogICAgfSwNCiAgICAvLyDnianmtYHmlrnlvI/pgInmi6kNCiAgICBsb2dpc3RpY3NCdG4oZSkgew0KICAgICAgdGhpcy5mb3JtVmFsaWRhdGUubG9naXN0aWNzID0gZTsNCiAgICB9LA0KICAgIC8vIOaWsOWinuagh+etvg0KICAgIGFkZExhYmVsKCkgew0KICAgICAgdGhpcy4kbW9kYWxGb3JtKHVzZXJMYWJlbEFkZEFwaSgwKSkudGhlbigoKSA9PiB0aGlzLnVzZXJMYWJlbCgpKTsNCiAgICB9LA0KICAgIC8vIOmAieaLqeagh+etvg0KICAgIGFkZEdvb2RzVGFnKCkgew0KICAgICAgdGhpcy50YWdTaG93ID0gdHJ1ZTsNCiAgICB9LA0KICAgIC8vIOiHquWumuS5ieeVmeiogCDlvIDlkK/lhbPpl60NCiAgICBjdXN0b21NZXNzQnRuKGUpIHsNCiAgICAgIGlmICghZSkgew0KICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5jdXN0b21fZm9ybSA9IFtdOw0KICAgICAgfQ0KICAgICAgdGhpcy5jdXN0b21CdG4gPSBlOw0KICAgIH0sDQogICAgLy8g6Ieq5a6a5LmJ55WZ6KiAIOaWsOWinuihqOWNlQ0KICAgIGFkZGN1c3RvbSgpIHsNCiAgICAgIGlmICh0aGlzLmZvcm1WYWxpZGF0ZS5jdXN0b21fZm9ybS5sZW5ndGggPiA5KSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn5pyA5aSa5re75YqgMTDmnaEnKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmN1c3RvbV9mb3JtLnB1c2goew0KICAgICAgICAgIHRpdGxlOiAnJywNCiAgICAgICAgICBsYWJlbDogJ3RleHQnLA0KICAgICAgICAgIHZhbHVlOiAnJywNCiAgICAgICAgICBzdGF0dXM6IGZhbHNlLA0KICAgICAgICB9KTsNCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOWIoOmZpA0KICAgIGRlbGN1c3RvbShpbmRleCkgew0KICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuY3VzdG9tX2Zvcm0uc3BsaWNlKGluZGV4LCAxKTsNCiAgICB9LA0KICAgIC8vIOmihOWUruWFt+S9k+aXpeacnw0KICAgIG9uY2hhbmdlVGltZShlKSB7DQogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5wcmVzYWxlX3RpbWUgPSBlOw0KICAgIH0sDQogICAgLy8g5ZWG5ZOB6K+m5oOFDQogICAgZ2V0RWRpdG9yQ29udGVudChkYXRhKSB7DQogICAgICB0aGlzLmNvbnRlbnQgPSBkYXRhOw0KICAgIH0sDQogICAgY2FuY2VsKCkgew0KICAgICAgdGhpcy5tb2RhbHMgPSBmYWxzZTsNCiAgICB9LA0KICAgIC8vIOS4iuS8oOWktOmDqHRva2VuDQogICAgZ2V0VG9rZW4oKSB7DQogICAgICB0aGlzLmhlYWRlclsnQXV0aG9yaS16YXRpb24nXSA9ICdCZWFyZXIgJyArIGdldENvb2tpZXMoJ3Rva2VuJyk7DQogICAgfSwNCiAgICAvLyDlr7zlhaXljaHlr4YNCiAgICB1cEZpbGUocmVzKSB7DQogICAgICBpbXBvcnRDYXJkKHsgZmlsZTogcmVzLmRhdGEuc3JjIH0pLnRoZW4oKHJlcykgPT4gew0KICAgICAgICB0aGlzLnZpcnR1YWxMaXN0ID0gdGhpcy52aXJ0dWFsTGlzdC5jb25jYXQocmVzLmRhdGEpOw0KICAgICAgfSk7DQogICAgfSwNCiAgICAvL+iOt+WPluinhumikeS4iuS8oOexu+Weiw0KICAgIHVwbG9hZFR5cGUoKSB7DQogICAgICB1cGxvYWRUeXBlKCkudGhlbigocmVzKSA9PiB7DQogICAgICAgIHRoaXMudXBsb2FkX3R5cGUgPSByZXMuZGF0YS51cGxvYWRfdHlwZTsNCiAgICAgIH0pOw0KICAgIH0sDQogICAgLy8g5Yid5aeL5YyW5pWw5o2u5bGV56S6DQogICAgaW5mb0RhdGEoZGF0YSwgaXNDb3B5KSB7DQogICAgICBsZXQgY2F0ZV9pZCA9IGRhdGEuY2F0ZV9pZC5tYXAoTnVtYmVyKTsNCiAgICAgIGxldCBsYWJlbF9pZCA9IGRhdGEubGFiZWxfaWQubWFwKE51bWJlcik7DQogICAgICB0aGlzLmF0dHJzID0gZGF0YS5pdGVtcyB8fCBbXTsNCiAgICAgIGxldCBpZHMgPSBbXTsNCiAgICAgIGRhdGEuY291cG9ucy5tYXAoKGl0ZW0pID0+IHsNCiAgICAgICAgaWRzLnB1c2goaXRlbS5pZCk7DQogICAgICB9KTsNCiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlID0gZGF0YTsNCiAgICAgIHRoaXMuc2VsZXRWaWRlbyA9IGRhdGEuc2VsZXRWaWRlbzsNCiAgICAgIHRoaXMuY29udGVudHMgPSBkYXRhLmRlc2NyaXB0aW9uOw0KICAgICAgdGhpcy5jb3Vwb25OYW1lID0gZGF0YS5jb3Vwb25zOw0KICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuY291cG9uX2lkcyA9IGlkczsNCiAgICAgIHRoaXMudXBkYXRlSWRzID0gaWRzOw0KICAgICAgdGhpcy5kYXRhTGFiZWwgPSBkYXRhLmxhYmVsX2lkOw0KICAgICAgdGhpcy51cGRhdGVOYW1lID0gZGF0YS5jb3Vwb25zOw0KICAgICAgdGhpcy52aXJ0dWFsYnRuKGRhdGEudmlydHVhbF90eXBlLCAxKTsNCiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmxvZ2lzdGljcyA9IGRhdGEubG9naXN0aWNzIHx8IFsnMSddOw0KICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuY3VzdG9tX2Zvcm0gPSBkYXRhLmN1c3RvbV9mb3JtIHx8IFtdOw0KICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkYXRlLmN1c3RvbV9mb3JtLmxlbmd0aCAhPSAwKSB7DQogICAgICAgIHRoaXMuY3VzdG9tQnRuID0gMTsNCiAgICAgIH0NCiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmNhdGVfaWQgPSBjYXRlX2lkOw0KICAgICAgaWYgKGRhdGEuYXR0cikgew0KICAgICAgICB0aGlzLm9uZUZvcm1WYWxpZGF0ZSA9IFtkYXRhLmF0dHJdOw0KICAgICAgICB0aGlzLm9uZUZvcm1WYWxpZGF0ZVswXS52aXBfcHJvcG9ydGlvbiA9ICgNCiAgICAgICAgICAodGhpcy5vbmVGb3JtVmFsaWRhdGVbMF0udmlwX3ByaWNlIC8gdGhpcy5vbmVGb3JtVmFsaWRhdGVbMF0ucHJpY2UpICoNCiAgICAgICAgICAxMDANCiAgICAgICAgKS50b0ZpeGVkKDIpOw0KICAgICAgfQ0KICAgICAgdGhpcy5nZXRwcm9kdWN0TGFiZWxVc2VMaXN0QXBpKCk7DQoNCiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmhlYWRlciA9IFtdOw0KICAgICAgdGhpcy5zcGVjX3R5cGUgPSBkYXRhLnNwZWNfdHlwZTsNCiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnNwZWNfdHlwZSA9IHRoaXMuc3BlY190eXBlOw0KICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuaXNfdmlydHVhbCA9IGRhdGEuaXNfdmlydHVhbDsNCiAgICAgIHRoaXMuYXR0cnMubWFwKChpdGVtKSA9PiB7DQogICAgICAgIGlmIChpdGVtLmFkZF9waWMpIHRoaXMuY2FuU2VsID0gZmFsc2U7DQogICAgICB9KTsNCiAgICAgIGlmIChkYXRhLnNwZWNfdHlwZSA9PT0gMCkgew0KICAgICAgICB0aGlzLm1hbnlGb3JtVmFsaWRhdGUgPSBbXTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuY3JlYXRlQm50ID0gdHJ1ZTsNCiAgICAgICAgdGhpcy5vbmVGb3JtVmFsaWRhdGUgPSBbDQogICAgICAgICAgew0KICAgICAgICAgICAgcGljOiAnJywNCiAgICAgICAgICAgIHByaWNlOiAwLA0KICAgICAgICAgICAgY29zdDogMCwNCiAgICAgICAgICAgIG90X3ByaWNlOiAwLA0KICAgICAgICAgICAgc3RvY2s6IDAsDQogICAgICAgICAgICBiYXJfY29kZTogJycsDQogICAgICAgICAgICBiYXJfY29kZV9udW1iZXI6ICcnLA0KICAgICAgICAgICAgd2VpZ2h0OiAwLA0KICAgICAgICAgICAgdm9sdW1lOiAwLA0KICAgICAgICAgICAgYnJva2VyYWdlOiAwLA0KICAgICAgICAgICAgYnJva2VyYWdlX3R3bzogMCwNCiAgICAgICAgICAgIHZpcF9wcmljZTogMCwNCiAgICAgICAgICAgIHZpcnR1YWxfbGlzdDogW10sDQogICAgICAgICAgICBjb3Vwb25faWQ6IDAsDQogICAgICAgICAgfSwNCiAgICAgICAgXTsNCg0KICAgICAgICB0aGlzLmdlbmVyYXRlSGVhZGVyKHRoaXMuYXR0cnMpOw0KICAgICAgICB0aGlzLm1hbnlGb3JtVmFsaWRhdGUgPSBbLi4udGhpcy5vbmVGb3JtQmF0Y2gsIC4uLmRhdGEuYXR0cnNdOw0KICAgICAgfQ0KDQogICAgICBzZXRUaW1lb3V0KChlKSA9PiB7DQogICAgICAgIHRoaXMuY2hlY2tBbGxHcm91cChkYXRhLmlzX3N1Yik7DQogICAgICB9LCAxMDAwKTsNCiAgICAgIHRoaXMud2F0Y2hBY3Rpdml0eSgpOw0KICAgIH0sDQogICAgLy/lhbPpl63mt5jlrp3lvLnnqpflubbnlJ/miJDmlbDmja7vvJsNCiAgICBvbkNsb3NlKGRhdGEpIHsNCiAgICAgIHRoaXMubW9kYWxzID0gZmFsc2U7DQogICAgICB0aGlzLmluZm9EYXRhKGRhdGEsIDEpOw0KICAgIH0sDQoNCiAgICBjaGVja01vdmUoZXZ0KSB7DQogICAgICB0aGlzLm1vdmVJbmRleCA9IGV2dC5kcmFnZ2VkQ29udGV4dC5pbmRleDsNCiAgICB9LA0KICAgIGVuZCgpIHsNCiAgICAgIHRoaXMubW92ZUluZGV4ID0gJyc7DQogICAgICB0aGlzLmdlbmVyYXRlKDEpOw0KICAgIH0sDQogICAgLy8g5Y2V54us6K6+572u5Lya5ZGY6K6+572uDQogICAgY2hlY2tBbGxHcm91cENoYW5nZShkYXRhKSB7DQogICAgICB0aGlzLmNoZWNrQWxsR3JvdXAoZGF0YSk7DQogICAgfSwNCiAgICBjaGVja0FsbEdyb3VwKGRhdGEpIHsNCiAgICAgIGxldCBlbmRMZW5ndGggPSB0aGlzLmF0dHJzLmxlbmd0aCArIDM7DQogICAgICBpZiAodGhpcy5mb3JtVmFsaWRhdGUuc3BlY190eXBlID09PSAwKSB7DQogICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMikgew0KICAgICAgICAgIHRoaXMuY29sdW1uc0luc3RhbGwgPSB0aGlzLmNvbHVtbnMyLnNsaWNlKDAsIGVuZExlbmd0aCkuY29uY2F0KHRoaXMucmFrZUJhY2spLmNvbmNhdCh0aGlzLm1lbWJlcik7DQogICAgICAgIH0gZWxzZSBpZiAoZGF0YS5pbmRleE9mKDApID4gLTEpIHsNCiAgICAgICAgICB0aGlzLmNvbHVtbnNJbnN0YWxsID0gdGhpcy5jb2x1bW5zMi5zbGljZSgwLCBlbmRMZW5ndGgpLmNvbmNhdCh0aGlzLm1lbWJlcik7DQogICAgICAgIH0gZWxzZSBpZiAoZGF0YS5pbmRleE9mKDEpID4gLTEpIHsNCiAgICAgICAgICB0aGlzLmNvbHVtbnNJbnN0YWxsID0gdGhpcy5jb2x1bW5zMi5zbGljZSgwLCBlbmRMZW5ndGgpLmNvbmNhdCh0aGlzLnJha2VCYWNrKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aGlzLmNvbHVtbnNJbnN0YWxsID0gdGhpcy5jb2x1bW5zMi5zbGljZSgwLCBlbmRMZW5ndGgpOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDIpIHsNCiAgICAgICAgICB0aGlzLmNvbHVtbnNJbnN0YWwyID0gdGhpcy5jb2x1bW5zSW5zdGFsTQ0KICAgICAgICAgICAgLnNsaWNlKDAsIGVuZExlbmd0aCArIDEpDQogICAgICAgICAgICAuY29uY2F0KHRoaXMucmFrZUJhY2spDQogICAgICAgICAgICAuY29uY2F0KHRoaXMubWVtYmVyKTsNCiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmluZGV4T2YoMCkgPiAtMSkgew0KICAgICAgICAgIHRoaXMuY29sdW1uc0luc3RhbDIgPSB0aGlzLmNvbHVtbnNJbnN0YWxNLnNsaWNlKDAsIGVuZExlbmd0aCkuY29uY2F0KHRoaXMubWVtYmVyKTsNCiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmluZGV4T2YoMSkgPiAtMSkgew0KICAgICAgICAgIHRoaXMuY29sdW1uc0luc3RhbDIgPSB0aGlzLmNvbHVtbnNJbnN0YWxNLnNsaWNlKDAsIGVuZExlbmd0aCkuY29uY2F0KHRoaXMucmFrZUJhY2spOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHRoaXMuY29sdW1uc0luc3RhbDIgPSB0aGlzLmNvbHVtbnNJbnN0YWxNLnNsaWNlKDAsIGVuZExlbmd0aCk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOa3u+WKoOS8mOaDoOWIuA0KICAgIGFkZENvdXBvbigpIHsNCiAgICAgIHRoaXMuJHJlZnMuY291cG9uVGVtcGxhdGVzLmlzVGVtcGxhdGUgPSB0cnVlOw0KICAgICAgdGhpcy4kcmVmcy5jb3Vwb25UZW1wbGF0ZXMudGFibGVMaXN0KCk7DQogICAgfSwNCiAgICAvLyDop4TmoLzkuK3kvJjmg6DliLjmn6XnnIsNCiAgICBzZWUoZGF0YSwgbmFtZSwgaW5kZXgpIHsNCiAgICAgIHRoaXMudGFiTmFtZSA9IG5hbWU7DQogICAgICB0aGlzLnRhYkluZGV4ID0gaW5kZXg7DQoNCiAgICAgIGlmICh0aGlzLmZvcm1WYWxpZGF0ZS52aXJ0dWFsX3R5cGUgPT09IDEpIHsNCiAgICAgICAgaWYgKGRhdGEuZGlza19pbmZvICE9ICcnKSB7DQogICAgICAgICAgdGhpcy5kaXNrX3R5cGUgPSAxOw0KICAgICAgICAgIHRoaXMuZGlza19pbmZvID0gZGF0YS5kaXNrX2luZm87DQogICAgICAgICAgdGhpcy5zdG9jayA9IGRhdGEuc3RvY2s7DQogICAgICAgIH0gZWxzZSBpZiAoZGF0YS52aXJ0dWFsX2xpc3QubGVuZ3RoKSB7DQogICAgICAgICAgdGhpcy5kaXNrX3R5cGUgPSAyOw0KICAgICAgICAgIHRoaXMudmlydHVhbExpc3QgPSBkYXRhLnZpcnR1YWxfbGlzdDsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmFkZFZpcnR1YWxNb2RlbCA9IHRydWU7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLiRyZWZzLmdvb2RzQ291cG9uLmlzVGVtcGxhdGUgPSB0cnVlOw0KICAgICAgICB0aGlzLiRyZWZzLmdvb2RzQ291cG9uLnRhYmxlTGlzdCgzKTsNCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOS/ruaUueWIhuS9o+avlOS+iw0KICAgIGNoYW5nZURpc2NvdW50KGluZGV4LCB0eXBlID0gJ21hbnlGb3JtVmFsaWRhdGUnKSB7DQogICAgICAvLyDmoLnmja7liIbkvaPmr5TkvosgdmlwX3Byb3BvcnRpb24g5L+u5pS55Lya5ZGY5Lu3IOS/neeVmTLkvY3lsI/mlbANCiAgICAgIHRoaXNbdHlwZV1baW5kZXhdLnZpcF9wcmljZSA9ICh0aGlzW3R5cGVdW2luZGV4XS5wcmljZSAqICh0aGlzW3R5cGVdW2luZGV4XS52aXBfcHJvcG9ydGlvbiAvIDEwMCkpLnRvRml4ZWQoMik7DQogICAgfSwNCiAgICAvLyDkv67mlLnkvJrlkZjku7cNCiAgICBjaGFuZ2VWaXBQcmljZShpbmRleCwgdHlwZSA9ICdtYW55Rm9ybVZhbGlkYXRlJykgew0KICAgICAgLy8g5qC55o2u5Lya5ZGY5Lu36K6h566X5Ye65YiG5L2j5q+U5L6LDQogICAgICB0aGlzW3R5cGVdW2luZGV4XS52aXBfcHJvcG9ydGlvbiA9ICgodGhpc1t0eXBlXVtpbmRleF0udmlwX3ByaWNlIC8gdGhpc1t0eXBlXVtpbmRleF0ucHJpY2UpICogMTAwKS50b0ZpeGVkKDIpOw0KICAgIH0sDQogICAgLy8g5re75Yqg5LyY5oOg5Yi4DQogICAgYWRkR29vZHNDb3Vwb24oaW5kZXgsIG5hbWUpIHsNCiAgICAgIHRoaXMudGFiSW5kZXggPSBpbmRleDsNCiAgICAgIHRoaXMudGFiTmFtZSA9IG5hbWU7DQogICAgICB0aGlzLiRyZWZzLmdvb2RzQ291cG9uLmlzVGVtcGxhdGUgPSB0cnVlOw0KICAgICAgdGhpcy4kcmVmcy5nb29kc0NvdXBvbi50YWJsZUxpc3QoMyk7DQogICAgfSwNCiAgICBhZGRWaXJ0dWFsKGluZGV4LCBuYW1lKSB7DQogICAgICB0aGlzLnRhYkluZGV4ID0gaW5kZXg7DQogICAgICB0aGlzLnRhYk5hbWUgPSBuYW1lOw0KICAgICAgdGhpcy5hZGRWaXJ0dWFsTW9kZWwgPSB0cnVlOw0KICAgIH0sDQogICAgLy8g5o+Q5Lqk5Y2h5a+G5L+h5oGvDQogICAgdXBWaXJ0dWFsKCkgew0KICAgICAgaWYgKHRoaXMuZGlza190eXBlID09IDIpIHsNCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZpcnR1YWxMaXN0Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMudmlydHVhbExpc3RbaV07DQogICAgICAgICAgaWYgKCFlbGVtZW50LnZhbHVlKSB7DQogICAgICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCfor7fovpPlhaXmiYDmnInljaHlr4YnKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhpcy4kc2V0KHRoaXNbdGhpcy50YWJOYW1lXVt0aGlzLnRhYkluZGV4XSwgJ3ZpcnR1YWxfbGlzdCcsIHRoaXMudmlydHVhbExpc3QpOw0KICAgICAgICB0aGlzLiRzZXQodGhpc1t0aGlzLnRhYk5hbWVdW3RoaXMudGFiSW5kZXhdLCAnc3RvY2snLCB0aGlzLnZpcnR1YWxMaXN0Lmxlbmd0aCk7DQogICAgICAgIHRoaXMudmlydHVhbExpc3QgPSBbDQogICAgICAgICAgew0KICAgICAgICAgICAga2V5OiAnJywNCiAgICAgICAgICAgIHZhbHVlOiAnJywNCiAgICAgICAgICB9LA0KICAgICAgICBdOw0KICAgICAgICB0aGlzLiRzZXQodGhpc1t0aGlzLnRhYk5hbWVdW3RoaXMudGFiSW5kZXhdLCAnZGlza19pbmZvJywgJycpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgaWYgKCF0aGlzLmRpc2tfaW5mby5sZW5ndGgpIHsNCiAgICAgICAgICByZXR1cm4gdGhpcy4kbWVzc2FnZS5lcnJvcign6K+35aGr5YaZ5Y2h5a+G5L+h5oGvJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCF0aGlzLnN0b2NrKSB7DQogICAgICAgICAgcmV0dXJuIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+ivt+Whq+WGmeW6k+WtmOaVsOmHjycpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuJHNldCh0aGlzW3RoaXMudGFiTmFtZV1bdGhpcy50YWJJbmRleF0sICdzdG9jaycsIE51bWJlcih0aGlzLnN0b2NrKSk7DQogICAgICAgIHRoaXMuJHNldCh0aGlzW3RoaXMudGFiTmFtZV1bdGhpcy50YWJJbmRleF0sICdzdG9jaycsIE51bWJlcih0aGlzLnN0b2NrKSk7DQogICAgICAgIHRoaXMuJHNldCh0aGlzW3RoaXMudGFiTmFtZV1bdGhpcy50YWJJbmRleF0sICdkaXNrX2luZm8nLCB0aGlzLmRpc2tfaW5mbyk7DQogICAgICAgIHRoaXMuJHNldCh0aGlzW3RoaXMudGFiTmFtZV1bdGhpcy50YWJJbmRleF0sICd2aXJ0dWFsX2xpc3QnLCBbXSk7DQogICAgICB9DQogICAgICB0aGlzLmFkZFZpcnR1YWxNb2RlbCA9IGZhbHNlOw0KICAgICAgdGhpcy5jbG9zZVZpcnR1YWwoKTsNCiAgICB9LA0KICAgIC8vICDliJ3lp4vljJbljaHlr4bmlbDmja7kv6Hmga8NCiAgICBjbG9zZVZpcnR1YWwoKSB7DQogICAgICB0aGlzLmFkZFZpcnR1YWxNb2RlbCA9IGZhbHNlOw0KICAgICAgdGhpcy52aXJ0dWFsTGlzdCA9IFsNCiAgICAgICAgew0KICAgICAgICAgIGtleTogJycsDQogICAgICAgICAgdmFsdWU6ICcnLA0KICAgICAgICB9LA0KICAgICAgXTsNCiAgICAgIHRoaXMuZGlza19pbmZvID0gJyc7DQogICAgICB0aGlzLnN0b2NrID0gMDsNCiAgICB9LA0KICAgIC8v5a+56LGh5pWw57uE5Y676YeN77ybDQogICAgdW5pcXVlQXJyYXkoYXJyKSB7DQogICAgICBjb25zdCBzZWVuID0ge307DQogICAgICByZXR1cm4gYXJyLmZpbHRlcigoaXRlbSkgPT4gew0KICAgICAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShpdGVtKTsgLy8g5L2/55SoIEpTT04uc3RyaW5naWZ5IOeUn+aIkOWUr+S4gOmUrg0KICAgICAgICBpZiAoc2VlbltrZXldKSB7DQogICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHNlZW5ba2V5XSA9IHRydWU7DQogICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICAgIH0pOw0KICAgIH0sDQogICAgLy8g6I635Y+W5LyY5oOg5Yi4aWTmlbDmja4NCiAgICBuYW1lSWQoaWQsIG5hbWVzKSB7DQogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5jb3Vwb25faWRzID0gaWQ7DQogICAgICB0aGlzLmNvdXBvbk5hbWUgPSB0aGlzLnVuaXF1ZUFycmF5KG5hbWVzKTsNCiAgICB9LA0KICAgIC8vIOiOt+WPluS8mOaDoOWIuOS/oeaBrw0KICAgIGdvb2RzQ291cG9uSWQoZGF0YSkgew0KICAgICAgdGhpcy4kc2V0KHRoaXNbdGhpcy50YWJOYW1lXVt0aGlzLnRhYkluZGV4XSwgJ2NvdXBvbl9pZCcsIGRhdGEuaWQpOw0KICAgICAgdGhpcy4kc2V0KHRoaXNbdGhpcy50YWJOYW1lXVt0aGlzLnRhYkluZGV4XSwgJ2NvdXBvbl9uYW1lJywgZGF0YS50aXRsZSk7DQogICAgICB0aGlzLiRyZWZzLmdvb2RzQ291cG9uLmlzVGVtcGxhdGUgPSBmYWxzZTsNCiAgICB9LA0KICAgIGhhbmRsZUNsb3NlKG5hbWUpIHsNCiAgICAgIGxldCBpbmRleCA9IHRoaXMuY291cG9uTmFtZS5pbmRleE9mKG5hbWUpOw0KICAgICAgdGhpcy5jb3Vwb25OYW1lLnNwbGljZShpbmRleCwgMSk7DQogICAgICBsZXQgY291cG9uSWRzID0gdGhpcy5mb3JtVmFsaWRhdGUuY291cG9uX2lkczsNCiAgICAgIGNvdXBvbklkcy5zcGxpY2UoaW5kZXgsIDEpOw0KICAgICAgdGhpcy51cGRhdGVJZHMgPSBjb3Vwb25JZHM7DQogICAgICB0aGlzLnVwZGF0ZU5hbWUgPSB0aGlzLmNvdXBvbk5hbWU7DQogICAgfSwNCiAgICAvLyDmt7vliqDov5DotLnmqKHmnb8NCiAgICBhZGRUZW1wKCkgew0KICAgICAgdGhpcy4kcmVmcy50ZW1wbGF0ZXMuaXNUZW1wbGF0ZSA9IHRydWU7DQogICAgfSwNCiAgICBhZGRWaWRlbygpIHsNCiAgICAgIHRoaXMuJHZpZGVvTW9kYWwoKGUpID0+IHsNCiAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUudmlkZW9fbGluayA9IGU7DQogICAgICB9KTsNCiAgICB9LA0KICAgIC8vIOWIoOmZpOinhumike+8mw0KICAgIGRlbFZpZGVvKCkgew0KICAgICAgdGhpcy4kc2V0KHRoaXMuZm9ybVZhbGlkYXRlLCAndmlkZW9fbGluaycsICcnKTsNCiAgICAgIHRoaXMuJHNldCh0aGlzLCAncHJvZ3Jlc3MnLCAwKTsNCiAgICAgIHRoaXMudmlkZW9JbmcgPSBmYWxzZTsNCiAgICAgIHRoaXMudXBsb2FkLnZpZGVvSW5nID0gZmFsc2U7DQogICAgfSwNCiAgICB6aF91cGxvYWRGaWxlKCkgew0KICAgICAgaWYgKHRoaXMuc2VsZXRWaWRlbyA9PSAxKSB7DQogICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnZpZGVvX2xpbmsgPSB0aGlzLnZpZGVvTGluazsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuJHJlZnMucmVmaWQuY2xpY2soKTsNCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOS4iuS8oOinhumikQ0KICAgIHpoX3VwbG9hZEZpbGVfY2hhbmdlKGV2ZmlsZSkgew0KICAgICAgbGV0IHN1ZmZpeCA9IGV2ZmlsZS50YXJnZXQuZmlsZXNbMF0ubmFtZS5zdWJzdHIoZXZmaWxlLnRhcmdldC5maWxlc1swXS5uYW1lLmluZGV4T2YoJy4nKSk7DQogICAgICBpZiAoc3VmZml4LmluZGV4T2YoJy5tcDQnKSA9PT0gLTEpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+WPquiDveS4iuS8oE1QNOaWh+S7ticpOw0KICAgICAgfQ0KICAgICAgbGV0IHR5cGVzID0gew0KICAgICAgICBrZXk6IGV2ZmlsZS50YXJnZXQuZmlsZXNbMF0ubmFtZSwNCiAgICAgICAgY29udGVudFR5cGU6IGV2ZmlsZS50YXJnZXQuZmlsZXNbMF0udHlwZSwNCiAgICAgIH07DQogICAgICBwcm9kdWN0R2V0VGVtcEtleXNBcGkodHlwZXMpDQogICAgICAgIC50aGVuKChyZXMpID0+IHsNCiAgICAgICAgICB0aGlzLiR2aWRlb0Nsb3VkDQogICAgICAgICAgICAudmlkZW9VcGxvYWQoew0KICAgICAgICAgICAgICB0eXBlOiByZXMuZGF0YS50eXBlLA0KICAgICAgICAgICAgICBldmZpbGU6IGV2ZmlsZSwNCiAgICAgICAgICAgICAgcmVzOiByZXMsDQogICAgICAgICAgICAgIHVwbG9hZGluZyhzdGF0dXMsIHByb2dyZXNzKSB7DQogICAgICAgICAgICAgICAgdGhpcy51cGxvYWQudmlkZW9JbmcgPSBzdGF0dXM7DQogICAgICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gMjAwKSB7DQogICAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzID0gMTAwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICAudGhlbigocmVzKSA9PiB7DQogICAgICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnZpZGVvX2xpbmsgPSByZXMudXJsOw0KICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoJ+inhumikeS4iuS8oOaIkOWKnycpOw0KICAgICAgICAgICAgICB0aGlzLnVwbG9hZC52aWRlb0luZyA9IGZhbHNlOw0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIC5jYXRjaCgocmVzKSA9PiB7DQogICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IocmVzKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KQ0KICAgICAgICAuY2F0Y2goKHJlcykgPT4gew0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IocmVzLm1zZyk7DQogICAgICAgIH0pOw0KICAgIH0sDQogICAgLy8g5LiK5LiA6aG177ybDQogICAgdXBUYWIoKSB7DQogICAgICB0aGlzLmN1cnJlbnRUYWIgPSAoTnVtYmVyKHRoaXMuY3VycmVudFRhYikgLSAxKS50b1N0cmluZygpOw0KICAgIH0sDQogICAgLy8g5LiL5LiA6aG177ybDQogICAgZG93blRhYigpIHsNCiAgICAgIHRoaXMuY3VycmVudFRhYiA9IChOdW1iZXIodGhpcy5jdXJyZW50VGFiKSArIDEpLnRvU3RyaW5nKCk7DQogICAgfSwNCiAgICAvLyDlsZ7mgKflvLnnqpflm57osIPlh73mlbDvvJsNCiAgICB1c2VyU2VhcmNocygpIHsNCiAgICAgIHRoaXMucHJvZHVjdEdldFJ1bGUoKTsNCiAgICB9LA0KICAgIC8vIOa3u+WKoOinhOWIme+8mw0KICAgIGFkZFJ1bGUoKSB7DQogICAgICB0aGlzLiRyZWZzLmFkZGF0dHIubW9kYWwgPSB0cnVlOw0KICAgIH0sDQogICAgLy8g5om56YeP6K6+572u5YiG5L2j77ybDQogICAgYnJva2VyYWdlU2V0VXAoKSB7DQogICAgICBpZiAodGhpcy5mb3JtVmFsaWRhdGUuaXNfc3ViLmluZGV4T2YoMSkgPiAtMSkgew0KICAgICAgICBpZiAodGhpcy5tYW55QnJva2VyYWdlIDw9IDAgfHwgdGhpcy5tYW55QnJva2VyYWdlVHdvIDw9IDApIHsNCiAgICAgICAgICByZXR1cm4gdGhpcy4kbWVzc2FnZS5lcnJvcign6K+35aGr5YaZ6L+U5L2j6YeR6aKd5ZCO6L+b6KGM5om56YeP5re75YqgJyk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtVmFsaWRhdGUuaXNfc3ViLmluZGV4T2YoMCkgPiAtMSkgew0KICAgICAgICBpZiAodGhpcy5tYW55VmlwUHJpY2UgPD0gMCkgew0KICAgICAgICAgIHJldHVybiB0aGlzLiRtZXNzYWdlLmVycm9yKCfor7floavlhpnkvJrlkZjku7flkI7ov5vooYzmibnph4/mt7vliqAnKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkYXRlLmlzX3N1Yi5sZW5ndGggPT09IDIpIHsNCiAgICAgICAgaWYgKHRoaXMubWFueUJyb2tlcmFnZSA8PSAwIHx8IHRoaXMubWFueUJyb2tlcmFnZVR3byA8PSAwKSB7DQogICAgICAgICAgcmV0dXJuIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+ivt+Whq+WGmeWujOmHkemineWQjui/m+ihjOaJuemHj+a3u+WKoCcpOw0KICAgICAgICB9DQogICAgICAgIGlmICh0aGlzLm1hbnlWaXBQcmljZSA+IDAgJiYgdGhpcy5tYW55VmlwRGlzY291bnQgPiAwKSB7DQogICAgICAgICAgcmV0dXJuIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+S8muWRmOS7t+WSjOS8muWRmOaKmOaJo+WPquiDveS6jOmAieS4gOa3u+WKoCcpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBmb3IgKGxldCB2YWwgb2YgdGhpcy5tYW55Rm9ybVZhbGlkYXRlKSB7DQogICAgICAgIHRoaXMubWFueUJyb2tlcmFnZSAhPSB1bmRlZmluZWQgJiYgdGhpcy4kc2V0KHZhbCwgJ2Jyb2tlcmFnZScsIHRoaXMubWFueUJyb2tlcmFnZSk7DQogICAgICAgIHRoaXMubWFueUJyb2tlcmFnZVR3byAhPSB1bmRlZmluZWQgJiYgdGhpcy4kc2V0KHZhbCwgJ2Jyb2tlcmFnZV90d28nLCB0aGlzLm1hbnlCcm9rZXJhZ2VUd28pOw0KICAgICAgICBpZiAodGhpcy5tYW55VmlwUHJpY2UgIT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgdGhpcy4kc2V0KHZhbCwgJ3ZpcF9wcmljZScsIHRoaXMubWFueVZpcFByaWNlKTsNCiAgICAgICAgICB0aGlzLiRzZXQodmFsLCAndmlwX3Byb3BvcnRpb24nLCAoKHZhbC52aXBfcHJpY2UgLyB2YWwucHJpY2UpICogMTAwKS50b0ZpeGVkKDIpKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aGlzLiRzZXQodmFsLCAndmlwX3Byb3BvcnRpb24nLCB0aGlzLm1hbnlWaXBEaXNjb3VudCk7DQogICAgICAgICAgdGhpcy4kc2V0KHZhbCwgJ3ZpcF9wcmljZScsICh2YWwucHJpY2UgKiAodGhpcy5tYW55VmlwRGlzY291bnQgLyAxMDApKS50b0ZpeGVkKDIpKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgLy8g5om56YeP6K6+572u5Lya5ZGY5Lu3DQogICAgdmlwUHJpY2VTZXRVcCgpIHsNCiAgICAgIGlmICh0aGlzLm1hbnlWaXBQcmljZSA8PSAwKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRtZXNzYWdlLmVycm9yKCfor7floavlhpnkvJrlkZjku7flnKjov5vooYzmibnph4/mt7vliqAnKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGZvciAobGV0IHZhbCBvZiB0aGlzLm1hbnlGb3JtVmFsaWRhdGUpIHsNCiAgICAgICAgICB0aGlzLiRzZXQodmFsLCAndmlwX3ByaWNlJywgdGhpcy5tYW55VmlwUHJpY2UpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSwNCiAgICAvLyDmlrDlop7ljaHlr4YNCiAgICBoYW5kbGVBZGQoKSB7DQogICAgICB0aGlzLnZpcnR1YWxMaXN0LnB1c2goew0KICAgICAgICBrZXk6ICcnLA0KICAgICAgICB2YWx1ZTogJycsDQogICAgICB9KTsNCiAgICB9LA0KICAgIC8vIOWIneWni+WMluWNoeWvhuS/oeaBrw0KICAgIGluaXRWaXJ0dWFsRGF0YShzdGF0dXMpIHsNCiAgICAgIHRoaXMudmlydHVhbExpc3QgPSBbDQogICAgICAgIHsNCiAgICAgICAgICBrZXk6ICcnLA0KICAgICAgICAgIHZhbHVlOiAnJywNCiAgICAgICAgfSwNCiAgICAgIF07DQogICAgfSwNCiAgICByZW1vdmVWaXJ0dWFsKGluZGV4KSB7DQogICAgICB0aGlzLnZpcnR1YWxMaXN0LnNwbGljZShpbmRleCwgMSk7DQogICAgfSwNCiAgICAvLyDmuIXnqbrmibnph4/op4TmoLzkv6Hmga8NCiAgICBiYXRjaERlbCgpIHsNCiAgICAgIHRoaXMub25lRm9ybUJhdGNoID0gWw0KICAgICAgICB7DQogICAgICAgICAgcGljOiAnJywNCiAgICAgICAgICBwcmljZTogdm9pZCAwLA0KICAgICAgICAgIGNvc3Q6IHZvaWQgMCwNCiAgICAgICAgICBvdF9wcmljZTogdm9pZCAwLA0KICAgICAgICAgIHN0b2NrOiB2b2lkIDAsDQogICAgICAgICAgYmFyX2NvZGU6ICcnLA0KICAgICAgICAgIGJhcl9jb2RlX251bWJlcjogJycsDQogICAgICAgICAgd2VpZ2h0OiB2b2lkIDAsDQogICAgICAgICAgdm9sdW1lOiB2b2lkIDAsDQogICAgICAgICAgdmlydHVhbF9saXN0OiBbXSwNCiAgICAgICAgfSwNCiAgICAgIF07DQogICAgfSwNCiAgICBjb25maXJtKG5hbWUpIHsNCiAgICAgIHRoaXMuY3JlYXRlQm50ID0gdHJ1ZTsNCiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnNlbGVjdFJ1bGUgPSBuYW1lOw0KICAgICAgdGhpcy5hdHRycyA9IFtdOw0KICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkYXRlLnNlbGVjdFJ1bGUudHJpbSgpLmxlbmd0aCA8PSAwKSB7DQogICAgICAgIHJldHVybiB0aGlzLiRtZXNzYWdlLmVycm9yKCfor7fpgInmi6nlsZ7mgKcnKTsNCiAgICAgIH0NCiAgICAgIHRoaXMucnVsZUxpc3QuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHsNCiAgICAgICAgaWYgKGl0ZW0ucnVsZV9uYW1lID09PSB0aGlzLmZvcm1WYWxpZGF0ZS5zZWxlY3RSdWxlKSB7DQogICAgICAgICAgdGhpcy5hdHRycyA9IFsuLi5pdGVtLnJ1bGVfdmFsdWVdOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICAgIHRoaXMuY2FuU2VsID0gdHJ1ZTsNCiAgICAgIHRoaXMuZ2VuZXJhdGVBdHRyKHRoaXMuYXR0cnMpOw0KICAgIH0sDQogICAgLy8g6YCJ5oup6KeE5qC85qih5p2/DQogICAgaGFuZGxlQ29tbWFuZChlKSB7fSwNCiAgICAvLyDojrflj5bllYblk4HlsZ7mgKfmqKHmnb/vvJsNCiAgICBwcm9kdWN0R2V0UnVsZSgpIHsNCiAgICAgIHByb2R1Y3RHZXRSdWxlQXBpKCkudGhlbigocmVzKSA9PiB7DQogICAgICAgIHRoaXMucnVsZUxpc3QgPSByZXMuZGF0YTsNCiAgICAgIH0pOw0KICAgIH0sDQogICAgLy8g6I635Y+W6L+Q6LS55qih5p2/77ybDQogICAgcHJvZHVjdEdldFRlbXBsYXRlKCkgew0KICAgICAgcHJvZHVjdEdldFRlbXBsYXRlQXBpKCkudGhlbigocmVzKSA9PiB7DQogICAgICAgIHRoaXMudGVtcGxhdGVMaXN0ID0gcmVzLmRhdGE7DQogICAgICB9KTsNCiAgICB9LA0KICAgIHBhcmFtc0dldFRlbXBsYXRlKCkgew0KICAgICAgcGFyYW1MaXN0QXBpKCkudGhlbigocmVzKSA9PiB7DQogICAgICAgIHRoaXMucGFyYW1zVHlwZUxpc3QgPSByZXMuZGF0YS5saXN0Ow0KICAgICAgfSk7DQogICAgfSwNCiAgICBjaGFuZ2VQYXJhbXNUeXBlKGUpIHsNCiAgICAgIGUgPyB0aGlzLmdldFBhcmFtcyhlKSA6ICh0aGlzLmZvcm1WYWxpZGF0ZS5wYXJhbXNfbGlzdCA9IFtdKTsNCiAgICB9LA0KICAgIGdldFBhcmFtcyhpZCkgew0KICAgICAgcGFyYW1JbmZvQXBpKGlkKS50aGVuKChyZXMpID0+IHsNCiAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUucGFyYW1zX2xpc3QgPSByZXMuZGF0YS52YWx1ZTsNCiAgICAgIH0pOw0KICAgIH0sDQogICAgaXNTdWJzZXQoYXJyMSwgYXJyMikgew0KICAgICAgLy8g5bCG5pWw57uE6L2s5o2i5Li6IFNldO+8jOS7peS+v+i/m+ihjOmrmOaViOeahOWMheWQq+ajgOafpQ0KICAgICAgY29uc3Qgc2V0MSA9IG5ldyBTZXQoYXJyMSk7DQogICAgICBjb25zdCBzZXQyID0gbmV3IFNldChhcnIyKTsNCg0KICAgICAgLy8g5qOA5p+lIHNldDIg5Lit55qE5q+P5Liq5YWD57Sg5piv5ZCm6YO95ZyoIHNldDEg5LitDQogICAgICBmb3IgKGxldCBlbGVtIG9mIHNldDIpIHsNCiAgICAgICAgaWYgKCFzZXQxLmhhcyhlbGVtKSkgew0KICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRydWU7DQogICAgfSwNCiAgICAvLyDmibnph4/mt7vliqANCiAgICBiYXRjaEFkZCgpIHsNCiAgICAgIGxldCBhcnIgPSBbXTsNCiAgICAgIGZvciAobGV0IHZhbCBvZiB0aGlzLmF0dHJzKSB7DQogICAgICAgIGlmICh0aGlzLm9uZUZvcm1CYXRjaFswXVt2YWwudmFsdWVdKSB7DQogICAgICAgICAgYXJyLnB1c2godGhpcy5vbmVGb3JtQmF0Y2hbMF1bdmFsLnZhbHVlXSk7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgLy8g5om56YeP6K6+572u5ZWG5ZOB6KeE5qC85bGe5oCnDQogICAgICBjb25zdCBiYXRjaEZpZWxkcyA9IFsNCiAgICAgICAgJ3BpYycsDQogICAgICAgICdwcmljZScsDQogICAgICAgICdjb3N0JywNCiAgICAgICAgJ290X3ByaWNlJywNCiAgICAgICAgJ3N0b2NrJywNCiAgICAgICAgJ3dlaWdodCcsDQogICAgICAgICd2b2x1bWUnLA0KICAgICAgICAnYmFyX2NvZGUnLA0KICAgICAgICAnYmFyX2NvZGVfbnVtYmVyJywNCiAgICAgIF07DQogICAgICAvLyBjb25zdCBkZWZhdWx0RmllbGRzID0gWydiYXJfY29kZScsICdiYXJfY29kZV9udW1iZXInXTsNCg0KICAgICAgZm9yIChsZXQgdmFsIG9mIHRoaXMubWFueUZvcm1WYWxpZGF0ZSkgew0KICAgICAgICBjb25zdCBiYXRjaCA9IHRoaXMub25lRm9ybUJhdGNoWzBdOw0KICAgICAgICAvLyDlpoLmnpzlrZjlnKjnrZvpgInmnaHku7bkuJTmu6HotrPmnaHku7Ys5oiW5peg562b6YCJ5p2h5Lu25pe2DQogICAgICAgIGlmICghYXJyLmxlbmd0aCB8fCB0aGlzLmlzU3Vic2V0KHZhbC5hdHRyX2FyciwgYXJyKSkgew0KICAgICAgICAgIC8vIOiuvue9ruacieWAvOeahOaJuemHj+Wtl+autQ0KICAgICAgICAgIGJhdGNoRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7DQogICAgICAgICAgICBpZiAoYmF0Y2hbZmllbGRdICYmIGJhdGNoW2ZpZWxkXSAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgIGlmIChmaWVsZCA9PT0gJ3BpYycgJiYgYmF0Y2hbZmllbGRdKSB7DQogICAgICAgICAgICAgICAgdGhpcy4kc2V0KHZhbCwgZmllbGQsIGJhdGNoW2ZpZWxkXSk7DQogICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQgIT0gJ3BpYycpIHsNCiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodmFsLCBmaWVsZCwgYmF0Y2hbZmllbGRdKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0pOw0KDQogICAgICAgICAgLy8g6K6+572u6buY6K6k5a2X5q61DQogICAgICAgICAgLy8gZGVmYXVsdEZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4gew0KICAgICAgICAgIC8vICAgdGhpcy4kc2V0KHZhbCwgZmllbGQsIGJhdGNoW2ZpZWxkXSk7DQogICAgICAgICAgLy8gfSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIGNoYW5nZVNwZWNJbWcoYXJyLCBpbWcpIHsNCiAgICAgIC8vIOWIpOaWreaYr+WQpuWtmOWcqOinhOagvOWbvg0KICAgICAgbGV0IGlzSGFzID0gZmFsc2U7DQogICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMubWFueUZvcm1WYWxpZGF0ZS5sZW5ndGg7IGkrKykgew0KICAgICAgICBsZXQgaXRlbSA9IHRoaXMubWFueUZvcm1WYWxpZGF0ZVtpXTsNCiAgICAgICAgaWYgKGl0ZW0ucGljICYmIHRoaXMuaXNTdWJzZXQoaXRlbS5hdHRyX2FyciwgYXJyKSkgew0KICAgICAgICAgIGlzSGFzID0gdHJ1ZTsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKGlzSGFzKSB7DQogICAgICAgIHRoaXMuJGNvbmZpcm0oJ+WPr+S7peWQjOatpeS/ruaUueS4i+aWueivpeinhOagvOWbvueJh++8jOehruWumuimgeabv+aNouWQl++8nycsICfmj5DnpLonLCB7DQogICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfmm7/mjaInLA0KICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICfmmoLkuI0nLA0KICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJywNCiAgICAgICAgfSkNCiAgICAgICAgICAudGhlbigoKSA9PiB7DQogICAgICAgICAgICBmb3IgKGxldCB2YWwgb2YgdGhpcy5tYW55Rm9ybVZhbGlkYXRlKSB7DQogICAgICAgICAgICAgIGlmICh0aGlzLmlzU3Vic2V0KHZhbC5hdHRyX2FyciwgYXJyKSkgew0KICAgICAgICAgICAgICAgIHRoaXMuJHNldCh2YWwsICdwaWMnLCBpbWcpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfSkNCiAgICAgICAgICAuY2F0Y2goKCkgPT4ge30pOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgZm9yIChsZXQgdmFsIG9mIHRoaXMubWFueUZvcm1WYWxpZGF0ZSkgew0KICAgICAgICAgIGlmICh0aGlzLmlzU3Vic2V0KHZhbC5hdHRyX2FyciwgYXJyKSkgew0KICAgICAgICAgICAgdGhpcy4kc2V0KHZhbCwgJ3BpYycsIGltZyk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfSwNCiAgICAvLyDnq4vljbPnlJ/miJANCiAgICBnZW5lcmF0ZSh0eXBlLCBpc0NvcHksIGFycikgew0KICAgICAgdGhpcy5tYW55Rm9ybVZhbGlkYXRlID0gW107DQogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5oZWFkZXIgPSBbXTsNCiAgICB9LA0KICAgIGNsZWFyQXR0cigpIHsNCiAgICAgIHRoaXMuZm9ybUR5bmFtaWMuYXR0cnNOYW1lID0gJyc7DQogICAgICB0aGlzLmZvcm1EeW5hbWljLmF0dHJzVmFsID0gJyc7DQogICAgfSwNCg0KICAgIC8vIOWIoOmZpOinhOagvA0KICAgIGhhbmRsZVJlbW92ZVJvbGUoaW5kZXgpIHsNCiAgICAgIHRoaXMuYXR0cnMuc3BsaWNlKGluZGV4LCAxKTsNCiAgICAgIHRoaXMubWFueUZvcm1WYWxpZGF0ZS5zcGxpY2UoaW5kZXgsIDEpOw0KICAgICAgaWYgKCF0aGlzLmF0dHJzLmxlbmd0aCkgew0KICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5oZWFkZXIgPSBbXTsNCiAgICAgICAgdGhpcy5tYW55Rm9ybVZhbGlkYXRlID0gW107DQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLmdlbmVyYXRlQXR0cih0aGlzLmF0dHJzKTsNCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOWIoOmZpOihqOagvOS4rSDlr7nlupTlsZ7mgKcNCiAgICBkZWxBdHRyVGFibGUodmFsKSB7DQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFueUZvcm1WYWxpZGF0ZS5sZW5ndGg7IGkrKykgew0KICAgICAgICBsZXQgaXRlbSA9IHRoaXMubWFueUZvcm1WYWxpZGF0ZVtpXTsNCiAgICAgICAgaWYgKGl0ZW0uYXR0cl9hcnIgJiYgaXRlbS5hdHRyX2Fyci5pbmNsdWRlcyh2YWwpKSB7DQogICAgICAgICAgdGhpcy5tYW55Rm9ybVZhbGlkYXRlLnNwbGljZShpLCAxKTsNCiAgICAgICAgICBpLS07DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOWIoOmZpOWxnuaApw0KICAgIGhhbmRsZVJlbW92ZTIoaXRlbSwgaW5kZXgsIHZhbCkgew0KICAgICAgLy8g5Yig6ZmkIG1hbnlGb3JtVmFsaWRhdGXkuK0gdGl0bGUgPSBpdGVtLnZhbHVlIOeahOWxnuaAp+WAvA0KICAgICAgaXRlbS5zcGxpY2UoaW5kZXgsIDEpOw0KICAgICAgLy8gdGhpcy5nZW5lcmF0ZUF0dHIodGhpcy5hdHRycyk7DQogICAgICB0aGlzLmRlbEF0dHJUYWJsZSh2YWwpOw0KICAgIH0sDQogICAgLy8g5paw5aKe6KeE5qC8DQogICAgaGFuZGxlQWRkUm9sZSgpIHsNCiAgICAgIGxldCBkYXRhID0gew0KICAgICAgICB2YWx1ZTogdGhpcy5mb3JtRHluYW1pYy5hdHRyc05hbWUsDQogICAgICAgIGFkZF9waWM6IDAsDQogICAgICAgIGRldGFpbDogW10sDQogICAgICB9Ow0KICAgICAgdGhpcy5hdHRycy5wdXNoKGRhdGEpOw0KICAgIH0sDQogICAgaGFuZGxlQWRkUGFyYW1zKCkgew0KICAgICAgbGV0IGRhdGEgPSB7DQogICAgICAgIG5hbWU6ICcnLA0KICAgICAgICB2YWx1ZTogJycsDQogICAgICB9Ow0KICAgICAgdGhpcy5mb3JtVmFsaWRhdGUucGFyYW1zX2xpc3QucHVzaChkYXRhKTsNCiAgICB9LA0KICAgIGhhbmRsZVNhdmVBc1RlbXBsYXRlKCkgew0KICAgICAgdGhpcy4kcHJvbXB0KCcnLCAn6K+36L6T5YWl5qih5p2/5ZCN56ewJywgew0KICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsDQogICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognLA0KICAgICAgfSkNCiAgICAgICAgLnRoZW4oKHsgdmFsdWUgfSkgPT4gew0KICAgICAgICAgIGxldCBzcGVjID0gdGhpcy5hdHRycy5tYXAoKGl0ZW0pID0+IHsNCiAgICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICAgIHZhbHVlOiBpdGVtLnZhbHVlLA0KICAgICAgICAgICAgICBkZXRhaWw6IGl0ZW0uZGV0YWlsLm1hcCgoZSkgPT4gZS52YWx1ZSksDQogICAgICAgICAgICB9Ow0KICAgICAgICAgIH0pOw0KICAgICAgICAgIGxldCBmb3JtRHluYW1pYyA9IHsNCiAgICAgICAgICAgIHJ1bGVfbmFtZTogdmFsdWUsDQogICAgICAgICAgICBzcGVjOiBzcGVjLA0KICAgICAgICAgIH07DQogICAgICAgICAgcnVsZUFkZEFwaShmb3JtRHluYW1pYywgMCkNCiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHsNCiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKHJlcy5tc2cpOw0KICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RHZXRSdWxlKCk7DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLmNhdGNoKChyZXMpID0+IHsNCiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihyZXMubXNnKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KQ0KICAgICAgICAuY2F0Y2goKCkgPT4ge30pOw0KICAgIH0sDQogICAgLy8g5paw5aKe5LiA5p2h5bGe5oCnDQogICAgYWRkT25lQXR0cih2YWwsIHZhbDIpIHsNCiAgICAgIHRoaXMuZ2VuZXJhdGVBdHRyKHRoaXMuYXR0cnMsIHZhbDIpOw0KICAgIH0sDQogICAgaGFuZGxlRm9jdXModmFsKSB7DQogICAgICB0aGlzLmNoYW5nZUF0dHJWYWx1ZSA9IHZhbDsNCiAgICB9LA0KICAgIGhhbmRsZUJsdXIoKSB7DQogICAgICB0aGlzLmNoYW5nZUF0dHJWYWx1ZSA9ICcnOw0KICAgIH0sDQogICAgaGFuZGxlU2VsSW1nKGl0ZW0pIHsNCiAgICAgIHRoaXMuJGltZ01vZGFsKChlKSA9PiB7DQogICAgICAgIGl0ZW0ucGljID0gZS5hdHRfZGlyOw0KICAgICAgICB0aGlzLmNoYW5nZVNwZWNJbWcoW2l0ZW0udmFsdWVdLCBlLmF0dF9kaXIpOw0KICAgICAgfSk7DQogICAgfSwNCiAgICBoYW5kbGVSZW1vdmVJbWcoaXRlbSkgew0KICAgICAgaXRlbS5waWMgPSAnJzsNCiAgICB9LA0KICAgIC8vIOinhOagvOWQjeensOaUueWPmA0KICAgIGF0dHJDaGFuZ2VWYWx1ZShpLCB2YWwpIHsNCiAgICAgIGlmICh2YWwudHJpbSgpLmxlbmd0aCAmJiB0aGlzLmF0dHJzW2ldLmRldGFpbC5sZW5ndGgpIHsNCiAgICAgICAgdGhpcy5nZW5lcmF0ZUhlYWRlcih0aGlzLmF0dHJzKTsNCiAgICAgICAgaWYgKHRoaXMubWFueUZvcm1WYWxpZGF0ZS5sZW5ndGgpIHsNCiAgICAgICAgICB0aGlzLm1hbnlGb3JtVmFsaWRhdGUubWFwKChpdGVtLCBpKSA9PiB7DQogICAgICAgICAgICBpZiAoaSA+IDApIHsNCiAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGl0ZW0uZGV0YWlsKS5pbmNsdWRlcyh0aGlzLmNoYW5nZUF0dHJWYWx1ZSkpIHsNCiAgICAgICAgICAgICAgICBpdGVtLmRldGFpbFt2YWxdID0gaXRlbS5kZXRhaWxbdGhpcy5jaGFuZ2VBdHRyVmFsdWVdOw0KICAgICAgICAgICAgICAgIGl0ZW1bdmFsXSA9IGl0ZW1bdGhpcy5jaGFuZ2VBdHRyVmFsdWVdOw0KICAgICAgICAgICAgICAgIGRlbGV0ZSBpdGVtLmRldGFpbFt0aGlzLmNoYW5nZUF0dHJWYWx1ZV07DQogICAgICAgICAgICAgICAgZGVsZXRlIGl0ZW1bdGhpcy5jaGFuZ2VBdHRyVmFsdWVdOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfSk7DQogICAgICAgICAgdGhpcy5jaGFuZ2VBdHRyVmFsdWUgPSB2YWw7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuZ2VuZXJhdGVBdHRyKHRoaXMuYXR0cnMpOw0KICAgICAgfQ0KICAgIH0sDQogICAgLy8g6KeE5qC85YC85pS55Y+YDQogICAgYXR0ckRldGFpbENoYW5nZVZhbHVlKHZhbCwgaSkgew0KICAgICAgaWYgKHRoaXMubWFueUZvcm1WYWxpZGF0ZS5sZW5ndGgpIHsNCiAgICAgICAgbGV0IGtleSA9IHRoaXMuYXR0cnNbaV0udmFsdWU7DQogICAgICAgIHRoaXMubWFueUZvcm1WYWxpZGF0ZS5tYXAoKGl0ZW0sIGkpID0+IHsNCiAgICAgICAgICBpZiAoaSA+IDApIHsNCiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhpdGVtLmRldGFpbCkuaW5jbHVkZXMoa2V5KSAmJiBpdGVtLmRldGFpbFtrZXldID09PSB0aGlzLmNoYW5nZUF0dHJWYWx1ZSkgew0KICAgICAgICAgICAgICBpdGVtLmRldGFpbFtrZXldID0gdmFsOw0KICAgICAgICAgICAgICBsZXQgaW5kZXggPSBpdGVtLmF0dHJfYXJyLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbSA9PT0gdGhpcy5jaGFuZ2VBdHRyVmFsdWUpOw0KICAgICAgICAgICAgICBpdGVtLmF0dHJfYXJyW2luZGV4XSA9IHZhbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICB0aGlzLmNoYW5nZUF0dHJWYWx1ZSA9IHZhbDsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuZ2VuZXJhdGVBdHRyKHRoaXMuYXR0cnMsIDEpOw0KICAgICAgfQ0KICAgIH0sDQogICAgLy8g6KeE5qC85Zu+54mH5re75Yqg5byA5YWzDQogICAgYWRkUGljKGUsIGkpIHsNCiAgICAgIGlmIChlKSB7DQogICAgICAgIHRoaXMuYXR0cnMubWFwKChpdGVtLCBpaSkgPT4gew0KICAgICAgICAgIGlmIChpaSAhPT0gaSkgew0KICAgICAgICAgICAgdGhpcy4kc2V0KGl0ZW0sICdhZGRfcGljJywgMCk7DQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgdGhpcy5jYW5TZWwgPSBmYWxzZTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuY2FuU2VsID0gdHJ1ZTsNCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOinhOagvOaLluaLveaOkuW6j+WQjg0KICAgIG9uTW92ZVNwZWMoKSB7DQogICAgICB0aGlzLmdlbmVyYXRlQXR0cih0aGlzLmF0dHJzKTsNCiAgICB9LA0KICAgIGNoYW5nZUN1cnJlbnRJbmRleChpKSB7DQogICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IGk7DQogICAgfSwNCiAgICAvLyDnlJ/miJDllYblk4Hop4TmoLzooajlpLQNCiAgICBnZW5lcmF0ZUhlYWRlcihkYXRhKSB7DQogICAgICBsZXQgc3BlY2lmaWNhdGlvbnNDb2x1bW5zID0gZGF0YS5tYXAoKGl0ZW0pID0+ICh7DQogICAgICAgIHRpdGxlOiBpdGVtLnZhbHVlLA0KICAgICAgICBrZXk6IGl0ZW0udmFsdWUsDQogICAgICAgIG1pbldpZHRoOiAxNDAsDQogICAgICAgIGZpeGVkOiAnbGVmdCcsDQogICAgICB9KSk7DQogICAgICBsZXQgYXJyOw0KICAgICAgaWYgKFsxLCAyXS5pbmNsdWRlcyhOdW1iZXIodGhpcy5mb3JtVmFsaWRhdGUudmlydHVhbF90eXBlKSkpIHsNCiAgICAgICAgYXJyID0gWy4uLnNwZWNpZmljYXRpb25zQ29sdW1ucywgLi4uVmlydHVhbFRhYmxlSGVhZF07DQogICAgICAgIC8vIOaJvuWIsHNsb3Qg562J5LqOIGZpY3RpdGlvdXMg5bCGdGl0bGXmlLnkuLrop4TmoLzlkI3np7ANCiAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuaGVhZGVyLm1hcCgoaXRlbSkgPT4gew0KICAgICAgICAgIGlmIChpdGVtLnNsb3QgPT09ICdmaWN0aXRpb3VzJykgew0KICAgICAgICAgICAgaXRlbS50aXRsZSA9IHRoaXMuZm9ybVZhbGlkYXRlLnZpcnR1YWxfdHlwZSA9PSAxID8gJ+a3u+WKoOWNoeWvhi/nvZHnm5gnIDogJ+mAieaLqeS8mOaDoOWIuCc7DQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtVmFsaWRhdGUudmlydHVhbF90eXBlID09IDMpIHsNCiAgICAgICAgYXJyID0gWy4uLnNwZWNpZmljYXRpb25zQ29sdW1ucywgLi4uVmlydHVhbFRhYmxlSGVhZDJdOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgYXJyID0gWy4uLnNwZWNpZmljYXRpb25zQ29sdW1ucywgLi4uR29vZHNUYWJsZUhlYWRdOw0KICAgICAgfQ0KICAgICAgdGhpcy4kc2V0KHRoaXMuZm9ybVZhbGlkYXRlLCAnaGVhZGVyJywgYXJyKTsNCiAgICAgIHRoaXMudGFibGVLZXkgKz0gMTsNCiAgICAgIHRoaXMuY29sdW1uc0luc3RhbE0gPSBhcnI7DQogICAgfSwNCiAgICAvKg0KICAgICAqIOeUn+aIkOWxnuaApw0KICAgICAqIEBwYXJhbSB7QXJyYXl9IGRhdGEg6KeE5qC85pWw5o2uDQogICAgICogKi8NCiAgICBnZW5lcmF0ZUF0dHIoZGF0YSwgdmFsKSB7DQogICAgICB0aGlzLmdlbmVyYXRlSGVhZGVyKGRhdGEpOw0KICAgICAgY29uc3QgY29tYmluYXRpb25zID0gdGhpcy5nZW5lcmF0ZUNvbWJpbmF0aW9ucyhkYXRhKTsNCiAgICAgIGNvbnNvbGUubG9nKCfop4TmoLznu4TlkIjmgLvmlbDvvJonICsgY29tYmluYXRpb25zLmxlbmd0aCk7DQogICAgICBjb25zdCB2aXJ0dWFsVHlwZSA9IHRoaXMuZm9ybVZhbGlkYXRlLnZpcnR1YWxfdHlwZTsNCiAgICAgIC8vIOWmguaenGNvbWJpbmF0aW9uc+aVsOmHj+i2hei/hyA1MDDvvIzliJnliIbmibnmrKHnlJ/miJDlsZ7mgKcNCiAgICAgIGxldCByb3dzID0gW107DQogICAgICBpZiAoY29tYmluYXRpb25zLmxlbmd0aCA+IDUwMCkgew0KICAgICAgICBjb25zdCBiYXRjaFNpemUgPSBNYXRoLmNlaWwoY29tYmluYXRpb25zLmxlbmd0aCAvIDUwMCk7DQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tYmluYXRpb25zLmxlbmd0aDsgaSArPSBiYXRjaFNpemUpIHsNCiAgICAgICAgICBzZXRUaW1lb3V0KChlKSA9PiB7DQogICAgICAgICAgICBsZXQgZCA9IHRoaXMuZ2VuZXJhdGVBdHRyQmF0Y2goZGF0YSwgY29tYmluYXRpb25zLnNsaWNlKGksIGkgKyBiYXRjaFNpemUpLCB2YWwpOw0KICAgICAgICAgICAgcm93cyA9IFsuLi5yb3dzLCAuLi5kXTsNCiAgICAgICAgICAgIHRoaXMubWFueUZvcm1WYWxpZGF0ZSA9IFsuLi50aGlzLm9uZUZvcm1CYXRjaCwgLi4ucm93c107DQogICAgICAgICAgfSwgMCk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJvd3MgPSB0aGlzLmdlbmVyYXRlQXR0ckJhdGNoKGRhdGEsIGNvbWJpbmF0aW9ucywgdmFsKTsNCiAgICAgICAgdGhpcy5tYW55Rm9ybVZhbGlkYXRlID0gWy4uLnRoaXMub25lRm9ybUJhdGNoLCAuLi5yb3dzXTsNCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOeUn+aIkOWxnuaAp+aJueasoQ0KICAgIGdlbmVyYXRlQXR0ckJhdGNoKGRhdGEsIGNvbWJpbmF0aW9ucywgdmFsKSB7DQogICAgICBjb25zdCBleGlzdGluZ0l0ZW1zID0gdGhpcy5tYW55Rm9ybVZhbGlkYXRlLnNsaWNlKDEpOyAvLyDmjpLpmaTnrKzkuIDpobnpu5jorqTmlbDmja4NCg0KICAgICAgY29uc3Qgcm93cyA9IGNvbWJpbmF0aW9ucy5tYXAoKGNvbWJpbmF0aW9uKSA9PiB7DQogICAgICAgIGNvbnN0IHJvdyA9IHsNCiAgICAgICAgICBhdHRyX2FycjogY29tYmluYXRpb24sDQogICAgICAgICAgZGV0YWlsOiB7fSwNCiAgICAgICAgICB0aXRsZTogJycsDQogICAgICAgICAga2V5OiAnJywNCiAgICAgICAgICBwcmljZTogMCwNCiAgICAgICAgICBwaWM6ICcnLA0KICAgICAgICAgIG90X3ByaWNlOiAwLA0KICAgICAgICAgIGNvc3Q6IDAsDQogICAgICAgICAgc3RvY2s6IDAsDQogICAgICAgICAgaXNfc2hvdzogMSwNCiAgICAgICAgICBpc19kZWZhdWx0X3NlbGVjdDogMCwNCiAgICAgICAgICB1bmlxdWU6ICcnLA0KICAgICAgICAgIHdlaWdodDogJycsDQogICAgICAgICAgdm9sdW1lOiAnJywNCiAgICAgICAgICBicm9rZXJhZ2U6IDAsDQogICAgICAgICAgYnJva2VyYWdlX3R3bzogMCwNCiAgICAgICAgICB2aXBfcHJpY2U6IDAsDQogICAgICAgICAgdmlwX3Byb3BvcnRpb246IDAsDQogICAgICAgIH07DQoNCiAgICAgICAgLy8g6K6+572u6Jma5ouf57G75Z6L55u45YWz5bGe5oCnDQogICAgICAgIGlmICh0aGlzLmZvcm1WYWxpZGF0ZS52aXJ0dWFsX3R5cGUgPT09IDEpIHsNCiAgICAgICAgICByb3cudmlydHVhbF9saXN0ID0gW107DQogICAgICAgICAgcm93LmRpc2tfaW5mbyA9ICcnOw0KICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybVZhbGlkYXRlLnZpcnR1YWxfdHlwZSA9PT0gMikgew0KICAgICAgICAgIHJvdy5jb3Vwb25faWQgPSAwOw0KICAgICAgICAgIHJvdy5jb3Vwb25fbmFtZSA9ICcnOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8g5aSE55CG6KeE5qC85bGe5oCnDQogICAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSwgaSkgPT4gew0KICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29tYmluYXRpb25baV07DQogICAgICAgICAgcm93W2l0ZW0udmFsdWVdID0gdmFsdWU7DQogICAgICAgICAgcm93LnRpdGxlID0gaXRlbS52YWx1ZTsNCiAgICAgICAgICByb3cua2V5ID0gaXRlbS52YWx1ZTsNCiAgICAgICAgICByb3cuZGV0YWlsW2l0ZW0udmFsdWVdID0gdmFsdWU7DQoNCiAgICAgICAgICAvLyDmn6Xmib7ljLnphY3nmoTnjrDmnInop4TmoLzpobkNCiAgICAgICAgICBjb25zdCBtYXRjaGVkSXRlbSA9IGV4aXN0aW5nSXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5hdHRyX2FyciAmJiBhcnJheXNFcXVhbChpdGVtLmF0dHJfYXJyLCBjb21iaW5hdGlvbikpOw0KDQogICAgICAgICAgaWYgKG1hdGNoZWRJdGVtKSB7DQogICAgICAgICAgICBPYmplY3QuYXNzaWduKHJvdywgew0KICAgICAgICAgICAgICBwcmljZTogbWF0Y2hlZEl0ZW0ucHJpY2UsDQogICAgICAgICAgICAgIGNvc3Q6IG1hdGNoZWRJdGVtLmNvc3QsDQogICAgICAgICAgICAgIG90X3ByaWNlOiBtYXRjaGVkSXRlbS5vdF9wcmljZSwNCiAgICAgICAgICAgICAgc3RvY2s6IG1hdGNoZWRJdGVtLnN0b2NrLA0KICAgICAgICAgICAgICBwaWM6IG1hdGNoZWRJdGVtLnBpYywNCiAgICAgICAgICAgICAgdW5pcXVlOiBtYXRjaGVkSXRlbS51bmlxdWUgfHwgJycsDQogICAgICAgICAgICAgIHdlaWdodDogbWF0Y2hlZEl0ZW0ud2VpZ2h0IHx8ICcnLA0KICAgICAgICAgICAgICB2b2x1bWU6IG1hdGNoZWRJdGVtLnZvbHVtZSB8fCAnJywNCiAgICAgICAgICAgICAgaXNfc2hvdzogbWF0Y2hlZEl0ZW0uaXNfc2hvdyB8fCAxLA0KICAgICAgICAgICAgICBpc19kZWZhdWx0X3NlbGVjdDogbWF0Y2hlZEl0ZW0uaXNfZGVmYXVsdF9zZWxlY3QgfHwgMCwNCiAgICAgICAgICAgICAgdm9sdW1lOiBtYXRjaGVkSXRlbS52b2x1bWUgfHwgMCwNCiAgICAgICAgICAgICAgYmFyX2NvZGVfbnVtYmVyOiBtYXRjaGVkSXRlbS5iYXJfY29kZV9udW1iZXIgfHwgMCwNCiAgICAgICAgICAgICAgaXNfdmlydHVhbDogbWF0Y2hlZEl0ZW0uaXNfdmlydHVhbCwNCiAgICAgICAgICAgICAgYnJva2VyYWdlOiBtYXRjaGVkSXRlbS5icm9rZXJhZ2UsDQogICAgICAgICAgICAgIGJyb2tlcmFnZV90d286IG1hdGNoZWRJdGVtLmJyb2tlcmFnZV90d28sDQogICAgICAgICAgICAgIHZpcF9wcmljZTogbWF0Y2hlZEl0ZW0udmlwX3ByaWNlLA0KICAgICAgICAgICAgICB2aXBfcHJvcG9ydGlvbjogbWF0Y2hlZEl0ZW0udmlwX3Byb3BvcnRpb24sDQogICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkYXRlLnZpcnR1YWxfdHlwZSA9PT0gMSkgew0KICAgICAgICAgICAgICByb3cudmlydHVhbF9saXN0ID0gbWF0Y2hlZEl0ZW0udmlydHVhbF9saXN0Ow0KICAgICAgICAgICAgICByb3cuZGlza19pbmZvID0gbWF0Y2hlZEl0ZW0uZGlza19pbmZvOw0KICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZvcm1WYWxpZGF0ZS52aXJ0dWFsX3R5cGUgPT09IDIgJiYgbWF0Y2hlZEl0ZW0uY291cG9uX2lkKSB7DQogICAgICAgICAgICAgIHJvdy5jb3Vwb25faWQgPSBtYXRjaGVkSXRlbS5jb3Vwb25faWQ7DQogICAgICAgICAgICAgIHJvdy5jb3Vwb25fbmFtZSA9IG1hdGNoZWRJdGVtLmNvdXBvbl9uYW1lOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5hZGRfcGljICYmIGNvbWJpbmF0aW9uLmluY2x1ZGVzKHZhbCkpIHsNCiAgICAgICAgICAgIGNvbnN0IHBpY0l0ZW0gPSBpdGVtLmRldGFpbC5maW5kKChlKSA9PiBjb21iaW5hdGlvbi5pbmNsdWRlcyhlLnZhbHVlKSk7DQogICAgICAgICAgICBpZiAocGljSXRlbSkgcm93LnBpYyA9IHBpY0l0ZW0ucGljOw0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICAgIHJldHVybiByb3c7DQogICAgICB9KTsNCiAgICAgIHJldHVybiByb3dzOw0KICAgIH0sDQogICAgLy8g5YiH5o2i6buY6K6k6YCJ5Lit6KeE5qC8DQogICAgY2hhbmdlRGVmYXVsdFNlbGVjdChlLCBpbmRleCkgew0KICAgICAgLy8g5LiA5Liq5byA5ZCvIOWFtuS7luWFs+mXrQ0KICAgICAgdGhpcy5tYW55Rm9ybVZhbGlkYXRlLm1hcCgoaXRlbSwgaSkgPT4gew0KICAgICAgICBpZiAoaSAhPT0gaW5kZXgpIHsNCiAgICAgICAgICBpdGVtLmlzX2RlZmF1bHRfc2VsZWN0ID0gMDsNCiAgICAgICAgfQ0KICAgICAgfSk7DQogICAgICBpZiAoZSkgdGhpcy5tYW55Rm9ybVZhbGlkYXRlW2luZGV4XS5pc19zaG93ID0gMTsNCiAgICB9LA0KICAgIC8vIOaUueWPmOaYr+WQpuaYvuekug0KICAgIGNoYW5nZURlZmF1bHRTaG93KGluZGV4KSB7DQogICAgICAvLyDlpoLmnpzpu5jorqTpgInkuK3lvIDlkK8g5YiZ5LiN5Y+v6ZqQ6JePDQogICAgICBpZiAodGhpcy5tYW55Rm9ybVZhbGlkYXRlW2luZGV4XS5pc19kZWZhdWx0X3NlbGVjdCA9PT0gMSkgew0KICAgICAgICB0aGlzLm1hbnlGb3JtVmFsaWRhdGVbaW5kZXhdLmlzX3Nob3cgPSAxOw0KICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCfpu5jorqTop4TmoLzkuI3lj6/pmpDol48nKTsNCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOeUn+aIkOinhOagvOe7hOWQiA0KICAgIGdlbmVyYXRlQ29tYmluYXRpb25zKGFyciwgcHJlZml4ID0gW10pIHsNCiAgICAgIGlmIChhcnIubGVuZ3RoID09PSAwKSB7DQogICAgICAgIHJldHVybiBbcHJlZml4XTsNCiAgICAgIH0NCiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBhcnI7DQogICAgICByZXR1cm4gZmlyc3QuZGV0YWlsLmZsYXRNYXAoKGRldGFpbCkgPT4gdGhpcy5nZW5lcmF0ZUNvbWJpbmF0aW9ucyhyZXN0LCBbLi4ucHJlZml4LCBkZXRhaWwudmFsdWVdKSk7DQogICAgfSwNCiAgICAvLyDmt7vliqDlsZ7mgKcNCiAgICBjcmVhdGVBdHRyKG51bSwgaWR4KSB7DQogICAgICBpZiAobnVtKSB7DQogICAgICAgIC8vIOWIpOaWreaYr+WQpuWtmOWcqOWQjOagt+eGn+aCiQ0KICAgICAgICB2YXIgaXNFeGlzdCA9IHRoaXMuYXR0cnNbaWR4XS5kZXRhaWwuc29tZSgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gbnVtKTsNCiAgICAgICAgaWYgKGlzRXhpc3QpIHsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCfop4TmoLzlgLzlt7LlrZjlnKgnKTsNCiAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5hdHRyc1tpZHhdLmRldGFpbC5wdXNoKHsgdmFsdWU6IG51bSwgcGljOiAnJyB9KTsNCiAgICAgICAgaWYgKHRoaXMubWFueUZvcm1WYWxpZGF0ZS5sZW5ndGgpIHsNCiAgICAgICAgICB0aGlzLmFkZE9uZUF0dHIodGhpcy5hdHRyc1tpZHhdLnZhbHVlLCBudW0pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHRoaXMuZ2VuZXJhdGVBdHRyKHRoaXMuYXR0cnMpOw0KICAgICAgICB9DQoNCiAgICAgICAgdGhpcy4kcmVmcy5zcGVjU3RvY2suJHJlZnNbJ3BvcG92ZXJSZWZfJyArIGlkeF1bMF0uZG9DbG9zZSgpOyAvL+WFs+mXreeahA0KICAgICAgICB0aGlzLmNsZWFyQXR0cigpOw0KICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgICBpZiAodGhpcy4kcmVmcy5zcGVjU3RvY2suJHJlZnNbJ3BvcG92ZXJSZWZfJyArIGlkeF0pIHsNCiAgICAgICAgICAgIC8v6YeN54K55piv5Lul5LiL5Lik5Y+lDQogICAgICAgICAgICB0aGlzLiRyZWZzLnNwZWNTdG9jay4kcmVmc1sncG9wb3ZlclJlZl8nICsgaWR4XVswXS5kb1Nob3coKTsgLy/miZPlvIDnmoQNCiAgICAgICAgICAgIC8v6YeN54K55piv5Lul5LiK5Lik5Y+lDQogICAgICAgICAgfQ0KICAgICAgICB9LCAyMCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLiRyZWZzLnNwZWNTdG9jay4kcmVmc1sncG9wb3ZlclJlZl8nICsgaWR4XVswXS5kb0Nsb3NlKCk7IC8v5YWz6Zet55qEDQogICAgICB9DQogICAgfSwNCiAgICBoYW5kbGVTaG93UG9wKGluZGV4KSB7DQogICAgICB0aGlzLiRyZWZzLnNwZWNTdG9jay4kcmVmc1snaW5wdXRSZWZfJyArIGluZGV4XVswXS5mb2N1cygpOw0KICAgIH0sDQogICAgLy8g5ZWG5ZOB5YiG57G777ybDQogICAgZ29vZHNDYXRlZ29yeSgpIHsNCiAgICAgIGNhc2NhZGVyTGlzdEFwaSgxKQ0KICAgICAgICAudGhlbigocmVzKSA9PiB7DQogICAgICAgICAgdGhpcy50cmVlU2VsZWN0ID0gcmVzLmRhdGE7DQogICAgICAgIH0pDQogICAgICAgIC5jYXRjaCgocmVzKSA9PiB7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihyZXMubXNnKTsNCiAgICAgICAgfSk7DQogICAgfSwNCiAgICAvLyDmlLnlj5jop4TmoLwNCiAgICBjaGFuZ2VTcGVjKCkgew0KICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuaXNfc3ViID0gW107DQogICAgICBsZXQgaWQgPSB0aGlzLiRyb3V0ZS5wYXJhbXMuaWQ7DQogICAgICBpZiAoaWQpIHsNCiAgICAgICAgY2hlY2tBY3Rpdml0eUFwaShpZCkNCiAgICAgICAgICAudGhlbigocmVzKSA9PiB7fSkNCiAgICAgICAgICAuY2F0Y2goKHJlcykgPT4gew0KICAgICAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuc3BlY190eXBlID0gdGhpcy5zcGVjX3R5cGU7DQogICAgICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKHJlcy5tc2cpOw0KICAgICAgICAgIH0pOw0KICAgICAgfQ0KICAgIH0sDQogICAgLy8g6K+m5oOFDQogICAgZ2V0SW5mbygpIHsNCiAgICAgIHRoaXMuc3BpblNob3cgPSB0cnVlOw0KICAgICAgcHJvZHVjdEluZm9BcGkodGhpcy4kcm91dGUucGFyYW1zLmlkKQ0KICAgICAgICAudGhlbihhc3luYyAocmVzKSA9PiB7DQogICAgICAgICAgbGV0IGRhdGEgPSByZXMuZGF0YS5wcm9kdWN0SW5mbzsNCiAgICAgICAgICB0aGlzLmluZm9EYXRhKGRhdGEpOw0KICAgICAgICAgIHRoaXMuc3BpblNob3cgPSBmYWxzZTsNCiAgICAgICAgfSkNCiAgICAgICAgLmNhdGNoKChyZXMpID0+IHsNCiAgICAgICAgICB0aGlzLnNwaW5TaG93ID0gZmFsc2U7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihyZXMubXNnKTsNCiAgICAgICAgfSk7DQogICAgfSwNCiAgICBoYW5kbGVSZW1vdmUoaSkgew0KICAgICAgdGhpcy5pbWFnZXMuc3BsaWNlKGksIDEpOw0KICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuc2xpZGVyX2ltYWdlLnNwbGljZShpLCAxKTsNCiAgICAgIHRoaXMub25lRm9ybVZhbGlkYXRlWzBdLnBpYyA9IHRoaXMuZm9ybVZhbGlkYXRlLnNsaWRlcl9pbWFnZVswXTsNCiAgICB9LA0KICAgIC8vIOWFs+mXreWbvueJh+S4iuS8oOaooeaAgeahhg0KICAgIGNoYW5nZUNhbmNlbChtc2cpIHsNCiAgICAgIHRoaXMubW9kYWxQaWMgPSBmYWxzZTsNCiAgICB9LA0KICAgIC8vIOeCueWHu+WVhuWTgeWbvg0KICAgIG1vZGFsUGljVGFwKHRpdCwgcGljVGl0ID0gJycsIGluZGV4ID0gMCkgew0KICAgICAgdGhpcy5tb2RhbFBpYyA9IHRydWU7DQogICAgICB0aGlzLmlzQ2hvaWNlID0gdGl0ID09PSAnZGFuJyA/ICfljZXpgIknIDogJ+WkmumAiSc7DQogICAgICB0aGlzLnBpY1RpdCA9IHBpY1RpdDsNCiAgICAgIHRoaXMudGFibGVJbmRleCA9IGluZGV4Ow0KICAgIH0sDQogICAgLy8g6I635Y+W5Y2V5byg5Zu+54mH5L+h5oGvDQogICAgZ2V0UGljKHBjKSB7DQogICAgICBzd2l0Y2ggKHRoaXMucGljVGl0KSB7DQogICAgICAgIGNhc2UgJ2RhbkZyb20nOg0KICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmltYWdlID0gcGMuYXR0X2RpcjsNCiAgICAgICAgICBpZiAoIXRoaXMuJHJvdXRlLnBhcmFtcy5pZCkgew0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkYXRlLnNwZWNfdHlwZSA9PT0gMCkgew0KICAgICAgICAgICAgICB0aGlzLm9uZUZvcm1WYWxpZGF0ZVswXS5waWMgPSBwYy5hdHRfZGlyOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgdGhpcy5tYW55Rm9ybVZhbGlkYXRlLm1hcCgoaXRlbSkgPT4gew0KICAgICAgICAgICAgICAgIGl0ZW0ucGljID0gcGMuYXR0X2RpcjsNCiAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgIHRoaXMub25lRm9ybUJhdGNoWzBdLnBpYyA9IHBjLmF0dF9kaXI7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdkYW5UYWJsZSc6DQogICAgICAgICAgdGhpcy5vbmVGb3JtVmFsaWRhdGVbdGhpcy50YWJsZUluZGV4XS5waWMgPSBwYy5hdHRfZGlyOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdkdW9waSc6DQogICAgICAgICAgdGhpcy5vbmVGb3JtQmF0Y2hbdGhpcy50YWJsZUluZGV4XS5waWMgPSBwYy5hdHRfZGlyOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdyZWNvbW1lbmRfaW1hZ2UnOg0KICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnJlY29tbWVuZF9pbWFnZSA9IHBjLmF0dF9kaXI7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgaWYgKHRoaXMubWFueUZvcm1WYWxpZGF0ZS5sZW5ndGgpIHRoaXMubWFueUZvcm1WYWxpZGF0ZVt0aGlzLnRhYmxlSW5kZXhdLnBpYyA9IHBjLmF0dF9kaXI7DQogICAgICB9DQogICAgICB0aGlzLm1vZGFsUGljID0gZmFsc2U7DQogICAgfSwNCiAgICBkZWxldGVSb3coaW5kZXgpIHsNCiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnBhcmFtc19saXN0LnNwbGljZShpbmRleCwgMSk7DQogICAgfSwNCiAgICAvLyDojrflj5blpJrlvKDlm77kv6Hmga8NCiAgICBnZXRQaWNEKHBjKSB7DQogICAgICB0aGlzLmltYWdlcyA9IHBjOw0KICAgICAgdGhpcy5pbWFnZXMubWFwKChpdGVtKSA9PiB7DQogICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnNsaWRlcl9pbWFnZS5wdXNoKGl0ZW0uYXR0X2Rpcik7DQogICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLnNsaWRlcl9pbWFnZSA9IHRoaXMuZm9ybVZhbGlkYXRlLnNsaWRlcl9pbWFnZS5zcGxpY2UoMCwgMTApOw0KICAgICAgfSk7DQogICAgICB0aGlzLm9uZUZvcm1WYWxpZGF0ZVswXS5waWMgPSB0aGlzLmZvcm1WYWxpZGF0ZS5zbGlkZXJfaW1hZ2VbMF07DQogICAgICB0aGlzLm1vZGFsUGljID0gZmFsc2U7DQogICAgfSwNCiAgICAvLyDmj5DkuqQNCiAgICBoYW5kbGVTdWJtaXQobmFtZSkgew0KICAgICAgdGhpcy4kcmVmc1tuYW1lXS52YWxpZGF0ZSgodmFsaWQpID0+IHsNCiAgICAgICAgaWYgKHZhbGlkKSB7DQogICAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUudHlwZSA9IHRoaXMudHlwZTsNCiAgICAgICAgICBsZXQgYXJyID0gdGhpcy5mb3JtVmFsaWRhdGUuc3BlY190eXBlID09PSAwID8gdGhpcy5vbmVGb3JtVmFsaWRhdGUgOiB0aGlzLm1hbnlGb3JtVmFsaWRhdGU7DQogICAgICAgICAgbGV0IGl0ZW0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGFycikpOw0KICAgICAgICAgIGlmICh0aGlzLmZvcm1WYWxpZGF0ZS5zcGVjX3R5cGUgPT09IDEpIHsNCiAgICAgICAgICAgIGlmIChpdGVtLmxlbmd0aCA8IDIpIHJldHVybiB0aGlzLiRtZXNzYWdlLndhcm5pbmcoJ+WVhuWTgeinhOagvC3op4TmoLzmlbDph4/mnIDlsJEx5LiqJyk7DQogICAgICAgICAgICAvLyDliKDpmaTnrKzkuIDpobkNCiAgICAgICAgICAgIGl0ZW0uc2hpZnQoKTsNCiAgICAgICAgICB9DQogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoaXRlbVtpXS5zdG9jayA+IDEwMDAwMDApIHsNCiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+inhOagvOW6k+WtmC3lupPlrZjotoXlh7rns7vnu5/ojIPlm7QoMTAwMDAwMCknKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkYXRlLmlzX3N1YlswXSA9PT0gMSkgew0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgIGlmIChpdGVtW2ldLmJyb2tlcmFnZSA9PT0gbnVsbCB8fCBpdGVtW2ldLmJyb2tlcmFnZV90d28gPT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kbWVzc2FnZS5lcnJvcign6JCl6ZSA6K6+572uLSDkuIDkuoznuqfov5TkvaPkuI3og73kuLrnqbonKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgaWYgKGl0ZW1baV0udmlwX3ByaWNlID09PSBudWxsKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+iQpemUgOiuvue9ri3kvJrlkZjku7fkuI3og73kuLrnqbonKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAodGhpcy5mb3JtVmFsaWRhdGUuaXNfc3ViLmxlbmd0aCA9PT0gMikgew0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgIGlmIChpdGVtW2ldLmJyb2tlcmFnZSA9PT0gbnVsbCB8fCBpdGVtW2ldLmJyb2tlcmFnZV90d28gPT09IG51bGwgfHwgaXRlbVtpXS52aXBfcHJpY2UgPT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kbWVzc2FnZS5lcnJvcign6JCl6ZSA6K6+572uLSDkuIDkuoznuqfov5TkvaPlkozkvJrlkZjku7fkuI3og73kuLrnqbonKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAodGhpcy5mb3JtVmFsaWRhdGUuZnJlaWdodCA9PSAzICYmICF0aGlzLmZvcm1WYWxpZGF0ZS50ZW1wX2lkKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfllYblk4Hkv6Hmga8t6L+Q6LS55qih5p2/5LiN6IO95Li656m6Jyk7DQogICAgICAgICAgfQ0KICAgICAgICAgIGxldCBhY3RpdmVJZHMgPSBbXTsNCiAgICAgICAgICB0aGlzLmRhdGFMYWJlbC5mb3JFYWNoKChpdGVtKSA9PiB7DQogICAgICAgICAgICBhY3RpdmVJZHMucHVzaChpdGVtLmlkKTsNCiAgICAgICAgICB9KTsNCiAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5sYWJlbF9pZCA9IGFjdGl2ZUlkczsNCiAgICAgICAgICBpZiAodGhpcy5vcGVuU3ViaW1pdCkgcmV0dXJuOw0KICAgICAgICAgIHRoaXMub3BlblN1YmltaXQgPSB0cnVlOw0KICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmRlc2NyaXB0aW9uID0gZm9ybWF0UmljaFRleHQodGhpcy5jb250ZW50KTsNCiAgICAgICAgICBpZiAodGhpcy5mb3JtVmFsaWRhdGUuc3BlY190eXBlID09PSAwKSB7DQogICAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5hdHRycyA9IGl0ZW07DQogICAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5oZWFkZXIgPSBbXTsNCiAgICAgICAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLml0ZW1zID0gW107DQogICAgICAgICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5pc19jb3B5ID0gMDsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuaXRlbXMgPSB0aGlzLmF0dHJzOw0KICAgICAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuYXR0cnMgPSBpdGVtOw0KICAgICAgICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuaXNfY29weSA9IDE7DQogICAgICAgICAgfQ0KICAgICAgICAgIHByb2R1Y3RBZGRBcGkodGhpcy5mb3JtVmFsaWRhdGUpDQogICAgICAgICAgICAudGhlbihhc3luYyAocmVzKSA9PiB7DQogICAgICAgICAgICAgIHRoaXMub3BlblN1YmltaXQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKHJlcy5tc2cpOw0KICAgICAgICAgICAgICBpZiAodGhpcy4kcm91dGUucGFyYW1zLmlkID09PSAnMCcpIHsNCiAgICAgICAgICAgICAgICBjYWNoZURlbGV0ZSgpLmNhdGNoKChlcnIpID0+IHsNCiAgICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoZXJyLm1zZyk7DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICAgICAgdGhpcy5vcGVuU3ViaW1pdCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHsgcGF0aDogdGhpcy4kcm91dGVQcm9TdHIgKyAnL3Byb2R1Y3QvcHJvZHVjdF9saXN0JyB9KTsNCiAgICAgICAgICAgICAgfSwgNTAwKTsNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICAuY2F0Y2goKHJlcykgPT4gew0KICAgICAgICAgICAgICBzZXRUaW1lb3V0KChlKSA9PiB7DQogICAgICAgICAgICAgICAgdGhpcy5vcGVuU3ViaW1pdCA9IGZhbHNlOw0KICAgICAgICAgICAgICB9LCAxMDAwKTsNCiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihyZXMubXNnKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGlmICghdGhpcy5mb3JtVmFsaWRhdGUuc3RvcmVfbmFtZSkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn5ZWG5ZOB5L+h5oGvLeWVhuWTgeWQjeensOS4jeiDveS4uuepuicpOw0KICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZm9ybVZhbGlkYXRlLmNhdGVfaWQubGVuZ3RoKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfllYblk4Hkv6Hmga8t5ZWG5ZOB5YiG57G75LiN6IO95Li656m6Jyk7DQogICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5mb3JtVmFsaWRhdGUudW5pdF9uYW1lKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfllYblk4Hkv6Hmga8t5ZWG5ZOB5Y2V5L2N5LiN6IO95Li656m6Jyk7DQogICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5mb3JtVmFsaWRhdGUuc2xpZGVyX2ltYWdlLmxlbmd0aCkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn5ZWG5ZOB5L+h5oGvLeWVhuWTgei9ruaSreWbvuS4jeiDveS4uuepuicpOw0KICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZm9ybVZhbGlkYXRlLmxvZ2lzdGljcy5sZW5ndGggJiYgIXRoaXMuZm9ybVZhbGlkYXRlLnZpcnR1YWxfdHlwZSkgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn54mp5rWB6K6+572uLeiHs+WwkemAieaLqeS4gOenjeeJqea1geaWueW8jycpOw0KICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZm9ybVZhbGlkYXRlLnRlbXBfaWQgJiYgdGhpcy5mb3JtVmFsaWRhdGUuZnJlaWdodCA9PSAzKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfllYblk4Hkv6Hmga8t6L+Q6LS55qih5p2/5LiN6IO95Li656m6Jyk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9LA0KICAgIGNoYW5nZVRlbXBsYXRlKG1zZykgew0KICAgICAgdGhpcy50ZW1wbGF0ZSA9IG1zZzsNCiAgICB9LA0KICAgIC8vIOihqOWNlemqjOivgQ0KICAgIHZhbGlkYXRlKHByb3AsIHN0YXR1cywgZXJyb3IpIHsNCiAgICAgIGlmIChzdGF0dXMgPT09IGZhbHNlKSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2Uud2FybmluZyhlcnJvcik7DQogICAgICB9DQogICAgfSwNCiAgICAvLyDnp7vliqgNCiAgICBoYW5kbGVEcmFnU3RhcnQoZSwgaXRlbSkgew0KICAgICAgdGhpcy5kcmFnZ2luZyA9IGl0ZW07DQogICAgfSwNCiAgICBoYW5kbGVEcmFnRW5kKGUsIGl0ZW0pIHsNCiAgICAgIHRoaXMuZHJhZ2dpbmcgPSBudWxsOw0KICAgIH0sDQogICAgaGFuZGxlRHJhZ092ZXIoZSkgew0KICAgICAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJzsNCiAgICB9LA0KICAgIGhhbmRsZURyYWdFbnRlcihlLCBpdGVtKSB7DQogICAgICBlLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnOw0KICAgICAgaWYgKGl0ZW0gPT09IHRoaXMuZHJhZ2dpbmcpIHsNCiAgICAgICAgcmV0dXJuOw0KICAgICAgfQ0KICAgICAgY29uc3QgbmV3SXRlbXMgPSBbLi4udGhpcy5mb3JtVmFsaWRhdGUuc2xpZGVyX2ltYWdlXTsNCiAgICAgIGNvbnN0IHNyYyA9IG5ld0l0ZW1zLmluZGV4T2YodGhpcy5kcmFnZ2luZyk7DQogICAgICBjb25zdCBkc3QgPSBuZXdJdGVtcy5pbmRleE9mKGl0ZW0pOw0KICAgICAgbmV3SXRlbXMuc3BsaWNlKGRzdCwgMCwgLi4ubmV3SXRlbXMuc3BsaWNlKHNyYywgMSkpOw0KICAgICAgdGhpcy5mb3JtVmFsaWRhdGUuc2xpZGVyX2ltYWdlID0gbmV3SXRlbXM7DQogICAgfSwNCiAgICAvL+WvueixoeaVsOe7hOWOu+mHje+8mw0KICAgIHVuaXF1ZShhcnIpIHsNCiAgICAgIGNvbnN0IHJlcyA9IG5ldyBNYXAoKTsNCiAgICAgIHJldHVybiBhcnIuZmlsdGVyKChhcnIpID0+ICFyZXMuaGFzKGFyci5wcm9kdWN0X2lkKSAmJiByZXMuc2V0KGFyci5wcm9kdWN0X2lkLCAxKSk7DQogICAgfSwNCiAgICAvLyDllYblk4FpZA0KICAgIGdldFByb2R1Y3RJZChkYXRhKSB7DQogICAgICB0aGlzLmdvb2RzX21vZGFscyA9IGZhbHNlOw0KICAgICAgdGhpcy5mb3JtVmFsaWRhdGUucmVjb21tZW5kX2xpc3QgPSB0aGlzLnVuaXF1ZSh0aGlzLmZvcm1WYWxpZGF0ZS5yZWNvbW1lbmRfbGlzdC5jb25jYXQoZGF0YSkpOw0KICAgIH0sDQogICAgLy8g6YCJ5oup5o6o6I2Q5ZWG5ZOBDQogICAgY2hhbmdlR29vZHMoKSB7DQogICAgICB0aGlzLmdvb2RzX21vZGFscyA9IHRydWU7DQogICAgICB0aGlzLiRyZWZzLmdvb2RzbGlzdC5nZXRMaXN0KCk7DQogICAgICB0aGlzLiRyZWZzLmdvb2RzbGlzdC5nb29kc0NhdGVnb3J5KCk7DQogICAgfSwNCiAgICAvLyDpgInmi6nnlKjmiLfmoIfnrb4NCiAgICBhY3RpdmVEYXRhKGRhdGFMYWJlbCkgew0KICAgICAgdGhpcy5sYWJlbFNob3cgPSBmYWxzZTsNCiAgICAgIHRoaXMuZGF0YUxhYmVsID0gZGF0YUxhYmVsOw0KICAgIH0sDQogICAgLy8g6YCJ5oup5ZWG5ZOB5qCH562+DQogICAgYWN0aXZlTGFiZWwoZGF0YSkgew0KICAgICAgdGhpcy50YWdTaG93ID0gZmFsc2U7DQogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5sYWJlbF9saXN0ID0gQXJyYXkuZnJvbShuZXcgU2V0KGRhdGEpKTsNCiAgICB9LA0KICAgIC8vIOagh+etvuW8ueeql+WFs+mXrQ0KICAgIGxhYmVsQ2xvc2UoKSB7DQogICAgICB0aGlzLmxhYmVsU2hvdyA9IGZhbHNlOw0KICAgICAgdGhpcy50YWdTaG93ID0gZmFsc2U7DQogICAgfSwNCiAgICAvLyDliKDpmaTnlKjmiLfmoIfnrb4NCiAgICBjbG9zZUxhYmVsKGxhYmVsKSB7DQogICAgICBsZXQgaW5kZXggPSB0aGlzLmRhdGFMYWJlbC5pbmRleE9mKHRoaXMuZGF0YUxhYmVsLmZpbHRlcigoZCkgPT4gZC5pZCA9PSBsYWJlbC5pZClbMF0pOw0KICAgICAgdGhpcy5kYXRhTGFiZWwuc3BsaWNlKGluZGV4LCAxKTsNCiAgICB9LA0KICAgIC8vIOaJk+W8gOmAieaLqeeUqOaIt+agh+etvg0KICAgIG9wZW5MYWJlbChyb3cpIHsNCiAgICAgIHRoaXMubGFiZWxTaG93ID0gdHJ1ZTsNCiAgICB9LA0KICAgIGhhbmRsZVJlbW92ZVJlY29tbWVuZChpKSB7DQogICAgICB0aGlzLmZvcm1WYWxpZGF0ZS5yZWNvbW1lbmRfbGlzdC5zcGxpY2UoaSwgMSk7DQogICAgfSwNCiAgICAvLyDmiZPlvIDnmoTokKXplIDmtLvliqjmoIfnrb4NCiAgICB3YXRjaEFjdGl2aXR5KCkgew0KICAgICAgbGV0IG1hcmtldGluZyA9IFtdOw0KICAgICAgLy8g5L2/55So5a+56LGh5pig5bCE5LyY5YyW5p2D6ZmQ5Yik5pat6YC76L6RDQogICAgICBjb25zdCBwZXJtaXNzaW9uTWFwID0gew0KICAgICAgICDpu5jorqQ6IHRydWUsDQogICAgICAgIOenkuadgDogJ3NlY2tpbGwnLA0KICAgICAgICDnoI3ku7c6ICdiYXJnYWluJywNCiAgICAgICAg5ou85ZuiOiAnY29tYmluYXRpb24nLA0KICAgICAgfTsNCiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmFjdGl2aXR5LmZvckVhY2goKGVsKSA9PiB7DQogICAgICAgIGlmIChwZXJtaXNzaW9uTWFwW2VsXSA9PT0gdHJ1ZSB8fCAocGVybWlzc2lvbk1hcFtlbF0gJiYgY2hlY2tBcnJheShwZXJtaXNzaW9uTWFwW2VsXSkpKSB7DQogICAgICAgICAgbWFya2V0aW5nLnB1c2goZWwpOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICAgIHRoaXMuZm9ybVZhbGlkYXRlLmFjdGl2aXR5ID0gbWFya2V0aW5nOw0KICAgIH0sDQogIH0sDQp9Ow0K"},{"version":3,"sources":["index.vue"],"names":[],"mappings":";AAgUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/pages/product/productAdd","sourcesContent":["<template>\r\n <div class=\"\" id=\"shopp-manager\" v-loading=\"spinShow\">\r\n <pages-header\r\n ref=\"pageHeader\"\r\n :title=\"$route.params.id ? '编辑商品' : '添加商品'\"\r\n :backUrl=\"$routeProStr + '/product/product_list'\"\r\n ></pages-header>\r\n <el-card :bordered=\"false\" shadow=\"never\" class=\"mt16\" :body-style=\"{ padding: '0px 20px' }\">\r\n <el-tabs v-model=\"currentTab\">\r\n <el-tab-pane v-for=\"(item, index) in headTab\" :key=\"index\" :label=\"item.tit\" :name=\"item.name\"></el-tab-pane>\r\n </el-tabs>\r\n <el-form\r\n class=\"formValidate mt20\"\r\n ref=\"formValidate\"\r\n :rules=\"ruleValidate\"\r\n :model=\"formValidate\"\r\n :label-width=\"labelWidth\"\r\n :label-position=\"labelPosition\"\r\n @submit.native.prevent\r\n >\r\n <!-- 基础信息-->\r\n <basic-info\r\n v-show=\"currentTab === '1'\"\r\n :isCai=\"type\"\r\n :formValidate=\"formValidate\"\r\n :goodsType=\"goodsType\"\r\n :treeSelect=\"treeSelect\"\r\n :tileLabelList=\"tileLabelList\"\r\n :progress=\"progress\"\r\n :upload=\"upload\"\r\n :videoIng=\"videoIng\"\r\n @virtualbtn=\"virtualbtn\"\r\n @handleDragStart=\"handleDragStart\"\r\n @handleDragOver=\"handleDragOver\"\r\n @handleDragEnter=\"handleDragEnter\"\r\n @handleDragEnd=\"handleDragEnd\"\r\n @handleRemove=\"handleRemove\"\r\n @modalPicTap=\"modalPicTap\"\r\n @addVideo=\"addVideo\"\r\n @delVideo=\"delVideo\"\r\n @addCate=\"addCate\"\r\n @addGoodsTag=\"addGoodsTag\"\r\n ></basic-info>\r\n\r\n <!-- 规格库存-->\r\n <spec-stock\r\n ref=\"specStock\"\r\n v-show=\"currentTab === '2'\"\r\n :formValidate=\"formValidate\"\r\n :ruleList=\"ruleList\"\r\n :attrs=\"attrs\"\r\n :manyFormValidate=\"manyFormValidate\"\r\n :oneFormValidate=\"oneFormValidate\"\r\n :tableKey=\"tableKey\"\r\n :oneFormBatch=\"oneFormBatch\"\r\n :formDynamic=\"formDynamic\"\r\n :canSel=\"canSel\"\r\n @changeSpec=\"changeSpec\"\r\n @confirm=\"confirm\"\r\n @onMoveSpec=\"onMoveSpec\"\r\n @changeCurrentIndex=\"changeCurrentIndex\"\r\n @handleRemoveRole=\"handleRemoveRole\"\r\n @attrChangeValue=\"attrChangeValue\"\r\n @handleFocus=\"handleFocus\"\r\n @addPic=\"addPic\"\r\n @handleRemove2=\"handleRemove2\"\r\n @attrDetailChangeValue=\"attrDetailChangeValue\"\r\n @handleBlur=\"handleBlur\"\r\n @handleSelImg=\"handleSelImg\"\r\n @handleRemoveImg=\"handleRemoveImg\"\r\n @handleShowPop=\"handleShowPop\"\r\n @createAttr=\"createAttr\"\r\n @handleAddRole=\"handleAddRole\"\r\n @handleSaveAsTemplate=\"handleSaveAsTemplate\"\r\n @batchAdd=\"batchAdd\"\r\n @batchDel=\"batchDel\"\r\n @modalPicTap=\"modalPicTap\"\r\n @changeDefaultSelect=\"changeDefaultSelect\"\r\n @changeDefaultShow=\"changeDefaultShow\"\r\n @addGoodsCoupon=\"addGoodsCoupon\"\r\n @see=\"see\"\r\n @addVirtual=\"addVirtual\"\r\n ></spec-stock>\r\n\r\n <!-- 商品详情-->\r\n <product-detail\r\n v-show=\"currentTab === '3'\"\r\n :contents=\"contents\"\r\n :content=\"content\"\r\n @getEditorContent=\"getEditorContent\"\r\n ></product-detail>\r\n\r\n <!-- 物流设置-->\r\n <logistics-setting\r\n v-show=\"headTab.length === 7 ? currentTab === '4' : false\"\r\n :formValidate=\"formValidate\"\r\n :templateList=\"templateList\"\r\n @logisticsBtn=\"logisticsBtn\"\r\n @addTemp=\"addTemp\"\r\n ></logistics-setting>\r\n\r\n <!-- 会员价/佣金 -->\r\n <price-commission\r\n v-show=\"headTab.length === 7 ? currentTab === '5' : currentTab === '4'\"\r\n :formValidate=\"formValidate\"\r\n :oneFormValidate=\"oneFormValidate\"\r\n :manyFormValidate=\"manyFormValidate\"\r\n :columnsInstall=\"columnsInstall\"\r\n :columnsInstal2=\"columnsInstal2\"\r\n :manyBrokerage.sync=\"manyBrokerage\"\r\n :manyBrokerageTwo.sync=\"manyBrokerageTwo\"\r\n :manyVipPrice.sync=\"manyVipPrice\"\r\n :manyVipDiscount.sync=\"manyVipDiscount\"\r\n @checkAllGroupChange=\"checkAllGroupChange\"\r\n @changeVipPrice=\"changeVipPrice\"\r\n @changeDiscount=\"changeDiscount\"\r\n @brokerageSetUp=\"brokerageSetUp\"\r\n ></price-commission>\r\n\r\n <!-- 营销设置-->\r\n <marketing-setting\r\n v-show=\"headTab.length === 7 ? currentTab === '6' : currentTab === '5'\"\r\n :formValidate=\"formValidate\"\r\n :couponName=\"couponName\"\r\n :dataLabel=\"dataLabel\"\r\n :activity=\"activity\"\r\n @handleClose=\"handleClose\"\r\n @addCoupon=\"addCoupon\"\r\n @openLabel=\"openLabel\"\r\n @closeLabel=\"closeLabel\"\r\n @addLabel=\"addLabel\"\r\n @onchangeTime=\"onchangeTime\"\r\n @handleRemoveRecommend=\"handleRemoveRecommend\"\r\n @changeGoods=\"changeGoods\"\r\n ></marketing-setting>\r\n\r\n <!-- 其他设置-->\r\n <other-setting\r\n v-show=\"headTab.length === 7 ? currentTab === '7' : currentTab === '6'\"\r\n :formValidate=\"formValidate\"\r\n :customBtn.sync=\"customBtn\"\r\n :paramsType=\"paramsType\"\r\n :paramsTypeList=\"paramsTypeList\"\r\n :protectionList=\"protectionList\"\r\n :CustomList=\"CustomList\"\r\n @modalPicTap=\"modalPicTap\"\r\n @changeParamsType=\"changeParamsType\"\r\n @deleteRow=\"deleteRow\"\r\n @handleAddParams=\"handleAddParams\"\r\n @addProtection=\"addProtection\"\r\n @customMessBtn=\"customMessBtn\"\r\n @delcustom=\"delcustom\"\r\n @addcustom=\"addcustom\"\r\n ></other-setting>\r\n\r\n <el-form-item>\r\n <el-button v-if=\"currentTab !== '1'\" v-db-click @click=\"upTab\">上一步</el-button>\r\n <el-button\r\n class=\"submission\"\r\n v-if=\"currentTab !== '7' && formValidate.virtual_type == 0\"\r\n v-db-click\r\n @click=\"downTab\"\r\n >下一步</el-button\r\n >\r\n <el-button\r\n class=\"submission\"\r\n v-if=\"currentTab !== '6' && formValidate.virtual_type != 0\"\r\n v-db-click\r\n @click=\"downTab\"\r\n >下一步</el-button\r\n >\r\n <el-button\r\n type=\"primary\"\r\n class=\"submission\"\r\n v-db-click\r\n @click=\"handleSubmit('formValidate')\"\r\n v-if=\"$route.params.id || currentTab !== '1'\"\r\n >保存</el-button\r\n >\r\n </el-form-item>\r\n </el-form>\r\n <el-dialog :visible.sync=\"modalPic\" width=\"950px\" scrollable title=\"上传商品图\" :close-on-click-modal=\"false\">\r\n <uploadPictures\r\n :isChoice=\"isChoice\"\r\n @getPic=\"getPic\"\r\n @getPicD=\"getPicD\"\r\n :gridBtn=\"gridBtn\"\r\n :gridPic=\"gridPic\"\r\n v-if=\"modalPic\"\r\n ></uploadPictures>\r\n </el-dialog>\r\n <el-dialog\r\n :visible.sync=\"addVirtualModel\"\r\n width=\"720px\"\r\n title=\"添加卡密\"\r\n :show-close=\"true\"\r\n :close-on-click-modal=\"false\"\r\n @closed=\"initVirtualData\"\r\n >\r\n <div class=\"trip\"></div>\r\n <div class=\"type-radio\">\r\n <el-form label-width=\"85px\">\r\n <el-form-item label=\"卡密类型:\">\r\n <el-radio-group v-model=\"disk_type\" size=\"large\">\r\n <el-radio :label=\"1\">固定卡密</el-radio>\r\n <el-radio :label=\"2\">一次性卡密</el-radio>\r\n </el-radio-group>\r\n <div v-if=\"disk_type == 1\">\r\n <div class=\"stock-disk\">\r\n <el-input v-model=\"disk_info\" size=\"large\" type=\"textarea\" :rows=\"4\" placeholder=\"填写卡密信息\" />\r\n </div>\r\n <div class=\"stock-input\">\r\n <!-- <el-input type=\"number\" v-model=\"stock\" size=\"large\" :min='0' placeholder=\"填写库存数量\">\r\n <span slot=\"append\">件</span>\r\n </el-input> -->\r\n <el-input-number :controls=\"false\" :max=\"100000\" :min=\"1\" :step=\"1\" :precision=\"0\" v-model=\"stock\" />\r\n <span class=\"pl10\">件</span>\r\n </div>\r\n </div>\r\n <div class=\"scroll-virtual\" v-if=\"disk_type == 2\">\r\n <div class=\"virtual-data mb10\" v-for=\"(item, index) in virtualList\" :key=\"index\">\r\n <span class=\"mr10 virtual-title\">卡号{{ index + 1 }}:</span>\r\n <el-input\r\n class=\"mr10\"\r\n type=\"text\"\r\n v-model.trim=\"item.key\"\r\n style=\"width: 150px\"\r\n placeholder=\"请输入卡号(非必填)\"\r\n ></el-input>\r\n <span class=\"mr10 virtual-title\">卡密{{ index + 1 }}:</span>\r\n <el-input\r\n class=\"mr10\"\r\n type=\"text\"\r\n v-model.trim=\"item.value\"\r\n style=\"width: 150px\"\r\n placeholder=\"请输入卡密\"\r\n ></el-input>\r\n <span class=\"deteal-btn\" v-db-click @click=\"removeVirtual(index)\">删除</span>\r\n </div>\r\n </div>\r\n <div class=\"add-more\" v-if=\"disk_type == 2\">\r\n <el-button class=\"h-33\" type=\"primary\" v-db-click @click=\"handleAdd\">新增</el-button>\r\n <el-upload\r\n class=\"ml10\"\r\n :action=\"cardUrl\"\r\n :data=\"uploadData\"\r\n :headers=\"header\"\r\n :on-success=\"upFile\"\r\n :before-upload=\"beforeUpload\"\r\n >\r\n <el-button>导入卡密</el-button>\r\n </el-upload>\r\n </div>\r\n </el-form-item>\r\n </el-form>\r\n </div>\r\n <span slot=\"footer\" class=\"dialog-footer\">\r\n <el-button v-db-click @click=\"closeVirtual\">取 消</el-button>\r\n <el-button type=\"primary\" v-db-click @click=\"upVirtual\">确 定</el-button>\r\n </span>\r\n </el-dialog>\r\n </el-card>\r\n <freightTemplate\r\n :template=\"template\"\r\n v-on:changeTemplate=\"changeTemplate\"\r\n @addSuccess=\"productGetTemplate\"\r\n ref=\"templates\"\r\n ></freightTemplate>\r\n <add-attr ref=\"addattr\" @getList=\"userSearchs\"></add-attr>\r\n <coupon-list\r\n ref=\"couponTemplates\"\r\n @nameId=\"nameId\"\r\n :couponids=\"formValidate.coupon_ids\"\r\n :updateIds=\"updateIds\"\r\n :updateName=\"updateName\"\r\n ></coupon-list>\r\n <coupon-list ref=\"goodsCoupon\" many=\"one\" :luckDraw=\"true\" @getCouponId=\"goodsCouponId\"></coupon-list>\r\n <!-- 生成淘宝京东表单-->\r\n <el-dialog\r\n :visible.sync=\"modals\"\r\n @closed=\"cancel\"\r\n class=\"Box\"\r\n title=\"复制淘宝、天猫、京东、苏宁、1688\"\r\n :close-on-click-modal=\"false\"\r\n width=\"720px\"\r\n >\r\n <tao-bao ref=\"taobaos\" v-if=\"modals\" @on-close=\"onClose\"></tao-bao>\r\n </el-dialog>\r\n <el-dialog :visible.sync=\"goods_modals\" title=\"商品列表\" footerHide class=\"paymentFooter\" scrollable width=\"1000px\">\r\n <goods-list v-if=\"goods_modals\" ref=\"goodslist\" :ischeckbox=\"true\" @getProductId=\"getProductId\"></goods-list>\r\n </el-dialog>\r\n <!-- 用户标签 -->\r\n <el-dialog\r\n :visible.sync=\"labelShow\"\r\n title=\"请选择用户标签\"\r\n :show-close=\"true\"\r\n width=\"540px\"\r\n :close-on-click-modal=\"false\"\r\n >\r\n <userLabel ref=\"userLabel\" @activeData=\"activeData\" @close=\"labelClose\"></userLabel>\r\n </el-dialog>\r\n <!-- 商品标签 -->\r\n <el-dialog\r\n :visible.sync=\"tagShow\"\r\n title=\"请选择商品标签\"\r\n :show-close=\"true\"\r\n width=\"540px\"\r\n :close-on-click-modal=\"false\"\r\n >\r\n <goodsLabel\r\n ref=\"goodsLabel\"\r\n :defaultLabelList=\"labelList\"\r\n @activeLabel=\"activeLabel\"\r\n @close=\"labelClose\"\r\n ></goodsLabel>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport userLabel from '@/components/labelList';\r\nimport useLabel from '@/components/goodsLabel/useLabel';\r\nimport goodsLabel from '@/components/goodsLabel';\r\nimport { mapState } from 'vuex';\r\nimport uploadPictures from '@/components/uploadPictures';\r\nimport freightTemplate from '@/components/freightTemplate';\r\nimport couponList from '@/components/couponList';\r\nimport addAttr from '../productAttr/addAttr';\r\nimport goodsList from '@/components/goodsList/index';\r\nimport taoBao from './taoBao';\r\nimport { userLabelAddApi } from '@/api/user';\r\nimport {\r\n productInfoApi,\r\n cascaderListApi,\r\n productAddApi,\r\n generateAttrApi,\r\n productGetRuleApi,\r\n productGetTemplateApi,\r\n productGetTempKeysApi,\r\n checkActivityApi,\r\n productCache,\r\n cacheDelete,\r\n uploadType,\r\n importCard,\r\n productCreateApi,\r\n getProductTypeConfig,\r\n ruleAddApi,\r\n paramListApi,\r\n paramInfoApi,\r\n productProtectionListApi,\r\n productLabelUseListApi,\r\n} from '@/api/product';\r\nimport Setting from '@/setting';\r\nimport { getCookies } from '@/libs/util';\r\nimport { uploadByPieces } from '@/utils/upload'; //引入uploadByPieces方法\r\nimport { isFileUpload, isVideoUpload, arraysEqual } from '@/utils';\r\nimport checkArray from '@/libs/permission';\r\nimport {\r\n GoodsTableHead,\r\n VirtualTableHead,\r\n VirtualTableHead2,\r\n columns2,\r\n columns3,\r\n CustomList,\r\n RuleValidate,\r\n} from './defaultData.js';\r\nimport BasicInfo from './components/BasicInfo.vue';\r\nimport SpecStock from './components/SpecStock.vue';\r\nimport ProductDetail from './components/ProductDetail.vue';\r\nimport LogisticsSetting from './components/LogisticsSetting.vue';\r\nimport PriceCommission from './components/PriceCommission.vue';\r\nimport MarketingSetting from './components/MarketingSetting.vue';\r\nimport OtherSetting from './components/OtherSetting.vue';\r\nimport { formatRichText } from '@/utils/editorImg';\r\n\r\nexport default {\r\n name: 'ProductAdd',\r\n components: {\r\n uploadPictures,\r\n freightTemplate,\r\n addAttr,\r\n couponList,\r\n taoBao,\r\n goodsList,\r\n userLabel,\r\n goodsLabel,\r\n useLabel,\r\n BasicInfo,\r\n SpecStock,\r\n ProductDetail,\r\n LogisticsSetting,\r\n PriceCommission,\r\n MarketingSetting,\r\n OtherSetting,\r\n },\r\n data() {\r\n return {\r\n labelShow: false,\r\n tagShow: false,\r\n dataLabel: [],\r\n headTab: [\r\n { tit: '基础信息', name: '1' },\r\n { tit: '规格库存', name: '2' },\r\n { tit: '商品详情', name: '3' },\r\n { tit: '物流设置', name: '4' },\r\n { tit: '会员价/佣金', name: '5' },\r\n { tit: '营销设置', name: '6' },\r\n { tit: '其他设置', name: '7' },\r\n ],\r\n virtual: [\r\n { tit: '普通商品', id: 0, tit2: '物流发货' },\r\n { tit: '卡密/网盘', id: 1, tit2: '自动发货' },\r\n { tit: '优惠券', id: 2, tit2: '自动发货' },\r\n { tit: '虚拟商品', id: 3, tit2: '虚拟发货' },\r\n ],\r\n seletVideo: 0, //选择视频类型\r\n customBtn: 0, //自定义留言开关\r\n content: '',\r\n contents: '',\r\n fileUrl: Setting.apiBaseURL + '/file/upload',\r\n fileUrl2: Setting.apiBaseURL + '/file/video_upload',\r\n cardUrl: Setting.apiBaseURL + '/file/upload/1',\r\n upload_type: '', //视频上传类型 1 本地上传 2 3 4 OSS上传\r\n uploadData: {}, // 上传参数\r\n header: {},\r\n type: 0,\r\n modals: false,\r\n goods_modals: false,\r\n spinShow: false,\r\n openSubimit: false,\r\n virtualList: [\r\n {\r\n key: '',\r\n value: '',\r\n },\r\n ],\r\n // 批量设置表格data\r\n oneFormBatch: [\r\n {\r\n pic: '',\r\n price: void 0,\r\n cost: void 0,\r\n ot_price: void 0,\r\n stock: void 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n weight: void 0,\r\n volume: void 0,\r\n virtual_list: [],\r\n },\r\n ],\r\n\r\n // 规格数据\r\n formDynamic: {\r\n attrsName: '',\r\n attrsVal: '',\r\n },\r\n disk_type: 1, //卡密类型\r\n tabIndex: 0,\r\n tabName: '',\r\n formDynamicNameData: [],\r\n isBtn: false,\r\n columns2: columns2,\r\n columns3: columns3,\r\n columns: [],\r\n columnsInstall: [],\r\n columnsInstal2: [],\r\n gridPic: {\r\n xl: 6,\r\n lg: 8,\r\n md: 12,\r\n sm: 12,\r\n xs: 12,\r\n },\r\n gridBtn: {\r\n xl: 4,\r\n lg: 8,\r\n md: 8,\r\n sm: 8,\r\n xs: 8,\r\n },\r\n //自定义留言下拉选择\r\n CustomList: CustomList,\r\n //自定义留言内容\r\n currentIndex: 0,\r\n\r\n formValidate: {\r\n share: 0,\r\n is_pack: 0,//是否报单\r\n disk_info: '', //卡密类型\r\n logistics: ['1'], //选择物流方式\r\n freight: 2, //运费设置\r\n postage: 0, //设置运费金额\r\n recommend: [], //商品推荐\r\n presale_day: 1, //预售发货时间-结束\r\n presale: false, //预售商品开关\r\n is_limit: false,\r\n limit_type: 0,\r\n limit_num: 0,\r\n vip_product: false, //付费会员专属开关\r\n custom_form: [], //自定义留言\r\n store_name: '',\r\n cate_id: [],\r\n label_id: [],\r\n keyword: '',\r\n unit_name: '',\r\n store_info: '',\r\n image: '',\r\n recommend_image: '',\r\n slider_image: [],\r\n description: '',\r\n ficti: 0,\r\n give_integral: 0,\r\n sort: 0,\r\n is_show: 1,\r\n is_gift: 0, // 开启送礼品\r\n gift_price: 0,\r\n is_hot: 0,\r\n is_benefit: 0,\r\n is_best: 0,\r\n is_new: 0,\r\n is_good: 0,\r\n is_postage: 0,\r\n is_sub: [],\r\n recommend_list: [],\r\n params_list: [], //商品参数\r\n virtual_type: 0,\r\n // is_sub: 0,\r\n id: 0,\r\n spec_type: 0,\r\n is_virtual: 0,\r\n video_link: '',\r\n // postage: 0,\r\n temp_id: '',\r\n attrs: [],\r\n items: [\r\n {\r\n pic: '',\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n },\r\n ],\r\n activity: ['默认', '秒杀', '砍价', '拼团'],\r\n couponName: [],\r\n header: [],\r\n selectRule: '',\r\n coupon_ids: [],\r\n command_word: '',\r\n min_qty: 1,\r\n label_list: [],\r\n protection_list: [],\r\n },\r\n ruleList: [],\r\n templateList: [],\r\n createBnt: true,\r\n showIput: false,\r\n manyFormValidate: [],\r\n // 单规格表格data\r\n oneFormValidate: [\r\n {\r\n pic: '',\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n weight: 0,\r\n volume: 0,\r\n brokerage: 0,\r\n brokerage_two: 0,\r\n vip_price: 0,\r\n virtual_list: [],\r\n coupon_id: 0,\r\n },\r\n ],\r\n images: [],\r\n imagesTable: '',\r\n currentTab: '1',\r\n isChoice: '',\r\n loading: false,\r\n modalPic: false,\r\n addVirtualModel: false,\r\n template: false,\r\n uploadList: [],\r\n treeSelect: [],\r\n picTit: '',\r\n tableIndex: 0,\r\n ruleValidate: RuleValidate,\r\n manyBrokerage: undefined,\r\n manyBrokerageTwo: undefined,\r\n manyVipPrice: undefined,\r\n manyVipDiscount: undefined,\r\n upload: {\r\n videoIng: false, // 是否显示进度条;\r\n },\r\n videoIng: false, // 是否显示进度条;\r\n progress: 0, // 进度条默认0\r\n stock: 0,\r\n disk_info: '',\r\n videoLink: '',\r\n attrs: [],\r\n activity: { 默认: 'red', 秒杀: 'blue', 砍价: 'green', 拼团: 'yellow' },\r\n couponName: [],\r\n updateIds: [],\r\n updateName: [],\r\n couponIds: '',\r\n couponNames: [],\r\n rakeBack: [\r\n {\r\n title: '一级返佣(元)',\r\n slot: 'brokerage',\r\n align: 'center',\r\n width: 95,\r\n },\r\n {\r\n title: '二级返佣(元)',\r\n slot: 'brokerage_two',\r\n align: 'center',\r\n width: 95,\r\n },\r\n ],\r\n member: [\r\n {\r\n title: '会员价',\r\n slot: 'vip_price',\r\n align: 'center',\r\n width: 95,\r\n },\r\n {\r\n title: '会员折扣',\r\n slot: 'vip_proportion',\r\n align: 'center',\r\n width: 95,\r\n },\r\n ],\r\n columnsInstalM: [],\r\n moveIndex: '',\r\n addValue: '',\r\n visible: false,\r\n typeConfig: [],\r\n goodsType: [],\r\n paramsTypeList: [],\r\n paramsType: null,\r\n canSel: true, // 规格图片添加判断\r\n changeAttrValue: '', //修改的规格值\r\n tableKey: 0,\r\n protectionList: [], // 服务保障\r\n labelList: [],\r\n tileLabelList: [],\r\n };\r\n },\r\n computed: {\r\n ...mapState('media', ['isMobile']),\r\n labelWidth() {\r\n return this.isMobile ? undefined : '120px';\r\n },\r\n labelPosition() {\r\n return this.isMobile ? 'top' : 'right';\r\n },\r\n labelBottom() {\r\n return this.isMobile ? undefined : '15px';\r\n },\r\n },\r\n watch: {\r\n typeConfig(val) {\r\n if (val.length) {\r\n // 对virtual中的id等于val中的id的\r\n this.goodsType = this.virtual.filter((item) => {\r\n return val.includes(item.id + '');\r\n });\r\n } else {\r\n this.goodsType = this.virtual;\r\n }\r\n },\r\n },\r\n beforeRouteUpdate(to, from, next) {\r\n this.bus.$emit('onTagsViewRefreshRouterView', this.$route.path);\r\n next();\r\n },\r\n created() {\r\n this.columns = this.columns2.slice(0, 8);\r\n this.getToken();\r\n },\r\n async mounted() {\r\n if (this.$route.params.id !== '0' && this.$route.params.id) {\r\n await this.getInfo();\r\n } else if (this.$route.params.id === '0') {\r\n this.getProductCache();\r\n } else {\r\n this.getproductLabelUseListApi();\r\n }\r\n if (this.$route.query.type) {\r\n this.modals = true;\r\n this.type = this.$route.query.type;\r\n } else {\r\n this.type = 0;\r\n }\r\n this.goodsCategory();\r\n this.productGetRule();\r\n this.productGetTemplate();\r\n this.paramsGetTemplate();\r\n this.uploadType();\r\n this.productConfig();\r\n this.watchActivity();\r\n this.getProtectionList();\r\n },\r\n methods: {\r\n getProductCache() {\r\n productCache()\r\n .then((res) => {\r\n let data = res.data.info;\r\n this.getproductLabelUseListApi();\r\n\r\n if (!Array.isArray(data)) {\r\n let cate_id = data.cate_id.map(Number);\r\n let label_id = data.label_id.map(Number);\r\n this.attrs = data.items || [];\r\n let ids = [];\r\n if (data.coupons) {\r\n data.coupons.map((item) => {\r\n ids.push(item.id);\r\n });\r\n this.couponName = data.coupons;\r\n }\r\n\r\n this.formValidate = data;\r\n this.dataLabel = data.label_id;\r\n this.formValidate.coupon_ids = ids;\r\n this.updateIds = ids;\r\n this.updateName = data.coupons;\r\n this.formValidate.cate_id = cate_id;\r\n this.oneFormValidate = data.attrs;\r\n this.generateHeader(this.attrs);\r\n this.formValidate.logistics = data.logistics || ['1'];\r\n this.formValidate.header = [];\r\n this.manyFormValidate = data.attrs;\r\n this.spec_type = data.spec_type;\r\n this.formValidate.is_virtual = data.is_virtual;\r\n this.formValidate.custom_form = data.custom_form || [];\r\n if (this.formValidate.custom_form.length != 0) {\r\n this.customBtn = 1;\r\n }\r\n this.attrs.map((item) => {\r\n if (item.add_pic) this.canSel = false;\r\n });\r\n this.virtualbtn(data.virtual_type, 1);\r\n if (data.spec_type === 0) {\r\n this.manyFormValidate = [];\r\n } else {\r\n this.createBnt = true;\r\n this.oneFormValidate = [\r\n {\r\n pic: data.image,\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n weight: 0,\r\n volume: 0,\r\n brokerage: 0,\r\n brokerage_two: 0,\r\n vip_price: 0,\r\n virtual_list: [],\r\n coupon_id: 0,\r\n },\r\n ];\r\n }\r\n this.watchActivity();\r\n this.spinShow = false;\r\n }\r\n })\r\n .catch((err) => {\r\n this.$message.error(err.msg);\r\n });\r\n },\r\n getProtectionList() {\r\n productProtectionListApi({ page: 0, limit: 0, status: 1 }).then((res) => {\r\n this.protectionList = res.data.list;\r\n });\r\n },\r\n getproductLabelUseListApi() {\r\n productLabelUseListApi().then((res) => {\r\n // 合并数组中所有的list\r\n this.tileLabelList = res.data.flatMap((item) => item.list);\r\n let labelList = res.data;\r\n if (this.formValidate.label_list.length) {\r\n this.formValidate.label_list.map((el) => {\r\n labelList.map((re) => {\r\n re.list.map((label) => {\r\n if (label.id === el) {\r\n label.active = true;\r\n } else {\r\n label.active = false;\r\n }\r\n });\r\n });\r\n });\r\n } else {\r\n labelList.map((el) => {\r\n el.list.map((label) => {\r\n label.active = false;\r\n });\r\n });\r\n }\r\n this.labelList = labelList;\r\n });\r\n },\r\n addProtection() {\r\n this.$router.push({ path: this.$routeProStr + '/product/protection/list' });\r\n },\r\n productConfig() {\r\n getProductTypeConfig().then((res) => {\r\n this.typeConfig = res.data;\r\n });\r\n },\r\n beforeUpload(file) {\r\n return isFileUpload(file);\r\n },\r\n // 分片上传\r\n videoSaveToUrl(file) {\r\n if (isVideoUpload(file)) {\r\n uploadByPieces({\r\n file: file, // 视频实体\r\n pieceSize: 3, // 分片大小\r\n success: (data) => {\r\n this.formValidate.video_link = data.file_path;\r\n this.progress = 100;\r\n },\r\n error: (e) => {\r\n this.$message.error(e.msg);\r\n },\r\n uploading: (chunk, allChunk) => {\r\n this.videoIng = true;\r\n let st = Math.floor((chunk / allChunk) * 100);\r\n this.progress = st;\r\n },\r\n });\r\n }\r\n return false;\r\n },\r\n // 类型选择/填入内容判断\r\n virtualbtn(index, type) {\r\n if (type != 1) {\r\n if (this.$route.params.id) return this.$message.error('编辑商品不支持切换商品类型');\r\n this.formValidate.is_sub = [];\r\n let id = this.$route.params.id;\r\n if (id) {\r\n checkActivityApi(id)\r\n .then((res) => {})\r\n .catch((res) => {\r\n this.formValidate.spec_type = this.spec_type;\r\n this.$message.error(res.msg);\r\n });\r\n } else {\r\n if (this.formValidate.spec_type == 1) {\r\n this.generate(1);\r\n }\r\n }\r\n }\r\n // 定义基础商品和虚拟商品的标签页配置\r\n const baseHeadTabs = [\r\n { tit: '基础信息', name: '1' },\r\n { tit: '规格库存', name: '2' },\r\n { tit: '商品详情', name: '3' },\r\n { tit: '物流设置', name: '4' },\r\n { tit: '会员价/佣金', name: '5' },\r\n { tit: '营销设置', name: '6' },\r\n { tit: '其他设置', name: '7' },\r\n ];\r\n const virtualHeadTabs = [\r\n { tit: '基础信息', name: '1' },\r\n { tit: '规格库存', name: '2' },\r\n { tit: '商品详情', name: '3' },\r\n { tit: '会员价/佣金', name: '4' },\r\n { tit: '营销设置', name: '5' },\r\n { tit: '其他设置', name: '6' },\r\n ];\r\n\r\n switch (index) {\r\n case 0: // 普通商品\r\n this.formValidate.virtual_type = 0;\r\n this.formValidate.is_virtual = 0;\r\n this.headTab = baseHeadTabs;\r\n break;\r\n\r\n case 1: // 卡密/网盘商品\r\n this.formValidate.virtual_type = 1;\r\n this.formValidate.postage = 0;\r\n this.formValidate.is_virtual = 1;\r\n this.headTab = virtualHeadTabs;\r\n break;\r\n\r\n case 2: // 优惠券商品\r\n this.formValidate.virtual_type = 2;\r\n this.formValidate.is_virtual = 1;\r\n this.headTab = virtualHeadTabs;\r\n break;\r\n\r\n case 3: // 虚拟商品\r\n this.formValidate.virtual_type = 3;\r\n this.formValidate.is_virtual = 1;\r\n this.headTab = virtualHeadTabs;\r\n break;\r\n }\r\n },\r\n // 新增分类\r\n addCate() {\r\n this.$modalForm(productCreateApi()).then(() => this.goodsCategory());\r\n },\r\n // 物流方式选择\r\n logisticsBtn(e) {\r\n this.formValidate.logistics = e;\r\n },\r\n // 新增标签\r\n addLabel() {\r\n this.$modalForm(userLabelAddApi(0)).then(() => this.userLabel());\r\n },\r\n // 选择标签\r\n addGoodsTag() {\r\n this.tagShow = true;\r\n },\r\n // 自定义留言 开启关闭\r\n customMessBtn(e) {\r\n if (!e) {\r\n this.formValidate.custom_form = [];\r\n }\r\n this.customBtn = e;\r\n },\r\n // 自定义留言 新增表单\r\n addcustom() {\r\n if (this.formValidate.custom_form.length > 9) {\r\n this.$message.warning('最多添加10条');\r\n } else {\r\n this.formValidate.custom_form.push({\r\n title: '',\r\n label: 'text',\r\n value: '',\r\n status: false,\r\n });\r\n }\r\n },\r\n // 删除\r\n delcustom(index) {\r\n this.formValidate.custom_form.splice(index, 1);\r\n },\r\n // 预售具体日期\r\n onchangeTime(e) {\r\n this.formValidate.presale_time = e;\r\n },\r\n // 商品详情\r\n getEditorContent(data) {\r\n this.content = data;\r\n },\r\n cancel() {\r\n this.modals = false;\r\n },\r\n // 上传头部token\r\n getToken() {\r\n this.header['Authori-zation'] = 'Bearer ' + getCookies('token');\r\n },\r\n // 导入卡密\r\n upFile(res) {\r\n importCard({ file: res.data.src }).then((res) => {\r\n this.virtualList = this.virtualList.concat(res.data);\r\n });\r\n },\r\n //获取视频上传类型\r\n uploadType() {\r\n uploadType().then((res) => {\r\n this.upload_type = res.data.upload_type;\r\n });\r\n },\r\n // 初始化数据展示\r\n infoData(data, isCopy) {\r\n let cate_id = data.cate_id.map(Number);\r\n let label_id = data.label_id.map(Number);\r\n this.attrs = data.items || [];\r\n let ids = [];\r\n data.coupons.map((item) => {\r\n ids.push(item.id);\r\n });\r\n this.formValidate = data;\r\n this.seletVideo = data.seletVideo;\r\n this.contents = data.description;\r\n this.couponName = data.coupons;\r\n this.formValidate.coupon_ids = ids;\r\n this.updateIds = ids;\r\n this.dataLabel = data.label_id;\r\n this.updateName = data.coupons;\r\n this.virtualbtn(data.virtual_type, 1);\r\n this.formValidate.logistics = data.logistics || ['1'];\r\n this.formValidate.custom_form = data.custom_form || [];\r\n if (this.formValidate.custom_form.length != 0) {\r\n this.customBtn = 1;\r\n }\r\n this.formValidate.cate_id = cate_id;\r\n if (data.attr) {\r\n this.oneFormValidate = [data.attr];\r\n this.oneFormValidate[0].vip_proportion = (\r\n (this.oneFormValidate[0].vip_price / this.oneFormValidate[0].price) *\r\n 100\r\n ).toFixed(2);\r\n }\r\n this.getproductLabelUseListApi();\r\n\r\n this.formValidate.header = [];\r\n this.spec_type = data.spec_type;\r\n this.formValidate.spec_type = this.spec_type;\r\n this.formValidate.is_virtual = data.is_virtual;\r\n this.attrs.map((item) => {\r\n if (item.add_pic) this.canSel = false;\r\n });\r\n if (data.spec_type === 0) {\r\n this.manyFormValidate = [];\r\n } else {\r\n this.createBnt = true;\r\n this.oneFormValidate = [\r\n {\r\n pic: '',\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n weight: 0,\r\n volume: 0,\r\n brokerage: 0,\r\n brokerage_two: 0,\r\n vip_price: 0,\r\n virtual_list: [],\r\n coupon_id: 0,\r\n },\r\n ];\r\n\r\n this.generateHeader(this.attrs);\r\n this.manyFormValidate = [...this.oneFormBatch, ...data.attrs];\r\n }\r\n\r\n setTimeout((e) => {\r\n this.checkAllGroup(data.is_sub);\r\n }, 1000);\r\n this.watchActivity();\r\n },\r\n //关闭淘宝弹窗并生成数据;\r\n onClose(data) {\r\n this.modals = false;\r\n this.infoData(data, 1);\r\n },\r\n\r\n checkMove(evt) {\r\n this.moveIndex = evt.draggedContext.index;\r\n },\r\n end() {\r\n this.moveIndex = '';\r\n this.generate(1);\r\n },\r\n // 单独设置会员设置\r\n checkAllGroupChange(data) {\r\n this.checkAllGroup(data);\r\n },\r\n checkAllGroup(data) {\r\n let endLength = this.attrs.length + 3;\r\n if (this.formValidate.spec_type === 0) {\r\n if (data.length === 2) {\r\n this.columnsInstall = this.columns2.slice(0, endLength).concat(this.rakeBack).concat(this.member);\r\n } else if (data.indexOf(0) > -1) {\r\n this.columnsInstall = this.columns2.slice(0, endLength).concat(this.member);\r\n } else if (data.indexOf(1) > -1) {\r\n this.columnsInstall = this.columns2.slice(0, endLength).concat(this.rakeBack);\r\n } else {\r\n this.columnsInstall = this.columns2.slice(0, endLength);\r\n }\r\n } else {\r\n if (data.length === 2) {\r\n this.columnsInstal2 = this.columnsInstalM\r\n .slice(0, endLength + 1)\r\n .concat(this.rakeBack)\r\n .concat(this.member);\r\n } else if (data.indexOf(0) > -1) {\r\n this.columnsInstal2 = this.columnsInstalM.slice(0, endLength).concat(this.member);\r\n } else if (data.indexOf(1) > -1) {\r\n this.columnsInstal2 = this.columnsInstalM.slice(0, endLength).concat(this.rakeBack);\r\n } else {\r\n this.columnsInstal2 = this.columnsInstalM.slice(0, endLength);\r\n }\r\n }\r\n },\r\n // 添加优惠券\r\n addCoupon() {\r\n this.$refs.couponTemplates.isTemplate = true;\r\n this.$refs.couponTemplates.tableList();\r\n },\r\n // 规格中优惠券查看\r\n see(data, name, index) {\r\n this.tabName = name;\r\n this.tabIndex = index;\r\n\r\n if (this.formValidate.virtual_type === 1) {\r\n if (data.disk_info != '') {\r\n this.disk_type = 1;\r\n this.disk_info = data.disk_info;\r\n this.stock = data.stock;\r\n } else if (data.virtual_list.length) {\r\n this.disk_type = 2;\r\n this.virtualList = data.virtual_list;\r\n }\r\n this.addVirtualModel = true;\r\n } else {\r\n this.$refs.goodsCoupon.isTemplate = true;\r\n this.$refs.goodsCoupon.tableList(3);\r\n }\r\n },\r\n // 修改分佣比例\r\n changeDiscount(index, type = 'manyFormValidate') {\r\n // 根据分佣比例 vip_proportion 修改会员价 保留2位小数\r\n this[type][index].vip_price = (this[type][index].price * (this[type][index].vip_proportion / 100)).toFixed(2);\r\n },\r\n // 修改会员价\r\n changeVipPrice(index, type = 'manyFormValidate') {\r\n // 根据会员价计算出分佣比例\r\n this[type][index].vip_proportion = ((this[type][index].vip_price / this[type][index].price) * 100).toFixed(2);\r\n },\r\n // 添加优惠券\r\n addGoodsCoupon(index, name) {\r\n this.tabIndex = index;\r\n this.tabName = name;\r\n this.$refs.goodsCoupon.isTemplate = true;\r\n this.$refs.goodsCoupon.tableList(3);\r\n },\r\n addVirtual(index, name) {\r\n this.tabIndex = index;\r\n this.tabName = name;\r\n this.addVirtualModel = true;\r\n },\r\n // 提交卡密信息\r\n upVirtual() {\r\n if (this.disk_type == 2) {\r\n for (let i = 0; i < this.virtualList.length; i++) {\r\n const element = this.virtualList[i];\r\n if (!element.value) {\r\n this.$message.error('请输入所有卡密');\r\n return;\r\n }\r\n }\r\n this.$set(this[this.tabName][this.tabIndex], 'virtual_list', this.virtualList);\r\n this.$set(this[this.tabName][this.tabIndex], 'stock', this.virtualList.length);\r\n this.virtualList = [\r\n {\r\n key: '',\r\n value: '',\r\n },\r\n ];\r\n this.$set(this[this.tabName][this.tabIndex], 'disk_info', '');\r\n } else {\r\n if (!this.disk_info.length) {\r\n return this.$message.error('请填写卡密信息');\r\n }\r\n if (!this.stock) {\r\n return this.$message.error('请填写库存数量');\r\n }\r\n this.$set(this[this.tabName][this.tabIndex], 'stock', Number(this.stock));\r\n this.$set(this[this.tabName][this.tabIndex], 'stock', Number(this.stock));\r\n this.$set(this[this.tabName][this.tabIndex], 'disk_info', this.disk_info);\r\n this.$set(this[this.tabName][this.tabIndex], 'virtual_list', []);\r\n }\r\n this.addVirtualModel = false;\r\n this.closeVirtual();\r\n },\r\n // 初始化卡密数据信息\r\n closeVirtual() {\r\n this.addVirtualModel = false;\r\n this.virtualList = [\r\n {\r\n key: '',\r\n value: '',\r\n },\r\n ];\r\n this.disk_info = '';\r\n this.stock = 0;\r\n },\r\n //对象数组去重;\r\n uniqueArray(arr) {\r\n const seen = {};\r\n return arr.filter((item) => {\r\n const key = JSON.stringify(item); // 使用 JSON.stringify 生成唯一键\r\n if (seen[key]) {\r\n return false;\r\n } else {\r\n seen[key] = true;\r\n return true;\r\n }\r\n });\r\n },\r\n // 获取优惠券id数据\r\n nameId(id, names) {\r\n this.formValidate.coupon_ids = id;\r\n this.couponName = this.uniqueArray(names);\r\n },\r\n // 获取优惠券信息\r\n goodsCouponId(data) {\r\n this.$set(this[this.tabName][this.tabIndex], 'coupon_id', data.id);\r\n this.$set(this[this.tabName][this.tabIndex], 'coupon_name', data.title);\r\n this.$refs.goodsCoupon.isTemplate = false;\r\n },\r\n handleClose(name) {\r\n let index = this.couponName.indexOf(name);\r\n this.couponName.splice(index, 1);\r\n let couponIds = this.formValidate.coupon_ids;\r\n couponIds.splice(index, 1);\r\n this.updateIds = couponIds;\r\n this.updateName = this.couponName;\r\n },\r\n // 添加运费模板\r\n addTemp() {\r\n this.$refs.templates.isTemplate = true;\r\n },\r\n addVideo() {\r\n this.$videoModal((e) => {\r\n this.formValidate.video_link = e;\r\n });\r\n },\r\n // 删除视频;\r\n delVideo() {\r\n this.$set(this.formValidate, 'video_link', '');\r\n this.$set(this, 'progress', 0);\r\n this.videoIng = false;\r\n this.upload.videoIng = false;\r\n },\r\n zh_uploadFile() {\r\n if (this.seletVideo == 1) {\r\n this.formValidate.video_link = this.videoLink;\r\n } else {\r\n this.$refs.refid.click();\r\n }\r\n },\r\n // 上传视频\r\n zh_uploadFile_change(evfile) {\r\n let suffix = evfile.target.files[0].name.substr(evfile.target.files[0].name.indexOf('.'));\r\n if (suffix.indexOf('.mp4') === -1) {\r\n return this.$message.error('只能上传MP4文件');\r\n }\r\n let types = {\r\n key: evfile.target.files[0].name,\r\n contentType: evfile.target.files[0].type,\r\n };\r\n productGetTempKeysApi(types)\r\n .then((res) => {\r\n this.$videoCloud\r\n .videoUpload({\r\n type: res.data.type,\r\n evfile: evfile,\r\n res: res,\r\n uploading(status, progress) {\r\n this.upload.videoIng = status;\r\n if (res.status == 200) {\r\n this.progress = 100;\r\n }\r\n },\r\n })\r\n .then((res) => {\r\n this.formValidate.video_link = res.url;\r\n this.$message.success('视频上传成功');\r\n this.upload.videoIng = false;\r\n })\r\n .catch((res) => {\r\n this.$message.error(res);\r\n });\r\n })\r\n .catch((res) => {\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 上一页;\r\n upTab() {\r\n this.currentTab = (Number(this.currentTab) - 1).toString();\r\n },\r\n // 下一页;\r\n downTab() {\r\n this.currentTab = (Number(this.currentTab) + 1).toString();\r\n },\r\n // 属性弹窗回调函数;\r\n userSearchs() {\r\n this.productGetRule();\r\n },\r\n // 添加规则;\r\n addRule() {\r\n this.$refs.addattr.modal = true;\r\n },\r\n // 批量设置分佣;\r\n brokerageSetUp() {\r\n if (this.formValidate.is_sub.indexOf(1) > -1) {\r\n if (this.manyBrokerage <= 0 || this.manyBrokerageTwo <= 0) {\r\n return this.$message.error('请填写返佣金额后进行批量添加');\r\n }\r\n } else if (this.formValidate.is_sub.indexOf(0) > -1) {\r\n if (this.manyVipPrice <= 0) {\r\n return this.$message.error('请填写会员价后进行批量添加');\r\n }\r\n }\r\n if (this.formValidate.is_sub.length === 2) {\r\n if (this.manyBrokerage <= 0 || this.manyBrokerageTwo <= 0) {\r\n return this.$message.error('请填写完金额后进行批量添加');\r\n }\r\n if (this.manyVipPrice > 0 && this.manyVipDiscount > 0) {\r\n return this.$message.error('会员价和会员折扣只能二选一添加');\r\n }\r\n }\r\n for (let val of this.manyFormValidate) {\r\n this.manyBrokerage != undefined && this.$set(val, 'brokerage', this.manyBrokerage);\r\n this.manyBrokerageTwo != undefined && this.$set(val, 'brokerage_two', this.manyBrokerageTwo);\r\n if (this.manyVipPrice != undefined) {\r\n this.$set(val, 'vip_price', this.manyVipPrice);\r\n this.$set(val, 'vip_proportion', ((val.vip_price / val.price) * 100).toFixed(2));\r\n } else {\r\n this.$set(val, 'vip_proportion', this.manyVipDiscount);\r\n this.$set(val, 'vip_price', (val.price * (this.manyVipDiscount / 100)).toFixed(2));\r\n }\r\n }\r\n },\r\n // 批量设置会员价\r\n vipPriceSetUp() {\r\n if (this.manyVipPrice <= 0) {\r\n return this.$message.error('请填写会员价在进行批量添加');\r\n } else {\r\n for (let val of this.manyFormValidate) {\r\n this.$set(val, 'vip_price', this.manyVipPrice);\r\n }\r\n }\r\n },\r\n // 新增卡密\r\n handleAdd() {\r\n this.virtualList.push({\r\n key: '',\r\n value: '',\r\n });\r\n },\r\n // 初始化卡密信息\r\n initVirtualData(status) {\r\n this.virtualList = [\r\n {\r\n key: '',\r\n value: '',\r\n },\r\n ];\r\n },\r\n removeVirtual(index) {\r\n this.virtualList.splice(index, 1);\r\n },\r\n // 清空批量规格信息\r\n batchDel() {\r\n this.oneFormBatch = [\r\n {\r\n pic: '',\r\n price: void 0,\r\n cost: void 0,\r\n ot_price: void 0,\r\n stock: void 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n weight: void 0,\r\n volume: void 0,\r\n virtual_list: [],\r\n },\r\n ];\r\n },\r\n confirm(name) {\r\n this.createBnt = true;\r\n this.formValidate.selectRule = name;\r\n this.attrs = [];\r\n if (this.formValidate.selectRule.trim().length <= 0) {\r\n return this.$message.error('请选择属性');\r\n }\r\n this.ruleList.forEach((item, index) => {\r\n if (item.rule_name === this.formValidate.selectRule) {\r\n this.attrs = [...item.rule_value];\r\n }\r\n });\r\n this.canSel = true;\r\n this.generateAttr(this.attrs);\r\n },\r\n // 选择规格模板\r\n handleCommand(e) {},\r\n // 获取商品属性模板;\r\n productGetRule() {\r\n productGetRuleApi().then((res) => {\r\n this.ruleList = res.data;\r\n });\r\n },\r\n // 获取运费模板;\r\n productGetTemplate() {\r\n productGetTemplateApi().then((res) => {\r\n this.templateList = res.data;\r\n });\r\n },\r\n paramsGetTemplate() {\r\n paramListApi().then((res) => {\r\n this.paramsTypeList = res.data.list;\r\n });\r\n },\r\n changeParamsType(e) {\r\n e ? this.getParams(e) : (this.formValidate.params_list = []);\r\n },\r\n getParams(id) {\r\n paramInfoApi(id).then((res) => {\r\n this.formValidate.params_list = res.data.value;\r\n });\r\n },\r\n isSubset(arr1, arr2) {\r\n // 将数组转换为 Set,以便进行高效的包含检查\r\n const set1 = new Set(arr1);\r\n const set2 = new Set(arr2);\r\n\r\n // 检查 set2 中的每个元素是否都在 set1 中\r\n for (let elem of set2) {\r\n if (!set1.has(elem)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n },\r\n // 批量添加\r\n batchAdd() {\r\n let arr = [];\r\n for (let val of this.attrs) {\r\n if (this.oneFormBatch[0][val.value]) {\r\n arr.push(this.oneFormBatch[0][val.value]);\r\n }\r\n }\r\n\r\n // 批量设置商品规格属性\r\n const batchFields = [\r\n 'pic',\r\n 'price',\r\n 'cost',\r\n 'ot_price',\r\n 'stock',\r\n 'weight',\r\n 'volume',\r\n 'bar_code',\r\n 'bar_code_number',\r\n ];\r\n // const defaultFields = ['bar_code', 'bar_code_number'];\r\n\r\n for (let val of this.manyFormValidate) {\r\n const batch = this.oneFormBatch[0];\r\n // 如果存在筛选条件且满足条件,或无筛选条件时\r\n if (!arr.length || this.isSubset(val.attr_arr, arr)) {\r\n // 设置有值的批量字段\r\n batchFields.forEach((field) => {\r\n if (batch[field] && batch[field] !== undefined) {\r\n if (field === 'pic' && batch[field]) {\r\n this.$set(val, field, batch[field]);\r\n } else if (field != 'pic') {\r\n this.$set(val, field, batch[field]);\r\n }\r\n }\r\n });\r\n\r\n // 设置默认字段\r\n // defaultFields.forEach((field) => {\r\n // this.$set(val, field, batch[field]);\r\n // });\r\n }\r\n }\r\n },\r\n changeSpecImg(arr, img) {\r\n // 判断是否存在规格图\r\n let isHas = false;\r\n for (let i = 1; i < this.manyFormValidate.length; i++) {\r\n let item = this.manyFormValidate[i];\r\n if (item.pic && this.isSubset(item.attr_arr, arr)) {\r\n isHas = true;\r\n break;\r\n }\r\n }\r\n if (isHas) {\r\n this.$confirm('可以同步修改下方该规格图片,确定要替换吗?', '提示', {\r\n confirmButtonText: '替换',\r\n cancelButtonText: '暂不',\r\n type: 'warning',\r\n })\r\n .then(() => {\r\n for (let val of this.manyFormValidate) {\r\n if (this.isSubset(val.attr_arr, arr)) {\r\n this.$set(val, 'pic', img);\r\n }\r\n }\r\n })\r\n .catch(() => {});\r\n } else {\r\n for (let val of this.manyFormValidate) {\r\n if (this.isSubset(val.attr_arr, arr)) {\r\n this.$set(val, 'pic', img);\r\n }\r\n }\r\n }\r\n },\r\n // 立即生成\r\n generate(type, isCopy, arr) {\r\n this.manyFormValidate = [];\r\n this.formValidate.header = [];\r\n },\r\n clearAttr() {\r\n this.formDynamic.attrsName = '';\r\n this.formDynamic.attrsVal = '';\r\n },\r\n\r\n // 删除规格\r\n handleRemoveRole(index) {\r\n this.attrs.splice(index, 1);\r\n this.manyFormValidate.splice(index, 1);\r\n if (!this.attrs.length) {\r\n this.formValidate.header = [];\r\n this.manyFormValidate = [];\r\n } else {\r\n this.generateAttr(this.attrs);\r\n }\r\n },\r\n // 删除表格中 对应属性\r\n delAttrTable(val) {\r\n for (let i = 0; i < this.manyFormValidate.length; i++) {\r\n let item = this.manyFormValidate[i];\r\n if (item.attr_arr && item.attr_arr.includes(val)) {\r\n this.manyFormValidate.splice(i, 1);\r\n i--;\r\n }\r\n }\r\n },\r\n // 删除属性\r\n handleRemove2(item, index, val) {\r\n // 删除 manyFormValidate中 title = item.value 的属性值\r\n item.splice(index, 1);\r\n // this.generateAttr(this.attrs);\r\n this.delAttrTable(val);\r\n },\r\n // 新增规格\r\n handleAddRole() {\r\n let data = {\r\n value: this.formDynamic.attrsName,\r\n add_pic: 0,\r\n detail: [],\r\n };\r\n this.attrs.push(data);\r\n },\r\n handleAddParams() {\r\n let data = {\r\n name: '',\r\n value: '',\r\n };\r\n this.formValidate.params_list.push(data);\r\n },\r\n handleSaveAsTemplate() {\r\n this.$prompt('', '请输入模板名称', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n })\r\n .then(({ value }) => {\r\n let spec = this.attrs.map((item) => {\r\n return {\r\n value: item.value,\r\n detail: item.detail.map((e) => e.value),\r\n };\r\n });\r\n let formDynamic = {\r\n rule_name: value,\r\n spec: spec,\r\n };\r\n ruleAddApi(formDynamic, 0)\r\n .then((res) => {\r\n this.$message.success(res.msg);\r\n this.productGetRule();\r\n })\r\n .catch((res) => {\r\n this.$message.error(res.msg);\r\n });\r\n })\r\n .catch(() => {});\r\n },\r\n // 新增一条属性\r\n addOneAttr(val, val2) {\r\n this.generateAttr(this.attrs, val2);\r\n },\r\n handleFocus(val) {\r\n this.changeAttrValue = val;\r\n },\r\n handleBlur() {\r\n this.changeAttrValue = '';\r\n },\r\n handleSelImg(item) {\r\n this.$imgModal((e) => {\r\n item.pic = e.att_dir;\r\n this.changeSpecImg([item.value], e.att_dir);\r\n });\r\n },\r\n handleRemoveImg(item) {\r\n item.pic = '';\r\n },\r\n // 规格名称改变\r\n attrChangeValue(i, val) {\r\n if (val.trim().length && this.attrs[i].detail.length) {\r\n this.generateHeader(this.attrs);\r\n if (this.manyFormValidate.length) {\r\n this.manyFormValidate.map((item, i) => {\r\n if (i > 0) {\r\n if (Object.keys(item.detail).includes(this.changeAttrValue)) {\r\n item.detail[val] = item.detail[this.changeAttrValue];\r\n item[val] = item[this.changeAttrValue];\r\n delete item.detail[this.changeAttrValue];\r\n delete item[this.changeAttrValue];\r\n }\r\n }\r\n });\r\n this.changeAttrValue = val;\r\n }\r\n } else {\r\n this.generateAttr(this.attrs);\r\n }\r\n },\r\n // 规格值改变\r\n attrDetailChangeValue(val, i) {\r\n if (this.manyFormValidate.length) {\r\n let key = this.attrs[i].value;\r\n this.manyFormValidate.map((item, i) => {\r\n if (i > 0) {\r\n if (Object.keys(item.detail).includes(key) && item.detail[key] === this.changeAttrValue) {\r\n item.detail[key] = val;\r\n let index = item.attr_arr.findIndex((item) => item === this.changeAttrValue);\r\n item.attr_arr[index] = val;\r\n }\r\n }\r\n });\r\n this.changeAttrValue = val;\r\n } else {\r\n this.generateAttr(this.attrs, 1);\r\n }\r\n },\r\n // 规格图片添加开关\r\n addPic(e, i) {\r\n if (e) {\r\n this.attrs.map((item, ii) => {\r\n if (ii !== i) {\r\n this.$set(item, 'add_pic', 0);\r\n }\r\n });\r\n this.canSel = false;\r\n } else {\r\n this.canSel = true;\r\n }\r\n },\r\n // 规格拖拽排序后\r\n onMoveSpec() {\r\n this.generateAttr(this.attrs);\r\n },\r\n changeCurrentIndex(i) {\r\n this.currentIndex = i;\r\n },\r\n // 生成商品规格表头\r\n generateHeader(data) {\r\n let specificationsColumns = data.map((item) => ({\r\n title: item.value,\r\n key: item.value,\r\n minWidth: 140,\r\n fixed: 'left',\r\n }));\r\n let arr;\r\n if ([1, 2].includes(Number(this.formValidate.virtual_type))) {\r\n arr = [...specificationsColumns, ...VirtualTableHead];\r\n // 找到slot 等于 fictitious 将title改为规格名称\r\n this.formValidate.header.map((item) => {\r\n if (item.slot === 'fictitious') {\r\n item.title = this.formValidate.virtual_type == 1 ? '添加卡密/网盘' : '选择优惠券';\r\n }\r\n });\r\n } else if (this.formValidate.virtual_type == 3) {\r\n arr = [...specificationsColumns, ...VirtualTableHead2];\r\n } else {\r\n arr = [...specificationsColumns, ...GoodsTableHead];\r\n }\r\n this.$set(this.formValidate, 'header', arr);\r\n this.tableKey += 1;\r\n this.columnsInstalM = arr;\r\n },\r\n /*\r\n * 生成属性\r\n * @param {Array} data 规格数据\r\n * */\r\n generateAttr(data, val) {\r\n this.generateHeader(data);\r\n const combinations = this.generateCombinations(data);\r\n console.log('规格组合总数:' + combinations.length);\r\n const virtualType = this.formValidate.virtual_type;\r\n // 如果combinations数量超过 500,则分批次生成属性\r\n let rows = [];\r\n if (combinations.length > 500) {\r\n const batchSize = Math.ceil(combinations.length / 500);\r\n for (let i = 0; i < combinations.length; i += batchSize) {\r\n setTimeout((e) => {\r\n let d = this.generateAttrBatch(data, combinations.slice(i, i + batchSize), val);\r\n rows = [...rows, ...d];\r\n this.manyFormValidate = [...this.oneFormBatch, ...rows];\r\n }, 0);\r\n }\r\n } else {\r\n rows = this.generateAttrBatch(data, combinations, val);\r\n this.manyFormValidate = [...this.oneFormBatch, ...rows];\r\n }\r\n },\r\n // 生成属性批次\r\n generateAttrBatch(data, combinations, val) {\r\n const existingItems = this.manyFormValidate.slice(1); // 排除第一项默认数据\r\n\r\n const rows = combinations.map((combination) => {\r\n const row = {\r\n attr_arr: combination,\r\n detail: {},\r\n title: '',\r\n key: '',\r\n price: 0,\r\n pic: '',\r\n ot_price: 0,\r\n cost: 0,\r\n stock: 0,\r\n is_show: 1,\r\n is_default_select: 0,\r\n unique: '',\r\n weight: '',\r\n volume: '',\r\n brokerage: 0,\r\n brokerage_two: 0,\r\n vip_price: 0,\r\n vip_proportion: 0,\r\n };\r\n\r\n // 设置虚拟类型相关属性\r\n if (this.formValidate.virtual_type === 1) {\r\n row.virtual_list = [];\r\n row.disk_info = '';\r\n } else if (this.formValidate.virtual_type === 2) {\r\n row.coupon_id = 0;\r\n row.coupon_name = '';\r\n }\r\n\r\n // 处理规格属性\r\n data.forEach((item, i) => {\r\n const value = combination[i];\r\n row[item.value] = value;\r\n row.title = item.value;\r\n row.key = item.value;\r\n row.detail[item.value] = value;\r\n\r\n // 查找匹配的现有规格项\r\n const matchedItem = existingItems.find((item) => item.attr_arr && arraysEqual(item.attr_arr, combination));\r\n\r\n if (matchedItem) {\r\n Object.assign(row, {\r\n price: matchedItem.price,\r\n cost: matchedItem.cost,\r\n ot_price: matchedItem.ot_price,\r\n stock: matchedItem.stock,\r\n pic: matchedItem.pic,\r\n unique: matchedItem.unique || '',\r\n weight: matchedItem.weight || '',\r\n volume: matchedItem.volume || '',\r\n is_show: matchedItem.is_show || 1,\r\n is_default_select: matchedItem.is_default_select || 0,\r\n volume: matchedItem.volume || 0,\r\n bar_code_number: matchedItem.bar_code_number || 0,\r\n is_virtual: matchedItem.is_virtual,\r\n brokerage: matchedItem.brokerage,\r\n brokerage_two: matchedItem.brokerage_two,\r\n vip_price: matchedItem.vip_price,\r\n vip_proportion: matchedItem.vip_proportion,\r\n });\r\n\r\n if (this.formValidate.virtual_type === 1) {\r\n row.virtual_list = matchedItem.virtual_list;\r\n row.disk_info = matchedItem.disk_info;\r\n } else if (this.formValidate.virtual_type === 2 && matchedItem.coupon_id) {\r\n row.coupon_id = matchedItem.coupon_id;\r\n row.coupon_name = matchedItem.coupon_name;\r\n }\r\n } else if (item.add_pic && combination.includes(val)) {\r\n const picItem = item.detail.find((e) => combination.includes(e.value));\r\n if (picItem) row.pic = picItem.pic;\r\n }\r\n });\r\n return row;\r\n });\r\n return rows;\r\n },\r\n // 切换默认选中规格\r\n changeDefaultSelect(e, index) {\r\n // 一个开启 其他关闭\r\n this.manyFormValidate.map((item, i) => {\r\n if (i !== index) {\r\n item.is_default_select = 0;\r\n }\r\n });\r\n if (e) this.manyFormValidate[index].is_show = 1;\r\n },\r\n // 改变是否显示\r\n changeDefaultShow(index) {\r\n // 如果默认选中开启 则不可隐藏\r\n if (this.manyFormValidate[index].is_default_select === 1) {\r\n this.manyFormValidate[index].is_show = 1;\r\n this.$message.error('默认规格不可隐藏');\r\n }\r\n },\r\n // 生成规格组合\r\n generateCombinations(arr, prefix = []) {\r\n if (arr.length === 0) {\r\n return [prefix];\r\n }\r\n const [first, ...rest] = arr;\r\n return first.detail.flatMap((detail) => this.generateCombinations(rest, [...prefix, detail.value]));\r\n },\r\n // 添加属性\r\n createAttr(num, idx) {\r\n if (num) {\r\n // 判断是否存在同样熟悉\r\n var isExist = this.attrs[idx].detail.some((item) => item.value === num);\r\n if (isExist) {\r\n this.$message.error('规格值已存在');\r\n return;\r\n }\r\n this.attrs[idx].detail.push({ value: num, pic: '' });\r\n if (this.manyFormValidate.length) {\r\n this.addOneAttr(this.attrs[idx].value, num);\r\n } else {\r\n this.generateAttr(this.attrs);\r\n }\r\n\r\n this.$refs.specStock.$refs['popoverRef_' + idx][0].doClose(); //关闭的\r\n this.clearAttr();\r\n setTimeout(() => {\r\n if (this.$refs.specStock.$refs['popoverRef_' + idx]) {\r\n //重点是以下两句\r\n this.$refs.specStock.$refs['popoverRef_' + idx][0].doShow(); //打开的\r\n //重点是以上两句\r\n }\r\n }, 20);\r\n } else {\r\n this.$refs.specStock.$refs['popoverRef_' + idx][0].doClose(); //关闭的\r\n }\r\n },\r\n handleShowPop(index) {\r\n this.$refs.specStock.$refs['inputRef_' + index][0].focus();\r\n },\r\n // 商品分类;\r\n goodsCategory() {\r\n cascaderListApi(1)\r\n .then((res) => {\r\n this.treeSelect = res.data;\r\n })\r\n .catch((res) => {\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 改变规格\r\n changeSpec() {\r\n this.formValidate.is_sub = [];\r\n let id = this.$route.params.id;\r\n if (id) {\r\n checkActivityApi(id)\r\n .then((res) => {})\r\n .catch((res) => {\r\n this.formValidate.spec_type = this.spec_type;\r\n this.$message.error(res.msg);\r\n });\r\n }\r\n },\r\n // 详情\r\n getInfo() {\r\n this.spinShow = true;\r\n productInfoApi(this.$route.params.id)\r\n .then(async (res) => {\r\n let data = res.data.productInfo;\r\n this.infoData(data);\r\n this.spinShow = false;\r\n })\r\n .catch((res) => {\r\n this.spinShow = false;\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n handleRemove(i) {\r\n this.images.splice(i, 1);\r\n this.formValidate.slider_image.splice(i, 1);\r\n this.oneFormValidate[0].pic = this.formValidate.slider_image[0];\r\n },\r\n // 关闭图片上传模态框\r\n changeCancel(msg) {\r\n this.modalPic = false;\r\n },\r\n // 点击商品图\r\n modalPicTap(tit, picTit = '', index = 0) {\r\n this.modalPic = true;\r\n this.isChoice = tit === 'dan' ? '单选' : '多选';\r\n this.picTit = picTit;\r\n this.tableIndex = index;\r\n },\r\n // 获取单张图片信息\r\n getPic(pc) {\r\n switch (this.picTit) {\r\n case 'danFrom':\r\n this.formValidate.image = pc.att_dir;\r\n if (!this.$route.params.id) {\r\n if (this.formValidate.spec_type === 0) {\r\n this.oneFormValidate[0].pic = pc.att_dir;\r\n } else {\r\n this.manyFormValidate.map((item) => {\r\n item.pic = pc.att_dir;\r\n });\r\n this.oneFormBatch[0].pic = pc.att_dir;\r\n }\r\n }\r\n break;\r\n case 'danTable':\r\n this.oneFormValidate[this.tableIndex].pic = pc.att_dir;\r\n break;\r\n case 'duopi':\r\n this.oneFormBatch[this.tableIndex].pic = pc.att_dir;\r\n break;\r\n case 'recommend_image':\r\n this.formValidate.recommend_image = pc.att_dir;\r\n break;\r\n default:\r\n if (this.manyFormValidate.length) this.manyFormValidate[this.tableIndex].pic = pc.att_dir;\r\n }\r\n this.modalPic = false;\r\n },\r\n deleteRow(index) {\r\n this.formValidate.params_list.splice(index, 1);\r\n },\r\n // 获取多张图信息\r\n getPicD(pc) {\r\n this.images = pc;\r\n this.images.map((item) => {\r\n this.formValidate.slider_image.push(item.att_dir);\r\n this.formValidate.slider_image = this.formValidate.slider_image.splice(0, 10);\r\n });\r\n this.oneFormValidate[0].pic = this.formValidate.slider_image[0];\r\n this.modalPic = false;\r\n },\r\n // 提交\r\n handleSubmit(name) {\r\n this.$refs[name].validate((valid) => {\r\n if (valid) {\r\n this.formValidate.type = this.type;\r\n let arr = this.formValidate.spec_type === 0 ? this.oneFormValidate : this.manyFormValidate;\r\n let item = JSON.parse(JSON.stringify(arr));\r\n if (this.formValidate.spec_type === 1) {\r\n if (item.length < 2) return this.$message.warning('商品规格-规格数量最少1个');\r\n // 删除第一项\r\n item.shift();\r\n }\r\n for (let i = 0; i < item.length; i++) {\r\n if (item[i].stock > 1000000) {\r\n return this.$message.error('规格库存-库存超出系统范围(1000000)');\r\n }\r\n }\r\n if (this.formValidate.is_sub[0] === 1) {\r\n for (let i = 0; i < item.length; i++) {\r\n if (item[i].brokerage === null || item[i].brokerage_two === null) {\r\n return this.$message.error('营销设置- 一二级返佣不能为空');\r\n }\r\n }\r\n } else {\r\n for (let i = 0; i < item.length; i++) {\r\n if (item[i].vip_price === null) {\r\n return this.$message.error('营销设置-会员价不能为空');\r\n }\r\n }\r\n }\r\n if (this.formValidate.is_sub.length === 2) {\r\n for (let i = 0; i < item.length; i++) {\r\n if (item[i].brokerage === null || item[i].brokerage_two === null || item[i].vip_price === null) {\r\n return this.$message.error('营销设置- 一二级返佣和会员价不能为空');\r\n }\r\n }\r\n }\r\n if (this.formValidate.freight == 3 && !this.formValidate.temp_id) {\r\n return this.$message.warning('商品信息-运费模板不能为空');\r\n }\r\n let activeIds = [];\r\n this.dataLabel.forEach((item) => {\r\n activeIds.push(item.id);\r\n });\r\n this.formValidate.label_id = activeIds;\r\n if (this.openSubimit) return;\r\n this.openSubimit = true;\r\n this.formValidate.description = formatRichText(this.content);\r\n if (this.formValidate.spec_type === 0) {\r\n this.formValidate.attrs = item;\r\n this.formValidate.header = [];\r\n this.formValidate.items = [];\r\n this.formValidate.is_copy = 0;\r\n } else {\r\n this.formValidate.items = this.attrs;\r\n this.formValidate.attrs = item;\r\n this.formValidate.is_copy = 1;\r\n }\r\n productAddApi(this.formValidate)\r\n .then(async (res) => {\r\n this.openSubimit = false;\r\n this.$message.success(res.msg);\r\n if (this.$route.params.id === '0') {\r\n cacheDelete().catch((err) => {\r\n this.$message.error(err.msg);\r\n });\r\n }\r\n setTimeout(() => {\r\n this.openSubimit = false;\r\n this.$router.push({ path: this.$routeProStr + '/product/product_list' });\r\n }, 500);\r\n })\r\n .catch((res) => {\r\n setTimeout((e) => {\r\n this.openSubimit = false;\r\n }, 1000);\r\n this.$message.error(res.msg);\r\n });\r\n } else {\r\n if (!this.formValidate.store_name) {\r\n return this.$message.warning('商品信息-商品名称不能为空');\r\n } else if (!this.formValidate.cate_id.length) {\r\n return this.$message.warning('商品信息-商品分类不能为空');\r\n } else if (!this.formValidate.unit_name) {\r\n return this.$message.warning('商品信息-商品单位不能为空');\r\n } else if (!this.formValidate.slider_image.length) {\r\n return this.$message.warning('商品信息-商品轮播图不能为空');\r\n } else if (!this.formValidate.logistics.length && !this.formValidate.virtual_type) {\r\n return this.$message.warning('物流设置-至少选择一种物流方式');\r\n } else if (!this.formValidate.temp_id && this.formValidate.freight == 3) {\r\n return this.$message.warning('商品信息-运费模板不能为空');\r\n }\r\n }\r\n });\r\n },\r\n changeTemplate(msg) {\r\n this.template = msg;\r\n },\r\n // 表单验证\r\n validate(prop, status, error) {\r\n if (status === false) {\r\n this.$message.warning(error);\r\n }\r\n },\r\n // 移动\r\n handleDragStart(e, item) {\r\n this.dragging = item;\r\n },\r\n handleDragEnd(e, item) {\r\n this.dragging = null;\r\n },\r\n handleDragOver(e) {\r\n e.dataTransfer.dropEffect = 'move';\r\n },\r\n handleDragEnter(e, item) {\r\n e.dataTransfer.effectAllowed = 'move';\r\n if (item === this.dragging) {\r\n return;\r\n }\r\n const newItems = [...this.formValidate.slider_image];\r\n const src = newItems.indexOf(this.dragging);\r\n const dst = newItems.indexOf(item);\r\n newItems.splice(dst, 0, ...newItems.splice(src, 1));\r\n this.formValidate.slider_image = newItems;\r\n },\r\n //对象数组去重;\r\n unique(arr) {\r\n const res = new Map();\r\n return arr.filter((arr) => !res.has(arr.product_id) && res.set(arr.product_id, 1));\r\n },\r\n // 商品id\r\n getProductId(data) {\r\n this.goods_modals = false;\r\n this.formValidate.recommend_list = this.unique(this.formValidate.recommend_list.concat(data));\r\n },\r\n // 选择推荐商品\r\n changeGoods() {\r\n this.goods_modals = true;\r\n this.$refs.goodslist.getList();\r\n this.$refs.goodslist.goodsCategory();\r\n },\r\n // 选择用户标签\r\n activeData(dataLabel) {\r\n this.labelShow = false;\r\n this.dataLabel = dataLabel;\r\n },\r\n // 选择商品标签\r\n activeLabel(data) {\r\n this.tagShow = false;\r\n this.formValidate.label_list = Array.from(new Set(data));\r\n },\r\n // 标签弹窗关闭\r\n labelClose() {\r\n this.labelShow = false;\r\n this.tagShow = false;\r\n },\r\n // 删除用户标签\r\n closeLabel(label) {\r\n let index = this.dataLabel.indexOf(this.dataLabel.filter((d) => d.id == label.id)[0]);\r\n this.dataLabel.splice(index, 1);\r\n },\r\n // 打开选择用户标签\r\n openLabel(row) {\r\n this.labelShow = true;\r\n },\r\n handleRemoveRecommend(i) {\r\n this.formValidate.recommend_list.splice(i, 1);\r\n },\r\n // 打开的营销活动标签\r\n watchActivity() {\r\n let marketing = [];\r\n // 使用对象映射优化权限判断逻辑\r\n const permissionMap = {\r\n 默认: true,\r\n 秒杀: 'seckill',\r\n 砍价: 'bargain',\r\n 拼团: 'combination',\r\n };\r\n this.formValidate.activity.forEach((el) => {\r\n if (permissionMap[el] === true || (permissionMap[el] && checkArray(permissionMap[el]))) {\r\n marketing.push(el);\r\n }\r\n });\r\n this.formValidate.activity = marketing;\r\n },\r\n },\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n@use './productAdd.scss' as *;\r\n</style>\r\n"]}]}