coh-content-db 1.4.0 → 2.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/.editorconfig +25 -0
  2. package/.github/workflows/build.yml +38 -0
  3. package/.github/workflows/pull-request.yml +32 -0
  4. package/.github/workflows/release.yml +52 -0
  5. package/LICENSE +24 -674
  6. package/README.md +74 -17
  7. package/dist/coh-content-db.d.ts +584 -22
  8. package/dist/coh-content-db.js +587 -2
  9. package/dist/coh-content-db.js.map +1 -0
  10. package/dist/coh-content-db.mjs +568 -0
  11. package/dist/coh-content-db.mjs.map +1 -0
  12. package/eslint.config.mjs +30 -0
  13. package/jest.config.mjs +7 -0
  14. package/package.json +31 -23
  15. package/rollup.config.mjs +27 -0
  16. package/src/main/api/alignment.ts +3 -0
  17. package/src/main/api/alternate-data.ts +22 -0
  18. package/src/main/api/archetype-data.ts +5 -0
  19. package/src/main/api/badge-data.ts +109 -0
  20. package/src/main/api/badge-partial-data.ts +65 -0
  21. package/src/main/api/badge-partial-type.ts +8 -0
  22. package/src/main/api/badge-type.ts +19 -0
  23. package/src/main/api/change.ts +14 -0
  24. package/src/main/api/enhancement-category.ts +30 -0
  25. package/src/main/api/game-map-data.ts +26 -0
  26. package/src/main/api/link.ts +4 -0
  27. package/src/main/api/plaque-type.ts +6 -0
  28. package/src/main/api/server-group-data.ts +65 -0
  29. package/src/main/api/sex.ts +3 -0
  30. package/src/main/api/vidiot-map-data.ts +18 -0
  31. package/src/main/api/vidiot-map-point-of-interest-data.ts +30 -0
  32. package/src/main/changelog.ts +20 -0
  33. package/src/main/db/alternates.ts +81 -0
  34. package/src/main/db/archetype.ts +14 -0
  35. package/src/main/db/badge-partial.ts +35 -0
  36. package/src/main/db/badge.ts +141 -0
  37. package/src/main/db/coh-content-database.ts +29 -0
  38. package/src/main/db/game-map.ts +33 -0
  39. package/src/main/db/key.ts +18 -0
  40. package/src/main/db/server-group.ts +112 -0
  41. package/src/main/db/vidiot-map-point-of-interest.ts +40 -0
  42. package/src/main/db/vidiot-map.ts +25 -0
  43. package/src/main/index.ts +33 -0
  44. package/src/main/util.ts +17 -0
  45. package/src/test/api/alignment.test.ts +31 -0
  46. package/src/test/api/archetype-data.fixture.ts +8 -0
  47. package/src/test/api/badge-data.fixture.ts +22 -0
  48. package/src/test/api/badge-data.test.ts +15 -0
  49. package/src/test/api/badge-partial-data.fixture.ts +17 -0
  50. package/src/test/api/badge-partial-type.test.ts +31 -0
  51. package/src/test/api/badge-type.test.ts +35 -0
  52. package/src/test/api/enhancement-category.test.ts +35 -0
  53. package/src/test/api/game-map-data.fixture.ts +10 -0
  54. package/src/test/api/plaque-type.test.ts +31 -0
  55. package/src/test/api/server-group-data.fixture.ts +23 -0
  56. package/src/test/api/server-group-data.test.ts +15 -0
  57. package/src/test/api/sex.test.ts +31 -0
  58. package/src/test/api/vidiot-map-point-of-interest.fixture.ts +10 -0
  59. package/src/test/api/vidiot-map.fixture.ts +9 -0
  60. package/src/test/changelog.test.ts +36 -0
  61. package/src/test/db/alternates.test.ts +223 -0
  62. package/src/test/db/archetype.test.ts +38 -0
  63. package/src/test/db/badge.test.ts +41 -0
  64. package/src/test/db/coh-content-database.test.ts +42 -0
  65. package/src/test/db/key.test.ts +22 -0
  66. package/src/test/db/server-group.test.ts +124 -0
  67. package/src/test/index.test.ts +10 -0
  68. package/src/test/util.test.ts +39 -0
  69. package/tsconfig.json +117 -0
  70. package/dist/_changelog.d.ts +0 -3
  71. package/dist/coh-content-db.nomin.js +0 -633
  72. package/dist/content-refence-utils.d.ts +0 -4
  73. package/dist/index.d.ts +0 -8
  74. package/dist/internal/_common.d.ts +0 -4
  75. package/dist/internal/archetype.d.ts +0 -10
  76. package/dist/internal/badge.d.ts +0 -44
  77. package/dist/internal/game-map.d.ts +0 -33
  78. package/dist/internal/server-group.d.ts +0 -24
  79. package/dist/types/archetype.d.ts +0 -9
  80. package/dist/types/badge.d.ts +0 -191
  81. package/dist/types/enhancement.d.ts +0 -28
  82. package/dist/types/game-map.d.ts +0 -47
  83. package/dist/types/link.d.ts +0 -4
  84. package/dist/types/server-group.d.ts +0 -75
@@ -1,2 +1,587 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("lodash")):"function"==typeof define&&define.amd?define("coh-content-db",["lodash"],t):"object"==typeof exports?exports["coh-content-db"]=t(require("lodash")):e["coh-content-db"]=t(e._)}(window,function(e){return function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(i,o,function(t){return e[t]}.bind(null,o));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=2)}([function(e,t,n){var i;void 0===(i=function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=/[^a-z0-9\-]/;t.validateKey=function(e){if(n.test(e))throw new Error("Bad key: ["+e+"]; Keys can only contain lowercase characters, numbers and dashes.")},t.getOrDefine=function(e,t,n){var i=t[e];return void 0===i&&(i=t[e]=n(e)),i}}.apply(t,[n,t]))||(e.exports=i)},function(t,n){t.exports=e},function(e,t,n){var i,o;i=[n,t,n(3),n(4),n(5),n(6),n(11),n(12)],void 0===(o=function(e,t,n,i,o,r,a,s){"use strict";function u(e){for(var n in e)t.hasOwnProperty(n)||(t[n]=e[n])}Object.defineProperty(t,"__esModule",{value:!0}),u(n),u(i),u(o),t.CohContentDb=r.CohContentDb,t.Changelog=a.Changelog,u(s)}.apply(t,i))||(e.exports=o)},function(e,t,n){var i;void 0===(i=function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.EXPLORATION="EXPLORATION",e.HISTORY="HISTORY",e.ACCOMPLISHMENT="ACCOMPLISHMENT",e.ACHIEVEMENT="ACHIEVEMENT",e.ACCOLADE="ACCOLADE",e.GLADIATOR="GLADIATOR",e.VETERAN="VETERAN",e.PVP="PVP",e.INVENTION="INVENTION",e.DEFEAT="DEFEAT",e.EVENT="EVENT",e.OUROBOROS="OUROBOROS",e.CONSIGNMENT="CONSIGNMENT",e.DAY_JOB="DAY_JOB",e.AE="AE"}(t.BadgeType||(t.BadgeType={})),function(e){e.PLAQUE="PLAQUE",e.BADGE="BADGE",e.INVENTION="INVENTION",e.INVENTION_PLUS_ONE="INVENTION_PLUS_ONE"}(t.BadgePartialType||(t.BadgePartialType={})),function(e){e.M="M",e.F="F",e.H="H",e.V="V",e.P="P",e.MH="MH",e.MV="MV",e.MP="MP",e.FH="FH",e.FV="FV",e.FP="FP"}(t.Alternate||(t.Alternate={})),t.ALIGNMENT_HERO={h:!0,v:!1,p:!1},t.ALIGNMENT_VILLAIN={h:!1,v:!0,p:!1},t.ALIGNMENT_PRAETORIAN={h:!1,v:!1,p:!0},t.ALIGNMENT_ANY={h:!0,v:!0,p:!0},function(e){e.WALL_PLAQUE="WALL_PLAQUE",e.MONUMENT="MONUMENT"}(t.PlaqueType||(t.PlaqueType={}))}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.DEFENSE_DEBUFF="DEFENSE_DEBUFF",e.TO_HIT_DEBUFF="TO_HIT_DEBUFF",e.TAUNT="TAUNT",e.CONFUSE="CONFUSE",e.HEALING="HEALING",e.DEFENSE_BUFF="DEFENSE_BUFF",e.RESIST_DAMAGE="RESIST_DAMAGE",e.INTANGIBILITY="INTANGIBILITY",e.SLEEP="SLEEP",e.SLOW="SLOW",e.HOLD="HOLD",e.STUN="STUN",e.IMMOBILIZE="IMMOBILIZE",e.FEAR="FEAR",e.ENDURANCE_MODIFICATION="ENDURANCE_MODIFICATION",e.ENDURANCE_REDUCTION="ENDURANCE_REDUCTION",e.RECHARGE_REDUCTION="RECHARGE_REDUCTION",e.INTERRUPT_DURATION="INTERRUPT_DURATION",e.ACCURACY="ACCURACY",e.TO_HIT_BUFF="TO_HIT_BUFF",e.DAMAGE="DAMAGE",e.KNOCKBACK="KNOCKBACK",e.RUN_SPEED="RUN_SPEED",e.JUMP="JUMP",e.FLY_SPEED="FLY_SPEED",e.RANGE="RANGE"}(t.EnhancementCategory||(t.EnhancementCategory={}))}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.WORK_IN_PROGRESS="WORK_IN_PROGRESS",e.SUNSET="SUNSET"}(t.ServerGroupStatus||(t.ServerGroupStatus={}))}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i,o;i=[n,t,n(1),n(0),n(7)],void 0===(o=function(e,t,n,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){this.serverGroups={}}return e.prototype.load=function(e){i.getOrDefine(e.key,this.serverGroups,function(e){return new o.ServerGroup(e)}).load(e)},e.prototype.getServerGroups=function(){return n.values(this.serverGroups)},e.prototype.getServerGroup=function(e){return this.serverGroups[e]},e}();t.CohContentDb=r}.apply(t,i))||(e.exports=o)},function(e,t,n){var i,o;i=[n,t,n(1),n(8),n(9),n(10),n(0)],void 0===(o=function(e,t,n,i,o,r,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e){this.archetypes=[],this.maps=[],this.badges=[],this.changelog={},this.archetypeCache={},this.mapCache={},this.badgeCache={},a.validateKey(e),this.key=e}return e.prototype.load=function(e){var t=this;null!=e.name&&(this.name=e.name),null!=e.description&&(this.description=e.description),null!=e.status&&(this.status=e.status),null!=e.repository&&(this.repository=e.repository),null!=e.servers&&(this.servers=e.servers),null!=e.archetypes&&(n.each(e.archetypes,function(e){return a.getOrDefine(e.key,t.archetypeCache,function(e){return new i.Archetype(t,e)}).load(e)}),this.archetypes=n.values(this.archetypeCache)),null!=e.maps&&(n.each(e.maps,function(e){return a.getOrDefine(e.key,t.mapCache,function(e){return new o.GameMap(t,e)}).load(e)}),this.maps=n.values(this.mapCache)),null!=e.badges&&(n.each(e.badges,function(e){return a.getOrDefine(e.key,t.badgeCache,function(e){return new r.Badge(t,e)}).load(e)}),this.badges=n.values(this.badgeCache)),e.changelog&&(this.changelog=e.changelog)},e.prototype.getArchetype=function(e){return this.archetypeCache[e]},e.prototype.getMap=function(e){return this.mapCache[e]},e.prototype.getBadge=function(e){return this.badgeCache[e]},e}();t.ServerGroup=s}.apply(t,i))||(e.exports=o)},function(e,t,n){var i,o;i=[n,t,n(0)],void 0===(o=function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){n.validateKey(t),this.serverGroup=e,this.key=t}return e.prototype.load=function(e){null!=e.name&&(this.name=e.name),null!=e.description&&(this.description=e.description)},e}();t.Archetype=i}.apply(t,i))||(e.exports=o)},function(e,t,n){var i,o;i=[n,t,n(0),n(1)],void 0===(o=function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){this.vidiotMaps=[],n.validateKey(t),this.serverGroup=e,this.key=t}return e.prototype.load=function(e){var t=this;null!=e.name&&(this.name=e.name),null!=e.links&&(this.links=(this.links||[]).concat(e.links)),e.vidiotMaps&&i.each(e.vidiotMaps,function(e){return t.vidiotMaps.push(new r(t.serverGroup,t).load(e))})},e}();t.GameMap=o;var r=function(){function e(e,t){this.pointsOfInterest=[],this.serverGroup=e,this.map=t}return e.prototype.load=function(e){var t=this;return null!=e.href&&(this.href=e.href),null!=e.name&&(this.name=e.name),e.pointsOfInterest&&i.each(e.pointsOfInterest,function(e){return t.pointsOfInterest.push(new a(t.serverGroup,t.map,t).load(e))}),this},e}();t.VidiotMap=r;var a=function(){function e(e,t,n){this.serverGroup=e,this.map=t,this.vidiotMap=n}return e.prototype.load=function(e){return null!=e.x&&(this.x=e.x),null!=e.y&&(this.y=e.y),null!=e.notes&&(this.notes=e.notes),null!=e.mapKey&&(this.mapKey=e.mapKey),null!=e.badgeKey&&(this.badgeKey=e.badgeKey),null!=e.badgePartialKey&&(this.badgePartialKey=e.badgePartialKey),this},e}();t.VidiotMapPoi=a}.apply(t,i))||(e.exports=o)},function(e,t,n){var i,o;i=[n,t,n(0),n(1)],void 0===(o=function(e,t,n,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){this.partialCache={},n.validateKey(t),this.serverGroup=e,this.key=t}return e.prototype.load=function(e){var t=this;null!=e.type&&(this.type=e.type),null!=e.names&&(this.names=(this.names||[]).concat(e.names)),null!=e.alignment&&(this.alignment=e.alignment),null!=e.badgeText&&(this.badgeText=(this.badgeText||[]).concat(e.badgeText)),null!=e.acquisition&&(this.acquisition=e.acquisition),null!=e.icons&&(this.icons=(this.icons||[]).concat(e.icons)),null!=e.notes&&(this.notes=e.notes),null!=e.links&&(this.links=(this.links||[]).concat(e.links)),null!=e.mapKey&&(this.mapKey=e.mapKey),null!=e.location&&(this.location=e.location),null!=e.effect&&(this.effect=e.effect),null!=e.vidiotMapKey&&(this.vidiotMapKey=e.vidiotMapKey),null!=e.setTitleId&&(this.setTitleId=e.setTitleId),null!=e.setTitleIdPraetorian&&(this.setTitleIdPraetorian=e.setTitleIdPraetorian),null!=e.ignoreInTotals&&(this.ignoreInTotals=e.ignoreInTotals),null!=e.partials&&(i.each(e.partials,function(e){return n.getOrDefine(e.key,t.partialCache,function(e){return new r(t.serverGroup,t,e)}).load(e)}),this.partials=i.values(this.partialCache))},e.prototype.getPartial=function(e){return this.partialCache[e]},e}();t.Badge=o;var r=function(){function e(e,t,i){n.validateKey(i),this.key=i,this.serverGroup=e,this.parent=t}return e.prototype.load=function(e){null!=e.type&&(this.type=e.type),null!=e.mapKey&&(this.mapKey=e.mapKey),null!=e.location&&(this.location=e.location),null!=e.plaqueType&&(this.plaqueType=e.plaqueType),null!=e.inscription&&(this.inscription=e.inscription),null!=e.vidiotMapKey&&(this.vidiotMapKey=e.vidiotMapKey),null!=e.badgeKey&&(this.badgeKey=e.badgeKey),null!=e.inventionLevel&&(this.inventionLevel=e.inventionLevel),null!=e.inventionTypes&&(this.inventionTypes=e.inventionTypes),null!=e.count&&(this.count=e.count),null!=e.notes&&(this.notes=e.notes)},e}();t.BadgePartial=r}.apply(t,i))||(e.exports=o)},function(e,t,n){var i;void 0===(i=function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Changelog={"1.0.0":"* Initial release.","1.0.1":"* Type encapsulation for ServerData and Archetype.","1.1.0":"* Badge icons are now urls instead of keys.\n* Badge icons have moved from `badge.imageKeys` to `badge.icons`.\n* Changelog is now just a markdown block instead of a string array.\n","1.1.1":"* `IGameMap.links` is now optional.","1.1.2":"* https://github.com/n15g/coh-content-db/issues/3 - Added `setTitleId` property for badges. Used to store the `settitle` slash command number of the badge.","1.1.3":"* Added some content reference utility functions.","1.2.0":"* https://github.com/n15g/coh-content-db/issues/4 - Added a field `ignoreInTotals` to `Badge`, allowing badges to be ignored in badge total calculations, for badges like [Flames of Prometheus] and [Bug Hunter].","1.3.1":"* https://github.com/n15g/coh-content-db/issues/5 - Added vidiot map data to maps.","1.3.2":"* Added badge partial support for vidiot map POIs.","1.4.0":"* https://github.com/n15g/coh-content-db/issues/7 - Settitle ids for Praetorian badges."}}.apply(t,[n,t]))||(e.exports=i)},function(e,t,n){var i;void 0===(i=function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.badgeReference=function(e){return"[badge:"+e.key+"]"},t.mapReference=function(e){return"[map:"+e.key+"]"}}.apply(t,[n,t]))||(e.exports=i)}])});
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb2gtY29udGVudC1kYi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvLi9zcmMvaW50ZXJuYWwvX2NvbW1vbi50cyIsIndlYnBhY2s6Ly9jb2gtY29udGVudC1kYi9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwibG9kYXNoXCIsXCJjb21tb25qczJcIjpcImxvZGFzaFwiLFwiYW1kXCI6XCJsb2Rhc2hcIixcInJvb3RcIjpcIl9cIn0iLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvLi9zcmMvdHlwZXMvYmFkZ2UudHMiLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvLi9zcmMvdHlwZXMvZW5oYW5jZW1lbnQudHMiLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvLi9zcmMvdHlwZXMvc2VydmVyLWdyb3VwLnRzIiwid2VicGFjazovL2NvaC1jb250ZW50LWRiLy4vc3JjL2NvaC1jb250ZW50LWRiLnRzIiwid2VicGFjazovL2NvaC1jb250ZW50LWRiLy4vc3JjL2ludGVybmFsL3NlcnZlci1ncm91cC50cyIsIndlYnBhY2s6Ly9jb2gtY29udGVudC1kYi8uL3NyYy9pbnRlcm5hbC9hcmNoZXR5cGUudHMiLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvLi9zcmMvaW50ZXJuYWwvZ2FtZS1tYXAudHMiLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvLi9zcmMvaW50ZXJuYWwvYmFkZ2UudHMiLCJ3ZWJwYWNrOi8vY29oLWNvbnRlbnQtZGIvLi9zcmMvX2NoYW5nZWxvZy50cyIsIndlYnBhY2s6Ly9jb2gtY29udGVudC1kYi8uL3NyYy9jb250ZW50LXJlZmVuY2UtdXRpbHMudHMiXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwicmVxdWlyZSIsImRlZmluZSIsImFtZCIsIndpbmRvdyIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzFfXyIsImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJLRVlfRk9STUFUIiwidGVzdCIsIkVycm9yIiwiY2FjaGUiLCJwcm92aWRlciIsImVudHJ5IiwidW5kZWZpbmVkIiwiQ29oQ29udGVudERiIiwiQ2hhbmdlbG9nIiwiQmFkZ2VUeXBlIiwiQmFkZ2VQYXJ0aWFsVHlwZSIsIkFsdGVybmF0ZSIsIkFMSUdOTUVOVF9IRVJPIiwiaCIsInYiLCJBTElHTk1FTlRfVklMTEFJTiIsIkFMSUdOTUVOVF9QUkFFVE9SSUFOIiwiQUxJR05NRU5UX0FOWSIsIlBsYXF1ZVR5cGUiLCJFbmhhbmNlbWVudENhdGVnb3J5IiwiU2VydmVyR3JvdXBTdGF0dXMiLCJzZXJ2ZXJHcm91cHMiLCJsb2FkIiwiZGF0YSIsImdldE9yRGVmaW5lIiwidGhpcyIsIlNlcnZlckdyb3VwIiwiZ2V0U2VydmVyR3JvdXBzIiwiXyIsInZhbHVlcyIsImdldFNlcnZlckdyb3VwIiwic2VydmVyR3JvdXBLZXkiLCJhcmNoZXR5cGVzIiwibWFwcyIsImJhZGdlcyIsImNoYW5nZWxvZyIsImFyY2hldHlwZUNhY2hlIiwibWFwQ2FjaGUiLCJiYWRnZUNhY2hlIiwidmFsaWRhdGVLZXkiLCJkZXNjcmlwdGlvbiIsInN0YXR1cyIsInJlcG9zaXRvcnkiLCJzZXJ2ZXJzIiwiZWFjaCIsIkFyY2hldHlwZSIsIkdhbWVNYXAiLCJCYWRnZSIsImdldEFyY2hldHlwZSIsImdldE1hcCIsImdldEJhZGdlIiwic2VydmVyR3JvdXAiLCJ2aWRpb3RNYXBzIiwibGlua3MiLCJ2aWRpb3RNYXBEYXRhIiwicHVzaCIsIlZpZGlvdE1hcCIsIm1hcCIsInBvaW50c09mSW50ZXJlc3QiLCJocmVmIiwicG9pRGF0YSIsIlZpZGlvdE1hcFBvaSIsInZpZGlvdE1hcCIsIngiLCJ5Iiwibm90ZXMiLCJtYXBLZXkiLCJiYWRnZUtleSIsImJhZGdlUGFydGlhbEtleSIsInBhcnRpYWxDYWNoZSIsInR5cGUiLCJuYW1lcyIsImFsaWdubWVudCIsImJhZGdlVGV4dCIsImFjcXVpc2l0aW9uIiwiaWNvbnMiLCJsb2NhdGlvbiIsImVmZmVjdCIsInZpZGlvdE1hcEtleSIsInNldFRpdGxlSWQiLCJzZXRUaXRsZUlkUHJhZXRvcmlhbiIsImlnbm9yZUluVG90YWxzIiwicGFydGlhbHMiLCJCYWRnZVBhcnRpYWwiLCJnZXRQYXJ0aWFsIiwicGFyZW50IiwicGxhcXVlVHlwZSIsImluc2NyaXB0aW9uIiwiaW52ZW50aW9uTGV2ZWwiLCJpbnZlbnRpb25UeXBlcyIsImNvdW50IiwiYmFkZ2UiXSwibWFwcGluZ3MiOiJDQUFBLFNBQTJDQSxFQUFNQyxHQUMxQixpQkFBWkMsU0FBMEMsaUJBQVhDLE9BQ3hDQSxPQUFPRCxRQUFVRCxFQUFRRyxRQUFRLFdBQ1IsbUJBQVhDLFFBQXlCQSxPQUFPQyxJQUM5Q0QsT0FBTyxpQkFBa0IsQ0FBQyxVQUFXSixHQUNYLGlCQUFaQyxRQUNkQSxRQUFRLGtCQUFvQkQsRUFBUUcsUUFBUSxXQUU1Q0osRUFBSyxrQkFBb0JDLEVBQVFELEVBQVEsR0FSM0MsQ0FTR08sT0FBUSxTQUFTQyxHQUNwQixPLFlDVEUsSUFBSUMsRUFBbUIsR0FHdkIsU0FBU0MsRUFBb0JDLEdBRzVCLEdBQUdGLEVBQWlCRSxHQUNuQixP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QmxFLEVBQUtrRSxnQkFDL0NuRixNQUFkaUIsRUFBS21FLFFBQW9CakUsS0FBS2lFLE1BQVFuRSxFQUFLbUUsT0FDN0JwRixNQUFkaUIsRUFBSzBDLFFBQW9CeEMsS0FBS3dDLE1BQVExQyxFQUFLMEMsUUFFdkQsRUFyQ0EsR0FBYSxFQUFBa0IsZ0IsMElDakVBLEVBQUEzRSxVQUFzQyxDQUMvQyxRQUFTLHFCQUNULFFBQVMscURBRVQsUUFBUyx3TEFHVCxRQUFTLHNDQUNULFFBQVMsOEpBQ1QsUUFBUyxvREFFVCxRQUFTLHFOQUdULFFBQVMscUZBQ1QsUUFBUyxxREFFVCxRQUFTLDRGLDhJQ2RiLDBCQUErQm1GLEdBQzNCLE1BQU8sVUFBVUEsRUFBTXBHLElBQUcsS0FHOUIsd0JBQTZCa0UsR0FDekIsTUFBTyxRQUFRQSxFQUFJbEUsSUFBRyxNIiwiZmlsZSI6ImNvaC1jb250ZW50LWRiLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwibG9kYXNoXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiY29oLWNvbnRlbnQtZGJcIiwgW1wibG9kYXNoXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImNvaC1jb250ZW50LWRiXCJdID0gZmFjdG9yeShyZXF1aXJlKFwibG9kYXNoXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJjb2gtY29udGVudC1kYlwiXSA9IGZhY3Rvcnkocm9vdFtcIl9cIl0pO1xufSkod2luZG93LCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xX18pIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMik7XG4iLCJjb25zdCBLRVlfRk9STUFUID0gL1teYS16MC05XFwtXS87XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUtleShrZXk6IHN0cmluZykge1xuICAgIGlmIChLRVlfRk9STUFULnRlc3Qoa2V5KSkgdGhyb3cgbmV3IEVycm9yKGBCYWQga2V5OiBbJHtrZXl9XTsgS2V5cyBjYW4gb25seSBjb250YWluIGxvd2VyY2FzZSBjaGFyYWN0ZXJzLCBudW1iZXJzIGFuZCBkYXNoZXMuYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPckRlZmluZTxUPihrZXk6IHN0cmluZywgY2FjaGU6IHsgW2lkOiBzdHJpbmddOiBUIH0sIHByb3ZpZGVyOiAoa2V5OiBzdHJpbmcpID0+IFQpOiBUIHtcbiAgICBsZXQgZW50cnkgPSBjYWNoZVtrZXldO1xuXG4gICAgaWYgKGVudHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW50cnkgPSBjYWNoZVtrZXldID0gcHJvdmlkZXIoa2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cnk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzFfXzsiLCJleHBvcnQgKiBmcm9tIFwiLi90eXBlcy9iYWRnZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXMvZW5oYW5jZW1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzL2dhbWUtbWFwXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy9saW5rXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy9zZXJ2ZXItZ3JvdXBcIjtcblxuZXhwb3J0IHtDb2hDb250ZW50RGJ9IGZyb20gXCIuL2NvaC1jb250ZW50LWRiXCI7XG5cbmV4cG9ydCB7Q2hhbmdlbG9nfSBmcm9tIFwiLi9fY2hhbmdlbG9nXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2NvbnRlbnQtcmVmZW5jZS11dGlsc1wiO1xuIiwiaW1wb3J0IHtJTGlua30gZnJvbSBcIi4vbGlua1wiO1xuaW1wb3J0IHtJU2VydmVyR3JvdXB9IGZyb20gXCIuL3NlcnZlci1ncm91cFwiO1xuaW1wb3J0IHtFbmhhbmNlbWVudENhdGVnb3J5fSBmcm9tIFwiLi9lbmhhbmNlbWVudFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElCYWRnZURhdGEge1xuICAgIC8qKlxuICAgICAqIEtleS5cbiAgICAgKi9cbiAgICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEJhZGdlIHR5cGUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHlwZT86IEJhZGdlVHlwZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lcyB0aGlzIGJhZGdlIGlzIGtub3duIGJ5LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5hbWVzPzogSUFsdGVybmF0ZVZhbHVlW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWxpZ25tZW50cyB0aGlzIGJhZGdlIGNhbiBiZSBvYnRhaW5lZCBieS5cbiAgICAgKi9cbiAgICByZWFkb25seSBhbGlnbm1lbnQ/OiBJQWxpZ25tZW50RmxhZ3M7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW4tZ2FtZSBiYWRnZSB0ZXh0LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGJhZGdlVGV4dD86IElBbHRlcm5hdGVWYWx1ZVtdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1ldGhvZCB1c2VkIHRvIGFjcXVpcmUgdGhlIGJhZGdlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFjcXVpc2l0aW9uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQmFkZ2UgaW1hZ2VzLiBVc2UgdGhlIGFic29sdXRlIHVybCBpbWFnZXMgaG9zdGVkIGluIGEgQ0ROIG9yIHNpbWlsYXIgcHVibGljbHktYWNjZXNzaWJsZSBsb2NhdGlvbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBpY29ucz86IElBbHRlcm5hdGVWYWx1ZVtdXG5cbiAgICAvKipcbiAgICAgKiBOb3RlcyBvciB0aXBzIGFib3V0IHRoZSBiYWRnZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBub3Rlcz86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgbGlua3MgdG8gZXh0ZXJuYWwgcmVzb3VyY2VzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGxpbmtzPzogSUxpbmtbXTtcblxuICAgIC8qKlxuICAgICAqIEtleSBvZiB0aGUgbWFwIHRoaXMgYmFkZ2UgaXMgZm91bmQgb24gZm9yIGV4cGxvcmF0aW9uIGJhZGdlcy5cbiAgICAgKi9cbiAgICByZWFkb25seSBtYXBLZXk/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiAvbG9jIGNvb3JkaW5hdGVzIG9mIHRoZSBiYWRnZSBpbi1nYW1lLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGxvY2F0aW9uPzogbnVtYmVyW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9yIGxldHRlciB0aGUgYmFkZ2UgYXBwZWFycyBhcyBvbiBWaWRpb3QgTWFwcy5cbiAgICAgKi9cbiAgICByZWFkb25seSB2aWRpb3RNYXBLZXk/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBOdW1iZXIgdXNlZCB3aXRoIHRoZSBpbi1nYW1lIGBzZXR0aXRsZWAgc2xhc2ggY29tbWFuZCB0byBhcHBseSB0aGUgYmFkZ2UuXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2V0VGl0bGVJZD86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFNvbWUgcHJhZXRvcmlhbiBiYWRnZXMgaGF2ZSBhIGRpZmZlcmVudCBzZXR0aXRsZSBpZC5cbiAgICAgKi9cbiAgICByZWFkb25seSBzZXRUaXRsZUlkUHJhZXRvcmlhbj86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGVmZmVjdCB0aGUgYmFkZ2Ugd2lsbCBoYXZlLCBzdWNoIGFzIGEgYnVmZiBvciBncmFudGluZyBhIHRlbXBvcmFyeSBwb3dlci5cbiAgICAgKi9cbiAgICByZWFkb25seSBlZmZlY3Q/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBGb3IgYmFkZ2VzIHRoYXQgaGF2ZSBwYXJ0aWFsIGZ1bGZpbG1lbnQgcmVxdWlyZW1lbnRzLCBzdWNoIGFzIHBsYXF1ZXMgZm9yIGhpc3RvcnkgYmFkZ2VzLCBvciBvdGhlciBiYWRnZXMgZm9yIG1ldGEtYmFkZ2VzIGxpa2UgYWNjb2xhZGVzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHBhcnRpYWxzPzogSUJhZGdlUGFydGlhbERhdGFbXTtcblxuICAgIC8qKlxuICAgICAqIFNvbWUgYmFkZ2VzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGJhZGdlIHRvdGFsIGNvdW50Li4uIHN1Y2ggYXMgRmxhbWVzIG9mIFByb21ldGhldXMsIHdoaWNoIGNhbiBiZSByZW1vdmVkIGJ5IHJlZGVlbWluZyBpdCBmb3IgYSBOb3RpY2Ugb2YgdGhlIFdlbGwuXG4gICAgICovXG4gICAgcmVhZG9ubHkgaWdub3JlSW5Ub3RhbHM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCYWRnZVBhcnRpYWxEYXRhIHtcbiAgICAvKipcbiAgICAgKiBLZXkuXG4gICAgICovXG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHBhcnRpYWwuXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHlwZT86IEJhZGdlUGFydGlhbFR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBNYXAgdGhlIHBhcnRpYWwgaXMgbG9jYXRlZCBvbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBtYXBLZXk/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiAvbG9jIGNvb3JkaW5hdGVzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGxvY2F0aW9uPzogbnVtYmVyW107XG5cbiAgICAvKipcbiAgICAgKiBJcyBpdCBhIHdhbGwgcGxhcXVlIG9yIGEgcGh5c2ljYWwgbW9udW1lbnQ/XG4gICAgICovXG4gICAgcmVhZG9ubHkgcGxhcXVlVHlwZT86IFBsYXF1ZVR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBQbGFxdWUgaW5zY3JpcHRpb24uXG4gICAgICovXG4gICAgcmVhZG9ubHkgaW5zY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9yIGxldHRlciB0aGUgcGFydGlhbCBhcHBlYXJzIGFzIG9uIFZpZGlvdCBNYXBzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHZpZGlvdE1hcEtleT86IHN0cmluZztcblxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhZGdlIHJlcXVpcmVkIGZvciB0aGlzIHBhcnRpYWwuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYmFkZ2VLZXk/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBMZXZlbCBvZiB0aGUgaW52ZW50aW9uIHJlcXVpcmVkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGludmVudGlvbkxldmVsPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIGVuaGFuY2VtZW50cyByZXF1aXJlZCB0byBiZSBjcmFmdGVkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGludmVudGlvblR5cGVzPzogRW5oYW5jZW1lbnRDYXRlZ29yeVtdO1xuXG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGludmVudGlvbiBjcmFmdHMgcmVxdWlyZWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgY291bnQ/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBBbnkgYWRkaXRpb25hbCBub3Rlcy5cbiAgICAgKi9cbiAgICByZWFkb25seSBub3Rlcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gQmFkZ2VUeXBlIHtcbiAgICBFWFBMT1JBVElPTiA9IFwiRVhQTE9SQVRJT05cIixcbiAgICBISVNUT1JZID0gXCJISVNUT1JZXCIsXG4gICAgQUNDT01QTElTSE1FTlQgPSBcIkFDQ09NUExJU0hNRU5UXCIsXG4gICAgQUNISUVWRU1FTlQgPSBcIkFDSElFVkVNRU5UXCIsXG4gICAgQUNDT0xBREUgPSBcIkFDQ09MQURFXCIsXG4gICAgR0xBRElBVE9SID0gXCJHTEFESUFUT1JcIixcbiAgICBWRVRFUkFOID0gXCJWRVRFUkFOXCIsXG4gICAgUFZQID0gXCJQVlBcIixcbiAgICBJTlZFTlRJT04gPSBcIklOVkVOVElPTlwiLFxuICAgIERFRkVBVCA9IFwiREVGRUFUXCIsXG4gICAgRVZFTlQgPSBcIkVWRU5UXCIsXG4gICAgT1VST0JPUk9TID0gXCJPVVJPQk9ST1NcIixcbiAgICBDT05TSUdOTUVOVCA9IFwiQ09OU0lHTk1FTlRcIixcbiAgICBEQVlfSk9CID0gXCJEQVlfSk9CXCIsXG4gICAgQUUgPSBcIkFFXCJcbn1cblxuZXhwb3J0IGVudW0gQmFkZ2VQYXJ0aWFsVHlwZSB7XG4gICAgUExBUVVFID0gXCJQTEFRVUVcIixcbiAgICBCQURHRSA9IFwiQkFER0VcIixcbiAgICBJTlZFTlRJT04gPSBcIklOVkVOVElPTlwiLFxuICAgIC8qKlxuICAgICAqIFNvbWUgaW52ZW50aW9uIGJhZGdlcyByZXF1aXJlIHlvdSB0byBidWlsZCB4IG9mIHR3byBkaWZmZXJlbnQgaW52ZW50aW9uIGxldmVscywgJ3BsdXMgb25lIG9mIGVpdGhlciBsZXZlbCcuXG4gICAgICovXG4gICAgSU5WRU5USU9OX1BMVVNfT05FID0gXCJJTlZFTlRJT05fUExVU19PTkVcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQWx0ZXJuYXRlVmFsdWUge1xuICAgIHJlYWRvbmx5IHR5cGU/OiBBbHRlcm5hdGU7XG4gICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBGb3IgYmFkZ2VzIHRoYXQgaGF2ZSBhbHRlcm5hdGUgdmFsdWVzIGJhc2VkIG9uIHRoZSBhbGlnbm1lbnQgKEgvVi9QKSBvciBzZXggKE0vRikgb2YgdGhlIGNoYXJhY3Rlci5cbiAqL1xuZXhwb3J0IGVudW0gQWx0ZXJuYXRlIHtcbiAgICBNID0gXCJNXCIsXG4gICAgRiA9IFwiRlwiLFxuICAgIEggPSBcIkhcIixcbiAgICBWID0gXCJWXCIsXG4gICAgUCA9IFwiUFwiLFxuICAgIE1IID0gXCJNSFwiLFxuICAgIE1WID0gXCJNVlwiLFxuICAgIE1QID0gXCJNUFwiLFxuICAgIEZIID0gXCJGSFwiLFxuICAgIEZWID0gXCJGVlwiLFxuICAgIEZQID0gXCJGUFwiXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFsaWdubWVudEZsYWdzIHtcbiAgICByZWFkb25seSBoOiBib29sZWFuLFxuICAgIHJlYWRvbmx5IHY6IGJvb2xlYW4sXG4gICAgcmVhZG9ubHkgcDogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgQUxJR05NRU5UX0hFUk86IElBbGlnbm1lbnRGbGFncyA9IHtoOiB0cnVlLCB2OiBmYWxzZSwgcDogZmFsc2V9O1xuZXhwb3J0IGNvbnN0IEFMSUdOTUVOVF9WSUxMQUlOOiBJQWxpZ25tZW50RmxhZ3MgPSB7aDogZmFsc2UsIHY6IHRydWUsIHA6IGZhbHNlfTtcbmV4cG9ydCBjb25zdCBBTElHTk1FTlRfUFJBRVRPUklBTjogSUFsaWdubWVudEZsYWdzID0ge2g6IGZhbHNlLCB2OiBmYWxzZSwgcDogdHJ1ZX07XG5leHBvcnQgY29uc3QgQUxJR05NRU5UX0FOWTogSUFsaWdubWVudEZsYWdzID0ge2g6IHRydWUsIHY6IHRydWUsIHA6IHRydWV9O1xuXG5leHBvcnQgZW51bSBQbGFxdWVUeXBlIHtcbiAgICBXQUxMX1BMQVFVRSA9IFwiV0FMTF9QTEFRVUVcIixcbiAgICBNT05VTUVOVCA9IFwiTU9OVU1FTlRcIlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCYWRnZSBleHRlbmRzIElCYWRnZURhdGEge1xuICAgIHJlYWRvbmx5IHNlcnZlckdyb3VwOiBJU2VydmVyR3JvdXA7XG4gICAgcmVhZG9ubHkgcGFydGlhbHM/OiBJQmFkZ2VQYXJ0aWFsW107XG5cbiAgICBnZXRQYXJ0aWFsKGtleTogc3RyaW5nKTogSUJhZGdlUGFydGlhbCB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJhZGdlUGFydGlhbCBleHRlbmRzIElCYWRnZVBhcnRpYWxEYXRhIHtcbiAgICByZWFkb25seSBzZXJ2ZXJHcm91cDogSVNlcnZlckdyb3VwO1xuICAgIHJlYWRvbmx5IHBhcmVudDogSUJhZGdlO1xufVxuXG4iLCJleHBvcnQgZW51bSBFbmhhbmNlbWVudENhdGVnb3J5IHtcbiAgICBERUZFTlNFX0RFQlVGRiA9IFwiREVGRU5TRV9ERUJVRkZcIixcbiAgICBUT19ISVRfREVCVUZGID0gXCJUT19ISVRfREVCVUZGXCIsXG4gICAgVEFVTlQgPSBcIlRBVU5UXCIsXG4gICAgQ09ORlVTRSA9IFwiQ09ORlVTRVwiLFxuICAgIEhFQUxJTkcgPSBcIkhFQUxJTkdcIixcbiAgICBERUZFTlNFX0JVRkYgPSBcIkRFRkVOU0VfQlVGRlwiLFxuICAgIFJFU0lTVF9EQU1BR0UgPSBcIlJFU0lTVF9EQU1BR0VcIixcbiAgICBJTlRBTkdJQklMSVRZID0gXCJJTlRBTkdJQklMSVRZXCIsXG4gICAgU0xFRVAgPSBcIlNMRUVQXCIsXG4gICAgU0xPVyA9IFwiU0xPV1wiLFxuICAgIEhPTEQgPSBcIkhPTERcIixcbiAgICBTVFVOID0gXCJTVFVOXCIsXG4gICAgSU1NT0JJTElaRSA9IFwiSU1NT0JJTElaRVwiLFxuICAgIEZFQVIgPSBcIkZFQVJcIixcbiAgICBFTkRVUkFOQ0VfTU9ESUZJQ0FUSU9OID0gXCJFTkRVUkFOQ0VfTU9ESUZJQ0FUSU9OXCIsXG4gICAgRU5EVVJBTkNFX1JFRFVDVElPTiA9IFwiRU5EVVJBTkNFX1JFRFVDVElPTlwiLFxuICAgIFJFQ0hBUkdFX1JFRFVDVElPTiA9IFwiUkVDSEFSR0VfUkVEVUNUSU9OXCIsXG4gICAgSU5URVJSVVBUX0RVUkFUSU9OID0gXCJJTlRFUlJVUFRfRFVSQVRJT05cIixcbiAgICBBQ0NVUkFDWSA9IFwiQUNDVVJBQ1lcIixcbiAgICBUT19ISVRfQlVGRiA9IFwiVE9fSElUX0JVRkZcIixcbiAgICBEQU1BR0UgPSBcIkRBTUFHRVwiLFxuICAgIEtOT0NLQkFDSyA9IFwiS05PQ0tCQUNLXCIsXG4gICAgUlVOX1NQRUVEID0gXCJSVU5fU1BFRURcIixcbiAgICBKVU1QID0gXCJKVU1QXCIsXG4gICAgRkxZX1NQRUVEID0gXCJGTFlfU1BFRURcIixcbiAgICBSQU5HRSA9IFwiUkFOR0VcIlxufVxuIiwiaW1wb3J0IHtJQmFkZ2UsIElCYWRnZURhdGF9IGZyb20gXCIuL2JhZGdlXCI7XG5pbXBvcnQge0lHYW1lTWFwLCBJR2FtZU1hcERhdGF9IGZyb20gXCIuL2dhbWUtbWFwXCI7XG5pbXBvcnQge0lBcmNoZXR5cGUsIElBcmNoZXR5cGVEYXRhfSBmcm9tIFwiLi9hcmNoZXR5cGVcIjtcblxuLyoqXG4gKiBBIHNlcnZlciBncm91cCBpcyBhIGNvbGxlY3Rpb24gb2YgZ2FtZSBzZXJ2ZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTZXJ2ZXJHcm91cERhdGEge1xuICAgIC8qKlxuICAgICAqIEtleS5cbiAgICAgKi9cbiAgICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBzZXJ2ZXIgZ3JvdXAuXG4gICAgICovXG4gICAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgc2VydmVyIGdyb3VwLiBNYXJrZG93biBhbGxvd2VkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU3RhdHVzIG9mIHRoZSBjb250ZW50IG1vZHVsZS4ge0BzZWUgU2VydmVyR3JvdXBTdGF0dXN9LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHN0YXR1cz86IFNlcnZlckdyb3VwU3RhdHVzW107XG5cbiAgICAvKipcbiAgICAgKiBSZXBvc2l0b3J5IHdoZXJlIHRoZSBkYiBjb250ZW50IHBhY2thZ2UgaXMgbWFpbnRhaW5lZC5cbiAgICAgKi9cbiAgICByZWFkb25seSByZXBvc2l0b3J5Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiB0aGUgbmFtZXMgb2YgdGhlIHNlcnZlcnMgaW4gdGhpcyBncm91cC5cbiAgICAgKiBUb3JjaGJlYXJlciwgRXhjZWxzaW9yLCBldGMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2VydmVycz86IElTZXJ2ZXJEYXRhW107XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGFyY2hldHlwZXMgYXZhaWxhYmxlIG9uIHRoaXMgZ3JvdXAuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXJjaGV0eXBlcz86IElBcmNoZXR5cGVEYXRhW107XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGdhbWUgbWFwcyBzdXBwb3J0ZWQgYnkgdGhpcyBzZXJ2ZXIgZ3JvdXAuXG4gICAgICovXG4gICAgcmVhZG9ubHkgbWFwcz86IElHYW1lTWFwRGF0YVtdO1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBiYWRnZXMgYXZhaWxhYmxlIG9uIHRoaXMgc2VydmVyIGdyb3VwLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGJhZGdlcz86IElCYWRnZURhdGFbXTtcblxuICAgIC8qKlxuICAgICAqIENoYW5nZSBsb2cuXG4gICAgICovXG4gICAgcmVhZG9ubHkgY2hhbmdlbG9nPzogeyBbaWQ6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZXJ2ZXJEYXRhIHtcbiAgICBuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBlbnVtIFNlcnZlckdyb3VwU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBQYWNrYWdlIGlzIHN0aWxsIGJlaW5nIGRldmVsb3BlZCwgYW5kIG1heSBiZSBtaXNzaW5nIHNvbWUgZGF0YSBvciBzb21lIGRhdGEgbWF5IGJlIGluYWNjdXJhdGUuXG4gICAgICovXG4gICAgV09SS19JTl9QUk9HUkVTUyA9IFwiV09SS19JTl9QUk9HUkVTU1wiLFxuXG4gICAgLyoqXG4gICAgICogVGhpcyBzZXJ2ZXIgZ3JvdXAgaGFzIGJlZW4gc3Vuc2V0LCBhbmQgaXMgbm90IGxvbmdlciBiZWluZyBtYWludGFpbmVkL2RldmVsb3BlZC5cbiAgICAgKi9cbiAgICBTVU5TRVQgPSBcIlNVTlNFVFwiXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlcnZlckdyb3VwIGV4dGVuZHMgSVNlcnZlckdyb3VwRGF0YSB7XG4gICAgcmVhZG9ubHkgc2VydmVycz86IElTZXJ2ZXJbXTtcbiAgICByZWFkb25seSBhcmNoZXR5cGVzPzogSUFyY2hldHlwZVtdO1xuICAgIHJlYWRvbmx5IG1hcHM/OiBJR2FtZU1hcFtdO1xuICAgIHJlYWRvbmx5IGJhZGdlcz86IElCYWRnZVtdO1xuXG4gICAgZ2V0QXJjaGV0eXBlKGtleTogc3RyaW5nKTogSUFyY2hldHlwZSB8IG51bGw7XG5cbiAgICBnZXRNYXAoa2V5OiBzdHJpbmcpOiBJR2FtZU1hcCB8IG51bGw7XG5cbiAgICBnZXRCYWRnZShrZXk6IHN0cmluZyk6IElCYWRnZSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlcnZlciBleHRlbmRzIElTZXJ2ZXJEYXRhIHtcblxufVxuIiwiaW1wb3J0ICogYXMgXyBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQge0lTZXJ2ZXJHcm91cCwgSVNlcnZlckdyb3VwRGF0YX0gZnJvbSBcIi4vdHlwZXMvc2VydmVyLWdyb3VwXCI7XG5pbXBvcnQge2dldE9yRGVmaW5lfSBmcm9tIFwiLi9pbnRlcm5hbC9fY29tbW9uXCI7XG5pbXBvcnQge1NlcnZlckdyb3VwfSBmcm9tIFwiLi9pbnRlcm5hbC9zZXJ2ZXItZ3JvdXBcIjtcblxuaW50ZXJmYWNlIElDb2hDb250ZW50RGIge1xuICAgIC8qKlxuICAgICAqIExvYWQgc2VydmVyIGdyb3VwIGRhdGEgcGFja2FnZSBpbnRvIHRoZSBkYXRhYmFzZS5cbiAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBsb2FkLlxuICAgICAqL1xuICAgIGxvYWQoZGF0YTogSVNlcnZlckdyb3VwRGF0YSk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIHRoZSBzZXJ2ZXIgZ3JvdXBzIGN1cnJlbnRseSBsb2FkZWQgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIGdldFNlcnZlckdyb3VwcygpOiBJU2VydmVyR3JvdXBbXTtcblxuICAgIC8qKlxuICAgICAqIGdldCBhIHNlcnZlciBncm91cCBieSBrZXkuXG4gICAgICogQHBhcmFtIHNlcnZlckdyb3VwS2V5IFRoZSBrZXkuXG4gICAgICovXG4gICAgZ2V0U2VydmVyR3JvdXAoc2VydmVyR3JvdXBLZXk6IHN0cmluZyk6IElTZXJ2ZXJHcm91cCB8IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBDb2hDb250ZW50RGIgaW1wbGVtZW50cyBJQ29oQ29udGVudERiIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlcnZlckdyb3VwczogeyBbaWQ6IHN0cmluZ106IFNlcnZlckdyb3VwIH0gPSB7fTtcblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgbG9hZChkYXRhOiBJU2VydmVyR3JvdXBEYXRhKSB7XG4gICAgICAgIGNvbnN0IHNlcnZlckdyb3VwID0gZ2V0T3JEZWZpbmUoZGF0YS5rZXksIHRoaXMuc2VydmVyR3JvdXBzLCAoa2V5KSA9PiBuZXcgU2VydmVyR3JvdXAoa2V5KSk7XG4gICAgICAgIHNlcnZlckdyb3VwLmxvYWQoZGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBnZXRTZXJ2ZXJHcm91cHMoKTogSVNlcnZlckdyb3VwW10ge1xuICAgICAgICByZXR1cm4gXy52YWx1ZXModGhpcy5zZXJ2ZXJHcm91cHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgZ2V0U2VydmVyR3JvdXAoc2VydmVyR3JvdXBLZXk6IHN0cmluZyk6IElTZXJ2ZXJHcm91cCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXJ2ZXJHcm91cHNbc2VydmVyR3JvdXBLZXldO1xuICAgIH1cbn1cbiIsImltcG9ydCB7SUJhZGdlLCBJR2FtZU1hcCwgSVNlcnZlciwgSVNlcnZlckdyb3VwLCBJU2VydmVyR3JvdXBEYXRhLCBTZXJ2ZXJHcm91cFN0YXR1c30gZnJvbSBcIi4uXCI7XG5pbXBvcnQge0lBcmNoZXR5cGV9IGZyb20gXCIuLi90eXBlcy9hcmNoZXR5cGVcIjtcbmltcG9ydCAqIGFzIF8gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IHtBcmNoZXR5cGV9IGZyb20gXCIuL2FyY2hldHlwZVwiO1xuaW1wb3J0IHtHYW1lTWFwfSBmcm9tIFwiLi9nYW1lLW1hcFwiO1xuaW1wb3J0IHtCYWRnZX0gZnJvbSBcIi4vYmFkZ2VcIjtcbmltcG9ydCB7Z2V0T3JEZWZpbmUsIHZhbGlkYXRlS2V5fSBmcm9tIFwiLi9fY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJHcm91cCBpbXBsZW1lbnRzIElTZXJ2ZXJHcm91cCB7XG4gICAgcHVibGljIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAgIHB1YmxpYyBuYW1lPzogc3RyaW5nO1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBwdWJsaWMgc3RhdHVzPzogU2VydmVyR3JvdXBTdGF0dXNbXTtcbiAgICBwdWJsaWMgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgICBwdWJsaWMgc2VydmVycz86IElTZXJ2ZXJbXTtcbiAgICBwdWJsaWMgYXJjaGV0eXBlczogSUFyY2hldHlwZVtdID0gW107XG4gICAgcHVibGljIG1hcHM6IElHYW1lTWFwW10gPSBbXTtcbiAgICBwdWJsaWMgYmFkZ2VzOiBJQmFkZ2VbXSA9IFtdO1xuICAgIHB1YmxpYyBjaGFuZ2Vsb2c6IHsgW2lkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuXG4gICAgcHJpdmF0ZSBhcmNoZXR5cGVDYWNoZTogeyBbaWQ6IHN0cmluZ106IEFyY2hldHlwZSB9ID0ge307XG4gICAgcHJpdmF0ZSBtYXBDYWNoZTogeyBbaWQ6IHN0cmluZ106IEdhbWVNYXAgfSA9IHt9O1xuICAgIHByaXZhdGUgYmFkZ2VDYWNoZTogeyBbaWQ6IHN0cmluZ106IEJhZGdlIH0gPSB7fTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihrZXk6IHN0cmluZykge1xuICAgICAgICB2YWxpZGF0ZUtleShrZXkpO1xuXG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGRhdGE6IElTZXJ2ZXJHcm91cERhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEubmFtZSAhPSB1bmRlZmluZWQpIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICAgICAgaWYgKGRhdGEuZGVzY3JpcHRpb24gIT0gdW5kZWZpbmVkKSB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbjtcbiAgICAgICAgaWYgKGRhdGEuc3RhdHVzICE9IHVuZGVmaW5lZCkgdGhpcy5zdGF0dXMgPSBkYXRhLnN0YXR1cztcbiAgICAgICAgaWYgKGRhdGEucmVwb3NpdG9yeSAhPSB1bmRlZmluZWQpIHRoaXMucmVwb3NpdG9yeSA9IGRhdGEucmVwb3NpdG9yeTtcbiAgICAgICAgaWYgKGRhdGEuc2VydmVycyAhPSB1bmRlZmluZWQpIHRoaXMuc2VydmVycyA9IGRhdGEuc2VydmVycztcblxuICAgICAgICBpZiAoZGF0YS5hcmNoZXR5cGVzICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgXy5lYWNoKGRhdGEuYXJjaGV0eXBlcywgZGF0YSA9PlxuICAgICAgICAgICAgICAgIGdldE9yRGVmaW5lKGRhdGEua2V5LCB0aGlzLmFyY2hldHlwZUNhY2hlLCAoa2V5KSA9PiBuZXcgQXJjaGV0eXBlKHRoaXMsIGtleSkpXG4gICAgICAgICAgICAgICAgICAgIC5sb2FkKGRhdGEpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5hcmNoZXR5cGVzID0gXy52YWx1ZXModGhpcy5hcmNoZXR5cGVDYWNoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YS5tYXBzICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgXy5lYWNoKGRhdGEubWFwcywgZGF0YSA9PlxuICAgICAgICAgICAgICAgIGdldE9yRGVmaW5lKGRhdGEua2V5LCB0aGlzLm1hcENhY2hlLCAoa2V5KSA9PiBuZXcgR2FtZU1hcCh0aGlzLCBrZXkpKVxuICAgICAgICAgICAgICAgICAgICAubG9hZChkYXRhKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMubWFwcyA9IF8udmFsdWVzKHRoaXMubWFwQ2FjaGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEuYmFkZ2VzICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgXy5lYWNoKGRhdGEuYmFkZ2VzLCBkYXRhID0+XG4gICAgICAgICAgICAgICAgZ2V0T3JEZWZpbmUoZGF0YS5rZXksIHRoaXMuYmFkZ2VDYWNoZSwgKGtleSkgPT4gbmV3IEJhZGdlKHRoaXMsIGtleSkpXG4gICAgICAgICAgICAgICAgICAgIC5sb2FkKGRhdGEpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5iYWRnZXMgPSBfLnZhbHVlcyh0aGlzLmJhZGdlQ2FjaGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEuY2hhbmdlbG9nKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWxvZyA9IGRhdGEuY2hhbmdlbG9nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFyY2hldHlwZShrZXk6IHN0cmluZyk6IElBcmNoZXR5cGUgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJjaGV0eXBlQ2FjaGVba2V5XTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TWFwKGtleTogc3RyaW5nKTogSUdhbWVNYXAgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwQ2FjaGVba2V5XTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QmFkZ2Uoa2V5OiBzdHJpbmcpOiBJQmFkZ2UgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFkZ2VDYWNoZVtrZXldO1xuICAgIH1cbn1cbiIsImltcG9ydCB7SUFyY2hldHlwZSwgSUFyY2hldHlwZURhdGF9IGZyb20gXCIuLi90eXBlcy9hcmNoZXR5cGVcIjtcbmltcG9ydCB7dmFsaWRhdGVLZXl9IGZyb20gXCIuL19jb21tb25cIjtcbmltcG9ydCB7U2VydmVyR3JvdXB9IGZyb20gXCIuL3NlcnZlci1ncm91cFwiO1xuXG5leHBvcnQgY2xhc3MgQXJjaGV0eXBlIGltcGxlbWVudHMgSUFyY2hldHlwZSB7XG4gICAgcHVibGljIHJlYWRvbmx5IHNlcnZlckdyb3VwOiBTZXJ2ZXJHcm91cDtcbiAgICBwdWJsaWMgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcHVibGljIG5hbWU/OiBzdHJpbmc7XG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3Ioc2VydmVyR3JvdXA6IFNlcnZlckdyb3VwLCBrZXk6IHN0cmluZykge1xuICAgICAgICB2YWxpZGF0ZUtleShrZXkpO1xuXG4gICAgICAgIHRoaXMuc2VydmVyR3JvdXAgPSBzZXJ2ZXJHcm91cDtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoZGF0YTogSUFyY2hldHlwZURhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEubmFtZSAhPSB1bmRlZmluZWQpIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICAgICAgaWYgKGRhdGEuZGVzY3JpcHRpb24gIT0gdW5kZWZpbmVkKSB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbjtcbiAgICB9XG59XG4iLCJpbXBvcnQge0lHYW1lTWFwLCBJR2FtZU1hcERhdGEsIElMaW5rLCBJVmlkaW90TWFwLCBJVmlkaW90TWFwRGF0YSwgSVZpZGlvdE1hcFBvaSwgSVZpZGlvdE1hcFBvaURhdGF9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHtTZXJ2ZXJHcm91cH0gZnJvbSBcIi4vc2VydmVyLWdyb3VwXCI7XG5pbXBvcnQge3ZhbGlkYXRlS2V5fSBmcm9tIFwiLi9fY29tbW9uXCI7XG5pbXBvcnQge2VhY2h9IGZyb20gXCJsb2Rhc2hcIjtcblxuZXhwb3J0IGNsYXNzIEdhbWVNYXAgaW1wbGVtZW50cyBJR2FtZU1hcCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHNlcnZlckdyb3VwOiBTZXJ2ZXJHcm91cDtcbiAgICBwdWJsaWMgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgICBwdWJsaWMgbGlua3M/OiBJTGlua1tdO1xuICAgIHB1YmxpYyB2aWRpb3RNYXBzPzogSVZpZGlvdE1hcFtdID0gW107XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3Ioc2VydmVyR3JvdXA6IFNlcnZlckdyb3VwLCBrZXk6IHN0cmluZykge1xuICAgICAgICB2YWxpZGF0ZUtleShrZXkpO1xuXG4gICAgICAgIHRoaXMuc2VydmVyR3JvdXAgPSBzZXJ2ZXJHcm91cDtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoZGF0YTogSUdhbWVNYXBEYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLm5hbWUgIT0gdW5kZWZpbmVkKSB0aGlzLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgICAgIGlmIChkYXRhLmxpbmtzICE9IHVuZGVmaW5lZCkgdGhpcy5saW5rcyA9IFsuLi50aGlzLmxpbmtzIHx8IFtdLCAuLi5kYXRhLmxpbmtzXTtcblxuICAgICAgICBpZiAoZGF0YS52aWRpb3RNYXBzKSB7XG4gICAgICAgICAgICBlYWNoKGRhdGEudmlkaW90TWFwcywgKHZpZGlvdE1hcERhdGEpID0+IHRoaXMudmlkaW90TWFwcy5wdXNoKG5ldyBWaWRpb3RNYXAodGhpcy5zZXJ2ZXJHcm91cCwgdGhpcykubG9hZCh2aWRpb3RNYXBEYXRhKSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVmlkaW90TWFwIGltcGxlbWVudHMgSVZpZGlvdE1hcCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHNlcnZlckdyb3VwOiBTZXJ2ZXJHcm91cDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWFwOiBJR2FtZU1hcDtcbiAgICBwdWJsaWMgaHJlZjogc3RyaW5nO1xuICAgIHB1YmxpYyBuYW1lPzogc3RyaW5nO1xuICAgIHB1YmxpYyBwb2ludHNPZkludGVyZXN0OiBWaWRpb3RNYXBQb2lbXSA9IFtdO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHNlcnZlckdyb3VwOiBTZXJ2ZXJHcm91cCwgbWFwOiBJR2FtZU1hcCkge1xuICAgICAgICB0aGlzLnNlcnZlckdyb3VwID0gc2VydmVyR3JvdXA7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGRhdGE6IElWaWRpb3RNYXBEYXRhKTogVmlkaW90TWFwIHtcbiAgICAgICAgaWYgKGRhdGEuaHJlZiAhPSB1bmRlZmluZWQpIHRoaXMuaHJlZiA9IGRhdGEuaHJlZjtcbiAgICAgICAgaWYgKGRhdGEubmFtZSAhPSB1bmRlZmluZWQpIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcblxuICAgICAgICBpZiAoZGF0YS5wb2ludHNPZkludGVyZXN0KSB7XG4gICAgICAgICAgICBlYWNoKGRhdGEucG9pbnRzT2ZJbnRlcmVzdCwgKHBvaURhdGEpID0+IHRoaXMucG9pbnRzT2ZJbnRlcmVzdC5wdXNoKG5ldyBWaWRpb3RNYXBQb2kodGhpcy5zZXJ2ZXJHcm91cCwgdGhpcy5tYXAsIHRoaXMpLmxvYWQocG9pRGF0YSkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZpZGlvdE1hcFBvaSBpbXBsZW1lbnRzIElWaWRpb3RNYXBQb2kge1xuICAgIHB1YmxpYyByZWFkb25seSBzZXJ2ZXJHcm91cDogU2VydmVyR3JvdXA7XG4gICAgcHVibGljIHJlYWRvbmx5IG1hcDogSUdhbWVNYXA7XG4gICAgcHVibGljIHJlYWRvbmx5IHZpZGlvdE1hcDogSVZpZGlvdE1hcDtcbiAgICBwdWJsaWMgeDogbnVtYmVyO1xuICAgIHB1YmxpYyB5OiBudW1iZXI7XG4gICAgcHVibGljIG5vdGVzPzogc3RyaW5nO1xuICAgIHB1YmxpYyBtYXBLZXk/OiBzdHJpbmc7XG4gICAgcHVibGljIGJhZGdlS2V5Pzogc3RyaW5nO1xuICAgIHB1YmxpYyBiYWRnZVBhcnRpYWxLZXk/OiBzdHJpbmc7XG5cblxuICAgIGNvbnN0cnVjdG9yKHNlcnZlckdyb3VwOiBTZXJ2ZXJHcm91cCwgbWFwOiBJR2FtZU1hcCwgdmlkaW90TWFwOiBJVmlkaW90TWFwKSB7XG4gICAgICAgIHRoaXMuc2VydmVyR3JvdXAgPSBzZXJ2ZXJHcm91cDtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMudmlkaW90TWFwID0gdmlkaW90TWFwO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGRhdGE6IElWaWRpb3RNYXBQb2lEYXRhKTogVmlkaW90TWFwUG9pIHtcbiAgICAgICAgaWYgKGRhdGEueCAhPSB1bmRlZmluZWQpIHRoaXMueCA9IGRhdGEueDtcbiAgICAgICAgaWYgKGRhdGEueSAhPSB1bmRlZmluZWQpIHRoaXMueSA9IGRhdGEueTtcbiAgICAgICAgaWYgKGRhdGEubm90ZXMgIT0gdW5kZWZpbmVkKSB0aGlzLm5vdGVzID0gZGF0YS5ub3RlcztcbiAgICAgICAgaWYgKGRhdGEubWFwS2V5ICE9IHVuZGVmaW5lZCkgdGhpcy5tYXBLZXkgPSBkYXRhLm1hcEtleTtcbiAgICAgICAgaWYgKGRhdGEuYmFkZ2VLZXkgIT0gdW5kZWZpbmVkKSB0aGlzLmJhZGdlS2V5ID0gZGF0YS5iYWRnZUtleTtcbiAgICAgICAgaWYgKGRhdGEuYmFkZ2VQYXJ0aWFsS2V5ICE9IHVuZGVmaW5lZCkgdGhpcy5iYWRnZVBhcnRpYWxLZXkgPSBkYXRhLmJhZGdlUGFydGlhbEtleTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4iLCJpbXBvcnQge0JhZGdlUGFydGlhbFR5cGUsIEJhZGdlVHlwZSwgRW5oYW5jZW1lbnRDYXRlZ29yeSwgSUFsaWdubWVudEZsYWdzLCBJQWx0ZXJuYXRlVmFsdWUsIElCYWRnZSwgSUJhZGdlRGF0YSwgSUJhZGdlUGFydGlhbCwgSUJhZGdlUGFydGlhbERhdGEsIElMaW5rLCBQbGFxdWVUeXBlfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7U2VydmVyR3JvdXB9IGZyb20gXCIuL3NlcnZlci1ncm91cFwiO1xuaW1wb3J0IHtnZXRPckRlZmluZSwgdmFsaWRhdGVLZXl9IGZyb20gXCIuL19jb21tb25cIjtcbmltcG9ydCAqIGFzIF8gZnJvbSBcImxvZGFzaFwiO1xuXG5leHBvcnQgY2xhc3MgQmFkZ2UgaW1wbGVtZW50cyBJQmFkZ2Uge1xuICAgIHB1YmxpYyByZWFkb25seSBzZXJ2ZXJHcm91cDogU2VydmVyR3JvdXA7XG4gICAgcHVibGljIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAgIHB1YmxpYyB0eXBlPzogQmFkZ2VUeXBlO1xuICAgIHB1YmxpYyBuYW1lcz86IElBbHRlcm5hdGVWYWx1ZVtdO1xuICAgIHB1YmxpYyBhbGlnbm1lbnQ/OiBJQWxpZ25tZW50RmxhZ3M7XG4gICAgcHVibGljIGJhZGdlVGV4dD86IElBbHRlcm5hdGVWYWx1ZVtdO1xuICAgIHB1YmxpYyBhY3F1aXNpdGlvbj86IHN0cmluZztcbiAgICBwdWJsaWMgaWNvbnM/OiBJQWx0ZXJuYXRlVmFsdWVbXTtcbiAgICBwdWJsaWMgbm90ZXM/OiBzdHJpbmc7XG4gICAgcHVibGljIGxpbmtzPzogSUxpbmtbXTtcbiAgICBwdWJsaWMgbWFwS2V5Pzogc3RyaW5nO1xuICAgIHB1YmxpYyBsb2NhdGlvbj86IG51bWJlcltdO1xuICAgIHB1YmxpYyB2aWRpb3RNYXBLZXk/OiBzdHJpbmc7XG4gICAgcHVibGljIHNldFRpdGxlSWQ/OiBudW1iZXI7XG4gICAgcHVibGljIHNldFRpdGxlSWRQcmFldG9yaWFuPzogbnVtYmVyO1xuICAgIHB1YmxpYyBlZmZlY3Q/OiBzdHJpbmc7XG4gICAgcHVibGljIHBhcnRpYWxzPzogQmFkZ2VQYXJ0aWFsW107XG4gICAgcHVibGljIGlnbm9yZUluVG90YWxzPzogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgcGFydGlhbENhY2hlOiB7IFtpZDogc3RyaW5nXTogQmFkZ2VQYXJ0aWFsIH0gPSB7fTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXJ2ZXJHcm91cDogU2VydmVyR3JvdXAsIGtleTogc3RyaW5nKSB7XG4gICAgICAgIHZhbGlkYXRlS2V5KGtleSk7XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXJHcm91cCA9IHNlcnZlckdyb3VwO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChkYXRhOiBJQmFkZ2VEYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLnR5cGUgIT0gdW5kZWZpbmVkKSB0aGlzLnR5cGUgPSBkYXRhLnR5cGU7XG4gICAgICAgIGlmIChkYXRhLm5hbWVzICE9IHVuZGVmaW5lZCkgdGhpcy5uYW1lcyA9IFsuLi50aGlzLm5hbWVzIHx8IFtdLCAuLi5kYXRhLm5hbWVzXTtcbiAgICAgICAgaWYgKGRhdGEuYWxpZ25tZW50ICE9IHVuZGVmaW5lZCkgdGhpcy5hbGlnbm1lbnQgPSBkYXRhLmFsaWdubWVudDtcbiAgICAgICAgaWYgKGRhdGEuYmFkZ2VUZXh0ICE9IHVuZGVmaW5lZCkgdGhpcy5iYWRnZVRleHQgPSBbLi4udGhpcy5iYWRnZVRleHQgfHwgW10sIC4uLmRhdGEuYmFkZ2VUZXh0XTtcbiAgICAgICAgaWYgKGRhdGEuYWNxdWlzaXRpb24gIT0gdW5kZWZpbmVkKSB0aGlzLmFjcXVpc2l0aW9uID0gZGF0YS5hY3F1aXNpdGlvbjtcbiAgICAgICAgaWYgKGRhdGEuaWNvbnMgIT0gdW5kZWZpbmVkKSB0aGlzLmljb25zID0gWy4uLnRoaXMuaWNvbnMgfHwgW10sIC4uLmRhdGEuaWNvbnNdO1xuICAgICAgICBpZiAoZGF0YS5ub3RlcyAhPSB1bmRlZmluZWQpIHRoaXMubm90ZXMgPSBkYXRhLm5vdGVzO1xuICAgICAgICBpZiAoZGF0YS5saW5rcyAhPSB1bmRlZmluZWQpIHRoaXMubGlua3MgPSBbLi4udGhpcy5saW5rcyB8fCBbXSwgLi4uZGF0YS5saW5rc107XG4gICAgICAgIGlmIChkYXRhLm1hcEtleSAhPSB1bmRlZmluZWQpIHRoaXMubWFwS2V5ID0gZGF0YS5tYXBLZXk7XG4gICAgICAgIGlmIChkYXRhLmxvY2F0aW9uICE9IHVuZGVmaW5lZCkgdGhpcy5sb2NhdGlvbiA9IGRhdGEubG9jYXRpb247XG4gICAgICAgIGlmIChkYXRhLmVmZmVjdCAhPSB1bmRlZmluZWQpIHRoaXMuZWZmZWN0ID0gZGF0YS5lZmZlY3Q7XG4gICAgICAgIGlmIChkYXRhLnZpZGlvdE1hcEtleSAhPSB1bmRlZmluZWQpIHRoaXMudmlkaW90TWFwS2V5ID0gZGF0YS52aWRpb3RNYXBLZXk7XG4gICAgICAgIGlmIChkYXRhLnNldFRpdGxlSWQgIT0gdW5kZWZpbmVkKSB0aGlzLnNldFRpdGxlSWQgPSBkYXRhLnNldFRpdGxlSWQ7XG4gICAgICAgIGlmIChkYXRhLnNldFRpdGxlSWRQcmFldG9yaWFuICE9IHVuZGVmaW5lZCkgdGhpcy5zZXRUaXRsZUlkUHJhZXRvcmlhbiA9IGRhdGEuc2V0VGl0bGVJZFByYWV0b3JpYW47XG4gICAgICAgIGlmIChkYXRhLmlnbm9yZUluVG90YWxzICE9IHVuZGVmaW5lZCkgdGhpcy5pZ25vcmVJblRvdGFscyA9IGRhdGEuaWdub3JlSW5Ub3RhbHM7XG5cbiAgICAgICAgaWYgKGRhdGEucGFydGlhbHMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBfLmVhY2goZGF0YS5wYXJ0aWFscywgZGF0YSA9PlxuICAgICAgICAgICAgICAgIGdldE9yRGVmaW5lKGRhdGEua2V5LCB0aGlzLnBhcnRpYWxDYWNoZSwgKGtleSkgPT4gbmV3IEJhZGdlUGFydGlhbCh0aGlzLnNlcnZlckdyb3VwLCB0aGlzLCBrZXkpKVxuICAgICAgICAgICAgICAgICAgICAubG9hZChkYXRhKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbHMgPSBfLnZhbHVlcyh0aGlzLnBhcnRpYWxDYWNoZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFydGlhbChrZXk6IHN0cmluZyk6IElCYWRnZVBhcnRpYWwgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbENhY2hlW2tleV07XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmFkZ2VQYXJ0aWFsIGltcGxlbWVudHMgSUJhZGdlUGFydGlhbCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHNlcnZlckdyb3VwOiBTZXJ2ZXJHcm91cDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGFyZW50OiBCYWRnZTtcbiAgICBwdWJsaWMgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcHVibGljIHR5cGU/OiBCYWRnZVBhcnRpYWxUeXBlO1xuICAgIHB1YmxpYyBtYXBLZXk/OiBzdHJpbmc7XG4gICAgcHVibGljIGxvY2F0aW9uPzogbnVtYmVyW107XG4gICAgcHVibGljIHBsYXF1ZVR5cGU/OiBQbGFxdWVUeXBlO1xuICAgIHB1YmxpYyBpbnNjcmlwdGlvbj86IHN0cmluZztcbiAgICBwdWJsaWMgdmlkaW90TWFwS2V5Pzogc3RyaW5nO1xuICAgIHB1YmxpYyBiYWRnZUtleT86IHN0cmluZztcbiAgICBwdWJsaWMgaW52ZW50aW9uTGV2ZWw/OiBudW1iZXI7XG4gICAgcHVibGljIGludmVudGlvblR5cGVzPzogRW5oYW5jZW1lbnRDYXRlZ29yeVtdO1xuICAgIHB1YmxpYyBjb3VudD86IG51bWJlcjtcbiAgICBwdWJsaWMgbm90ZXM/OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihzZXJ2ZXJHcm91cDogU2VydmVyR3JvdXAsIHBhcmVudDogQmFkZ2UsIGtleTogc3RyaW5nKSB7XG4gICAgICAgIHZhbGlkYXRlS2V5KGtleSk7XG5cbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMuc2VydmVyR3JvdXAgPSBzZXJ2ZXJHcm91cDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoZGF0YTogSUJhZGdlUGFydGlhbERhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEudHlwZSAhPSB1bmRlZmluZWQpIHRoaXMudHlwZSA9IGRhdGEudHlwZTtcbiAgICAgICAgaWYgKGRhdGEubWFwS2V5ICE9IHVuZGVmaW5lZCkgdGhpcy5tYXBLZXkgPSBkYXRhLm1hcEtleTtcbiAgICAgICAgaWYgKGRhdGEubG9jYXRpb24gIT0gdW5kZWZpbmVkKSB0aGlzLmxvY2F0aW9uID0gZGF0YS5sb2NhdGlvbjtcbiAgICAgICAgaWYgKGRhdGEucGxhcXVlVHlwZSAhPSB1bmRlZmluZWQpIHRoaXMucGxhcXVlVHlwZSA9IGRhdGEucGxhcXVlVHlwZTtcbiAgICAgICAgaWYgKGRhdGEuaW5zY3JpcHRpb24gIT0gdW5kZWZpbmVkKSB0aGlzLmluc2NyaXB0aW9uID0gZGF0YS5pbnNjcmlwdGlvbjtcbiAgICAgICAgaWYgKGRhdGEudmlkaW90TWFwS2V5ICE9IHVuZGVmaW5lZCkgdGhpcy52aWRpb3RNYXBLZXkgPSBkYXRhLnZpZGlvdE1hcEtleTtcbiAgICAgICAgaWYgKGRhdGEuYmFkZ2VLZXkgIT0gdW5kZWZpbmVkKSB0aGlzLmJhZGdlS2V5ID0gZGF0YS5iYWRnZUtleTtcbiAgICAgICAgaWYgKGRhdGEuaW52ZW50aW9uTGV2ZWwgIT0gdW5kZWZpbmVkKSB0aGlzLmludmVudGlvbkxldmVsID0gZGF0YS5pbnZlbnRpb25MZXZlbDtcbiAgICAgICAgaWYgKGRhdGEuaW52ZW50aW9uVHlwZXMgIT0gdW5kZWZpbmVkKSB0aGlzLmludmVudGlvblR5cGVzID0gZGF0YS5pbnZlbnRpb25UeXBlcztcbiAgICAgICAgaWYgKGRhdGEuY291bnQgIT0gdW5kZWZpbmVkKSB0aGlzLmNvdW50ID0gZGF0YS5jb3VudDtcbiAgICAgICAgaWYgKGRhdGEubm90ZXMgIT0gdW5kZWZpbmVkKSB0aGlzLm5vdGVzID0gZGF0YS5ub3RlcztcbiAgICB9XG59XG4iLCJleHBvcnQgY29uc3QgQ2hhbmdlbG9nOiB7IFtpZDogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgXCIxLjAuMFwiOiBcIiogSW5pdGlhbCByZWxlYXNlLlwiLFxuICAgIFwiMS4wLjFcIjogXCIqIFR5cGUgZW5jYXBzdWxhdGlvbiBmb3IgU2VydmVyRGF0YSBhbmQgQXJjaGV0eXBlLlwiLFxuXG4gICAgXCIxLjEuMFwiOiBcIiogQmFkZ2UgaWNvbnMgYXJlIG5vdyB1cmxzIGluc3RlYWQgb2Yga2V5cy5cXG5cIiArXG4gICAgICAgIFwiKiBCYWRnZSBpY29ucyBoYXZlIG1vdmVkIGZyb20gYGJhZGdlLmltYWdlS2V5c2AgdG8gYGJhZGdlLmljb25zYC5cXG5cIiArXG4gICAgICAgIFwiKiBDaGFuZ2Vsb2cgaXMgbm93IGp1c3QgYSBtYXJrZG93biBibG9jayBpbnN0ZWFkIG9mIGEgc3RyaW5nIGFycmF5LlxcblwiLFxuICAgIFwiMS4xLjFcIjogXCIqIGBJR2FtZU1hcC5saW5rc2AgaXMgbm93IG9wdGlvbmFsLlwiLFxuICAgIFwiMS4xLjJcIjogXCIqIGh0dHBzOi8vZ2l0aHViLmNvbS9uMTVnL2NvaC1jb250ZW50LWRiL2lzc3Vlcy8zIC0gQWRkZWQgYHNldFRpdGxlSWRgIHByb3BlcnR5IGZvciBiYWRnZXMuIFVzZWQgdG8gc3RvcmUgdGhlIGBzZXR0aXRsZWAgc2xhc2ggY29tbWFuZCBudW1iZXIgb2YgdGhlIGJhZGdlLlwiLFxuICAgIFwiMS4xLjNcIjogXCIqIEFkZGVkIHNvbWUgY29udGVudCByZWZlcmVuY2UgdXRpbGl0eSBmdW5jdGlvbnMuXCIsXG5cbiAgICBcIjEuMi4wXCI6IFwiKiBodHRwczovL2dpdGh1Yi5jb20vbjE1Zy9jb2gtY29udGVudC1kYi9pc3N1ZXMvNCAtIEFkZGVkIGEgZmllbGQgYGlnbm9yZUluVG90YWxzYCB0byBgQmFkZ2VgLCBhbGxvd2luZyBiYWRnZXMgdG8gYmUgaWdub3JlZCBpbiBiYWRnZSB0b3RhbCBjYWxjdWxhdGlvbnMsIGZvciBiYWRnZXMgbGlrZVwiICtcbiAgICAgICAgXCIgW0ZsYW1lcyBvZiBQcm9tZXRoZXVzXSBhbmQgW0J1ZyBIdW50ZXJdLlwiLFxuXG4gICAgXCIxLjMuMVwiOiBcIiogaHR0cHM6Ly9naXRodWIuY29tL24xNWcvY29oLWNvbnRlbnQtZGIvaXNzdWVzLzUgLSBBZGRlZCB2aWRpb3QgbWFwIGRhdGEgdG8gbWFwcy5cIixcbiAgICBcIjEuMy4yXCI6IFwiKiBBZGRlZCBiYWRnZSBwYXJ0aWFsIHN1cHBvcnQgZm9yIHZpZGlvdCBtYXAgUE9Jcy5cIixcblxuICAgIFwiMS40LjBcIjogXCIqIGh0dHBzOi8vZ2l0aHViLmNvbS9uMTVnL2NvaC1jb250ZW50LWRiL2lzc3Vlcy83IC0gU2V0dGl0bGUgaWRzIGZvciBQcmFldG9yaWFuIGJhZGdlcy5cIlxufTtcbiIsImltcG9ydCB7SUJhZGdlRGF0YX0gZnJvbSBcIi4vdHlwZXMvYmFkZ2VcIjtcbmltcG9ydCB7SUdhbWVNYXBEYXRhfSBmcm9tIFwiLi90eXBlcy9nYW1lLW1hcFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gYmFkZ2VSZWZlcmVuY2UoYmFkZ2U6IElCYWRnZURhdGEpOiBzdHJpbmcge1xuICAgIHJldHVybiBgW2JhZGdlOiR7YmFkZ2Uua2V5fV1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwUmVmZXJlbmNlKG1hcDogSUdhbWVNYXBEYXRhKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFttYXA6JHttYXAua2V5fV1gO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==
1
+ 'use strict';
2
+
3
+ const ALIGNMENT = ["H", "V", "P"];
4
+
5
+ const BADGE_PARTIAL_TYPE = [
6
+ "PLAQUE",
7
+ "BADGE",
8
+ "INVENTION",
9
+ "INVENTION_PLUS_ONE"
10
+ // Some invention badges require you to build x of two different invention levels, 'plus one of either level'.
11
+ ];
12
+
13
+ const BADGE_TYPE = [
14
+ "EXPLORATION",
15
+ "HISTORY",
16
+ "ACCOMPLISHMENT",
17
+ "ACHIEVEMENT",
18
+ "ACCOLADE",
19
+ "GLADIATOR",
20
+ "VETERAN",
21
+ "PVP",
22
+ "INVENTION",
23
+ "DEFEAT",
24
+ "EVENT",
25
+ "OUROBOROS",
26
+ "CONSIGNMENT",
27
+ "DAY_JOB",
28
+ "AE"
29
+ ];
30
+
31
+ const ENHANCEMENT_CATEGORY = [
32
+ "DEFENSE_DEBUFF",
33
+ "TO_HIT_DEBUFF",
34
+ "TAUNT",
35
+ "CONFUSE",
36
+ "HEALING",
37
+ "DEFENSE_BUFF",
38
+ "RESIST_DAMAGE",
39
+ "INTANGIBILITY",
40
+ "SLEEP",
41
+ "SLOW",
42
+ "HOLD",
43
+ "STUN",
44
+ "IMMOBILIZE",
45
+ "FEAR",
46
+ "ENDURANCE_MODIFICATION",
47
+ "ENDURANCE_REDUCTION",
48
+ "RECHARGE_REDUCTION",
49
+ "INTERRUPT_DURATION",
50
+ "ACCURACY",
51
+ "TO_HIT_BUFF",
52
+ "DAMAGE",
53
+ "KNOCKBACK",
54
+ "RUN_SPEED",
55
+ "JUMP",
56
+ "FLY_SPEED",
57
+ "RANGE"
58
+ ];
59
+
60
+ const PLAQUE_TYPE = [
61
+ "WALL_PLAQUE",
62
+ "MONUMENT"
63
+ ];
64
+
65
+ const SEX = ["M", "F"];
66
+
67
+ var __typeError$4 = (msg) => {
68
+ throw TypeError(msg);
69
+ };
70
+ var __accessCheck$4 = (obj, member, msg) => member.has(obj) || __typeError$4("Cannot " + msg);
71
+ var __privateGet$4 = (obj, member, getter) => (__accessCheck$4(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
72
+ var __privateAdd$4 = (obj, member, value) => member.has(obj) ? __typeError$4("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
73
+ var __privateSet$1 = (obj, member, value, setter) => (__accessCheck$4(obj, member, "write to private field"), member.set(obj, value), value);
74
+ var __privateMethod$1 = (obj, member, method) => (__accessCheck$4(obj, member, "access private method"), method);
75
+ var _value, _Key_instances, validateKey_fn;
76
+ const INVALID_KEY_PATTERN = /[^a-z0-9-]/;
77
+ class Key {
78
+ constructor(value) {
79
+ __privateAdd$4(this, _Key_instances);
80
+ __privateAdd$4(this, _value);
81
+ __privateMethod$1(this, _Key_instances, validateKey_fn).call(this, value);
82
+ __privateSet$1(this, _value, value);
83
+ }
84
+ get value() {
85
+ return __privateGet$4(this, _value);
86
+ }
87
+ }
88
+ _value = new WeakMap();
89
+ _Key_instances = new WeakSet();
90
+ validateKey_fn = function(key) {
91
+ if (INVALID_KEY_PATTERN.test(key)) throw new Error(`Invalid key: [${key}]; Keys can only contain lowercase characters, numbers and dashes.`);
92
+ };
93
+
94
+ var __defProp$6 = Object.defineProperty;
95
+ var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
96
+ var __publicField$6 = (obj, key, value) => __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
97
+ class Archetype {
98
+ constructor(data) {
99
+ __publicField$6(this, "key");
100
+ __publicField$6(this, "name");
101
+ __publicField$6(this, "description");
102
+ this.key = new Key(data.key).value;
103
+ this.name = data.name;
104
+ this.description = data.description;
105
+ }
106
+ }
107
+
108
+ var __defProp$5 = Object.defineProperty;
109
+ var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
110
+ var __publicField$5 = (obj, key, value) => __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
111
+ class BadgePartial {
112
+ constructor(data) {
113
+ __publicField$5(this, "key");
114
+ __publicField$5(this, "type");
115
+ __publicField$5(this, "mapKey");
116
+ __publicField$5(this, "loc");
117
+ __publicField$5(this, "plaqueType");
118
+ __publicField$5(this, "inscription");
119
+ __publicField$5(this, "vidiotMapKey");
120
+ __publicField$5(this, "badgeKey");
121
+ __publicField$5(this, "inventionLevel");
122
+ __publicField$5(this, "inventionTypes");
123
+ __publicField$5(this, "inventionCount");
124
+ __publicField$5(this, "notes");
125
+ this.key = new Key(data.key).value;
126
+ this.type = data.type;
127
+ this.mapKey = data.mapKey;
128
+ this.loc = data.loc;
129
+ this.plaqueType = data.plaqueType;
130
+ this.inscription = data.inscription;
131
+ this.vidiotMapKey = data.vidiotMapKey;
132
+ this.badgeKey = data.badgeKey;
133
+ this.inventionLevel = data.inventionLevel;
134
+ this.inventionTypes = data.inventionTypes;
135
+ this.inventionCount = data.inventionCount;
136
+ this.notes = data.notes;
137
+ }
138
+ }
139
+
140
+ var __typeError$3 = (msg) => {
141
+ throw TypeError(msg);
142
+ };
143
+ var __accessCheck$3 = (obj, member, msg) => member.has(obj) || __typeError$3("Cannot " + msg);
144
+ var __privateGet$3 = (obj, member, getter) => (__accessCheck$3(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
145
+ var __privateAdd$3 = (obj, member, value) => member.has(obj) ? __typeError$3("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
146
+ var __privateSet = (obj, member, value, setter) => (__accessCheck$3(obj, member, "write to private field"), member.set(obj, value), value);
147
+ var __privateMethod = (obj, member, method) => (__accessCheck$3(obj, member, "access private method"), method);
148
+ var _sortedValues, _Alternates_instances, compareAlternates_fn, compareAlignment_fn, compareSex_fn;
149
+ const ALIGNMENT_SORT = { H: 2, V: 1, P: 0 };
150
+ const SEX_SORT = { M: 1, F: 0 };
151
+ class Alternates {
152
+ constructor(values) {
153
+ __privateAdd$3(this, _Alternates_instances);
154
+ __privateAdd$3(this, _sortedValues, []);
155
+ __privateSet(this, _sortedValues, values.sort());
156
+ __privateGet$3(this, _sortedValues).sort((a, b) => __privateMethod(this, _Alternates_instances, compareAlternates_fn).call(this, a, b));
157
+ }
158
+ getValue(alignment, sex) {
159
+ for (let index = __privateGet$3(this, _sortedValues).length; index--; ) {
160
+ const entry = __privateGet$3(this, _sortedValues)[index];
161
+ if ((entry.alignment === void 0 || entry.alignment === alignment) && (entry.sex === void 0 || entry.sex === sex)) return entry.value;
162
+ }
163
+ return void 0;
164
+ }
165
+ /**
166
+ * Get the default value for this list of alternates, the value with the highest priority and lowest specificity.
167
+ */
168
+ get default() {
169
+ return __privateGet$3(this, _sortedValues)[0]?.value;
170
+ }
171
+ /**
172
+ * Get the list of alternates sorted in canonical order (alignment then sex, low to high specificity).
173
+ */
174
+ get canonical() {
175
+ return __privateGet$3(this, _sortedValues);
176
+ }
177
+ }
178
+ _sortedValues = new WeakMap();
179
+ _Alternates_instances = new WeakSet();
180
+ compareAlternates_fn = function(a, b) {
181
+ const aSpecificity = (a.alignment ? 2 : 0) + (a.sex ? 1 : 0);
182
+ const bSpecificity = (b.alignment ? 2 : 0) + (b.sex ? 1 : 0);
183
+ if (aSpecificity !== bSpecificity) return aSpecificity - bSpecificity;
184
+ const alignmentComparison = __privateMethod(this, _Alternates_instances, compareAlignment_fn).call(this, a.alignment, b.alignment);
185
+ if (alignmentComparison !== 0) return alignmentComparison;
186
+ const sexComparison = __privateMethod(this, _Alternates_instances, compareSex_fn).call(this, a.sex, b.sex);
187
+ if (sexComparison !== 0) return sexComparison;
188
+ return String(a.value).localeCompare(String(b.value));
189
+ };
190
+ compareAlignment_fn = function(a, b) {
191
+ if (a === b) return 0;
192
+ if (a === void 0 && b !== void 0) return -1;
193
+ if (b === void 0 && a !== void 0) return 1;
194
+ const aSort = a === void 0 ? -1 : ALIGNMENT_SORT[a] ?? -1;
195
+ const bSort = b === void 0 ? -1 : ALIGNMENT_SORT[b] ?? -1;
196
+ if (aSort !== bSort) return bSort - aSort;
197
+ return a?.localeCompare(b ?? "") ?? 0;
198
+ };
199
+ compareSex_fn = function(a, b) {
200
+ if (a === b) return 0;
201
+ if (a === void 0 && b !== void 0) return -1;
202
+ if (b === void 0 && a !== void 0) return 1;
203
+ const aSort = SEX_SORT[a ?? -1] ?? -1;
204
+ const bSort = SEX_SORT[b ?? -1] ?? -1;
205
+ if (aSort !== bSort) return bSort - aSort;
206
+ return a?.localeCompare(b ?? "") ?? 0;
207
+ };
208
+
209
+ var __defProp$4 = Object.defineProperty;
210
+ var __typeError$2 = (msg) => {
211
+ throw TypeError(msg);
212
+ };
213
+ var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
214
+ var __publicField$4 = (obj, key, value) => __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
215
+ var __accessCheck$2 = (obj, member, msg) => member.has(obj) || __typeError$2("Cannot " + msg);
216
+ var __privateGet$2 = (obj, member, getter) => (__accessCheck$2(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
217
+ var __privateAdd$2 = (obj, member, value) => member.has(obj) ? __typeError$2("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
218
+ var _partialsIndex;
219
+ class Badge {
220
+ constructor(data) {
221
+ __privateAdd$2(this, _partialsIndex, {});
222
+ /**
223
+ * The database key for this badge.
224
+ */
225
+ __publicField$4(this, "key");
226
+ /**
227
+ * The type of badge.
228
+ */
229
+ __publicField$4(this, "type");
230
+ /**
231
+ * The name of this badge.
232
+ *
233
+ * May vary by character sex or alignment.
234
+ */
235
+ __publicField$4(this, "name");
236
+ /**
237
+ * The character alignments that this badge is available to.
238
+ */
239
+ __publicField$4(this, "alignment");
240
+ /**
241
+ * The badge text as it appears in-game. May vary by character sex or alignment.
242
+ */
243
+ __publicField$4(this, "badgeText");
244
+ /**
245
+ * Description of how to acquire the badge.
246
+ *
247
+ * Supports {@link https://www.markdownguide.org/|Markdown} format.
248
+ */
249
+ __publicField$4(this, "acquisition");
250
+ /**
251
+ * Absolute URL to this badge's icon.
252
+ *
253
+ * May vary by character sex or alignment.
254
+ */
255
+ __publicField$4(this, "icon");
256
+ /**
257
+ * Freeform notes or tips about the badge.
258
+ *
259
+ * Supports {@link https://www.markdownguide.org/|Markdown} format.
260
+ */
261
+ __publicField$4(this, "notes");
262
+ /**
263
+ * List of external links for this Badge. Wiki, forums, etc.
264
+ */
265
+ __publicField$4(this, "links");
266
+ /**
267
+ * For exploration badges, the key of the {@link GameMap} that this badge is found on.
268
+ */
269
+ __publicField$4(this, "mapKey");
270
+ /**
271
+ * For exploration badges, the `/loc` coordinates of the badge on the in-game map.
272
+ */
273
+ __publicField$4(this, "loc");
274
+ /**
275
+ * For badges that appear on a Vidiot Map, the number or letter the badge appears as.
276
+ */
277
+ __publicField$4(this, "vidiotMapKey");
278
+ /**
279
+ * ID used with the in-game `/settitle` command to apply the badge.
280
+ */
281
+ __publicField$4(this, "setTitle");
282
+ /**
283
+ * A description of the effect the badge will have, such as a buff or granting a temporary power.
284
+ *
285
+ * Supports {@link https://www.markdownguide.org/|Markdown} format.
286
+ */
287
+ __publicField$4(this, "effect");
288
+ /**
289
+ * A list of requirements for badges that have partial fulfilment steps, such as visiting plaques for history badges, or collecting other badges for meta-badges like accolades.
290
+ */
291
+ __publicField$4(this, "partials");
292
+ /**
293
+ * Some badges are not included in the badge total count... such as Flames of Prometheus, which can be removed by redeeming it for a Notice of the Well.
294
+ */
295
+ __publicField$4(this, "ignoreInTotals");
296
+ this.key = new Key(data.key).value;
297
+ this.type = data.type;
298
+ this.name = new Alternates(data.name);
299
+ this.alignment = data.alignment;
300
+ this.badgeText = new Alternates(data.badgeText ?? []);
301
+ this.acquisition = data.acquisition;
302
+ this.icon = new Alternates(data.icon ?? []);
303
+ this.notes = data.notes;
304
+ this.links = data.links;
305
+ this.mapKey = data.mapKey;
306
+ this.loc = data.loc;
307
+ this.effect = data.effect;
308
+ this.vidiotMapKey = data.vidiotMapKey;
309
+ this.setTitle = data.setTitle;
310
+ this.ignoreInTotals = data.ignoreInTotals ?? false;
311
+ this.partials = data.partials?.map((data2) => {
312
+ if (__privateGet$2(this, _partialsIndex)[data2.key] !== void 0) throw new Error(`Duplicate badge partial key [${data2.key}]`);
313
+ const badge = new BadgePartial(data2);
314
+ __privateGet$2(this, _partialsIndex)[badge.key] = badge;
315
+ return badge;
316
+ });
317
+ }
318
+ getPartial(key) {
319
+ const result = __privateGet$2(this, _partialsIndex)[key];
320
+ if (result === void 0) throw new Error(`Unknown badge partial key [${key}]`);
321
+ return result;
322
+ }
323
+ }
324
+ _partialsIndex = new WeakMap();
325
+
326
+ var __defProp$3 = Object.defineProperty;
327
+ var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
328
+ var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
329
+ class VidiotMapPointOfInterest {
330
+ constructor(data) {
331
+ /**
332
+ * The pixel-space position of the PoI on the map graphic.
333
+ *
334
+ * Screen-space, pixels from top-left `[0, 0]`.
335
+ */
336
+ __publicField$3(this, "pos");
337
+ /**
338
+ * Freeform notes about the PoI.
339
+ *
340
+ * Supports {@link https://www.markdownguide.org/|Markdown} format.
341
+ */
342
+ __publicField$3(this, "notes");
343
+ /**
344
+ * If the POI is a zone transfer, the map it transfers to.
345
+ */
346
+ __publicField$3(this, "mapKey");
347
+ /**
348
+ * If the POI is a badge, the badge.
349
+ */
350
+ __publicField$3(this, "badgeKey");
351
+ /**
352
+ * If the POI is a partial for a badge, the partial key.
353
+ */
354
+ __publicField$3(this, "badgePartialKey");
355
+ this.pos = data.pos;
356
+ this.notes = data.notes;
357
+ this.mapKey = data.mapKey;
358
+ this.badgeKey = data.badgeKey;
359
+ this.badgePartialKey = data.badgePartialKey;
360
+ }
361
+ }
362
+
363
+ var __defProp$2 = Object.defineProperty;
364
+ var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
365
+ var __publicField$2 = (obj, key, value) => __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
366
+ class VidiotMap {
367
+ constructor(data) {
368
+ /**
369
+ * URL of the map image.
370
+ */
371
+ __publicField$2(this, "imageUrl");
372
+ /**
373
+ * Name to display for the Vidiot map.
374
+ */
375
+ __publicField$2(this, "name");
376
+ /**
377
+ * List of Points of Interest labelled on the image.
378
+ */
379
+ __publicField$2(this, "pointsOfInterest");
380
+ this.imageUrl = data.imageUrl;
381
+ this.name = data.name;
382
+ this.pointsOfInterest = data.pointsOfInterest?.map((data2) => new VidiotMapPointOfInterest(data2));
383
+ }
384
+ }
385
+
386
+ var __defProp$1 = Object.defineProperty;
387
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
388
+ var __publicField$1 = (obj, key, value) => __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
389
+ class GameMap {
390
+ constructor(data) {
391
+ /**
392
+ * The database key for this map.
393
+ */
394
+ __publicField$1(this, "key");
395
+ /**
396
+ * The name of the map as it appears in-game.
397
+ */
398
+ __publicField$1(this, "name");
399
+ /**
400
+ * List of external links for this Map. Wiki, forums, etc.
401
+ */
402
+ __publicField$1(this, "links");
403
+ /**
404
+ * List of Vidiot Map assets for this map.
405
+ */
406
+ __publicField$1(this, "vidiotMaps");
407
+ this.key = new Key(data.key).value;
408
+ this.name = data.name;
409
+ this.links = data.links;
410
+ this.vidiotMaps = data.vidiotMaps?.map((data2) => new VidiotMap(data2));
411
+ }
412
+ }
413
+
414
+ var __defProp = Object.defineProperty;
415
+ var __typeError$1 = (msg) => {
416
+ throw TypeError(msg);
417
+ };
418
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
419
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
420
+ var __accessCheck$1 = (obj, member, msg) => member.has(obj) || __typeError$1("Cannot " + msg);
421
+ var __privateGet$1 = (obj, member, getter) => (__accessCheck$1(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
422
+ var __privateAdd$1 = (obj, member, value) => member.has(obj) ? __typeError$1("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
423
+ var _archetypeIndex, _mapIndex, _badgeIndex;
424
+ class ServerGroup {
425
+ constructor(data) {
426
+ __privateAdd$1(this, _archetypeIndex, {});
427
+ __privateAdd$1(this, _mapIndex, {});
428
+ __privateAdd$1(this, _badgeIndex, {});
429
+ /**
430
+ * The database key for this server group.
431
+ */
432
+ __publicField(this, "key");
433
+ /**
434
+ * Name of the server group.
435
+ */
436
+ __publicField(this, "name");
437
+ /**
438
+ * Description of the server group.
439
+ *
440
+ * Supports {@link https://www.markdownguide.org/|Markdown} format.
441
+ */
442
+ __publicField(this, "description");
443
+ /**
444
+ * Repository where the db content package is maintained.
445
+ */
446
+ __publicField(this, "repository");
447
+ /**
448
+ * List of external links for this Server Group. Wiki, forums, etc.
449
+ */
450
+ __publicField(this, "links");
451
+ /**
452
+ * List of the game server names in this server group.
453
+ * Torchbearer, Excelsior, etc.
454
+ */
455
+ __publicField(this, "servers");
456
+ /**
457
+ * List of archetypes available in this server group.
458
+ */
459
+ __publicField(this, "archetypes");
460
+ /**
461
+ * List of game maps supported by this server group.
462
+ */
463
+ __publicField(this, "maps");
464
+ /**
465
+ * List of badges available on this server group.
466
+ */
467
+ __publicField(this, "badges");
468
+ /**
469
+ * Change log for this data package.
470
+ */
471
+ __publicField(this, "changelog");
472
+ this.key = new Key(data.key).value;
473
+ this.name = data.name;
474
+ this.description = data.description;
475
+ this.repository = data.repository;
476
+ this.links = data.links;
477
+ this.servers = data.servers ?? [];
478
+ this.archetypes = data.archetypes?.map((data2) => {
479
+ if (__privateGet$1(this, _archetypeIndex)[data2.key] !== void 0) throw new Error(`Duplicate archetype key [${data2.key}]`);
480
+ const archetype = new Archetype(data2);
481
+ __privateGet$1(this, _archetypeIndex)[archetype.key] = archetype;
482
+ return archetype;
483
+ }) ?? [];
484
+ this.maps = data.maps?.map((data2) => {
485
+ if (__privateGet$1(this, _mapIndex)[data2.key] !== void 0) throw new Error(`Duplicate map key [${data2.key}]`);
486
+ const map = new GameMap(data2);
487
+ __privateGet$1(this, _mapIndex)[map.key] = map;
488
+ return map;
489
+ }) ?? [];
490
+ this.badges = data.badges?.map((data2) => {
491
+ if (__privateGet$1(this, _badgeIndex)[data2.key] !== void 0) throw new Error(`Duplicate badge key [${data2.key}]`);
492
+ const badge = new Badge(data2);
493
+ __privateGet$1(this, _badgeIndex)[badge.key] = badge;
494
+ return badge;
495
+ }) ?? [];
496
+ this.changelog = data.changelog;
497
+ }
498
+ getArchetype(key) {
499
+ const result = __privateGet$1(this, _archetypeIndex)[key];
500
+ if (result === void 0) throw new Error(`Unknown archetype key [${key}]`);
501
+ return result;
502
+ }
503
+ getMap(key) {
504
+ const result = __privateGet$1(this, _mapIndex)[key];
505
+ if (result === void 0) throw new Error(`Unknown map key [${key}]`);
506
+ return result;
507
+ }
508
+ getBadge(key) {
509
+ const result = __privateGet$1(this, _badgeIndex)[key];
510
+ if (result === void 0) throw new Error(`Unknown badge key [${key}]`);
511
+ return result;
512
+ }
513
+ }
514
+ _archetypeIndex = new WeakMap();
515
+ _mapIndex = new WeakMap();
516
+ _badgeIndex = new WeakMap();
517
+
518
+ var __typeError = (msg) => {
519
+ throw TypeError(msg);
520
+ };
521
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
522
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
523
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
524
+ var _serverGroups;
525
+ class CohContentDatabase {
526
+ constructor() {
527
+ __privateAdd(this, _serverGroups, {});
528
+ }
529
+ /**
530
+ * Load a server group data package into the database.
531
+ * @param data The data to load.
532
+ */
533
+ loadServerGroupData(data) {
534
+ __privateGet(this, _serverGroups)[data.key] = new ServerGroup(data);
535
+ }
536
+ /**
537
+ * Get all the server groups currently loaded in the database.
538
+ */
539
+ listServerGroups() {
540
+ return Object.values(__privateGet(this, _serverGroups));
541
+ }
542
+ /**
543
+ * get a server group by key.
544
+ * @param serverGroupKey The key.
545
+ */
546
+ getServerGroup(serverGroupKey) {
547
+ return __privateGet(this, _serverGroups)[serverGroupKey];
548
+ }
549
+ }
550
+ _serverGroups = new WeakMap();
551
+
552
+ const CHANGELOG = [
553
+ {
554
+ version: "2.0.0",
555
+ date: /* @__PURE__ */ new Date("2025-03-12"),
556
+ description: "* Replaced redundant interfaces with their concrete equivalents.\n* Replaced enums with extensible union types; Server groups with new badge types, enhancement types, etc. can now extend them locally.\n* Removed the `serverGroup` property from entities to simplify the object tree; Server group context will need to be managed separately.\n* Standardized pluralization of some field names (name, icon).\n* Combined `settitle` ids into a single tuple field.\n* Change from GNU to The Unlicense.\n* Removed dependency on lodash. There are now no third-party runtime dependencies.\n* Moved from webpack to rollup for packaging.\n* Add eslint for linting.\n* Add jest for unit tests.\n* Added GitHub Actions for CI.\n"
557
+ }
558
+ ];
559
+
560
+ function createBadgeReference(target) {
561
+ const key = typeof target === "string" ? target : target.key;
562
+ return `[badge:${key}]`;
563
+ }
564
+ function createMapReference(target) {
565
+ const key = typeof target === "string" ? target : target.key;
566
+ return `[map:${key}]`;
567
+ }
568
+
569
+ exports.ALIGNMENT = ALIGNMENT;
570
+ exports.Archetype = Archetype;
571
+ exports.BADGE_PARTIAL_TYPE = BADGE_PARTIAL_TYPE;
572
+ exports.BADGE_TYPE = BADGE_TYPE;
573
+ exports.Badge = Badge;
574
+ exports.BadgePartial = BadgePartial;
575
+ exports.CHANGELOG = CHANGELOG;
576
+ exports.CohContentDatabase = CohContentDatabase;
577
+ exports.ENHANCEMENT_CATEGORY = ENHANCEMENT_CATEGORY;
578
+ exports.GameMap = GameMap;
579
+ exports.Key = Key;
580
+ exports.PLAQUE_TYPE = PLAQUE_TYPE;
581
+ exports.SEX = SEX;
582
+ exports.ServerGroup = ServerGroup;
583
+ exports.VidiotMap = VidiotMap;
584
+ exports.VidiotMapPointOfInterest = VidiotMapPointOfInterest;
585
+ exports.createBadgeReference = createBadgeReference;
586
+ exports.createMapReference = createMapReference;
587
+ //# sourceMappingURL=coh-content-db.js.map