post-policy.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. var errors = _interopRequireWildcard(require("../errors.js"), true);
  6. var _helper = require("./helper.js");
  7. function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
  8. // Build PostPolicy object that can be signed by presignedPostPolicy
  9. class PostPolicy {
  10. policy = {
  11. conditions: []
  12. };
  13. formData = {};
  14. // set expiration date
  15. setExpires(date) {
  16. if (!date) {
  17. throw new errors.InvalidDateError('Invalid date: cannot be null');
  18. }
  19. this.policy.expiration = date.toISOString();
  20. }
  21. // set object name
  22. setKey(objectName) {
  23. if (!(0, _helper.isValidObjectName)(objectName)) {
  24. throw new errors.InvalidObjectNameError(`Invalid object name : ${objectName}`);
  25. }
  26. this.policy.conditions.push(['eq', '$key', objectName]);
  27. this.formData.key = objectName;
  28. }
  29. // set object name prefix, i.e policy allows any keys with this prefix
  30. setKeyStartsWith(prefix) {
  31. if (!(0, _helper.isValidPrefix)(prefix)) {
  32. throw new errors.InvalidPrefixError(`Invalid prefix : ${prefix}`);
  33. }
  34. this.policy.conditions.push(['starts-with', '$key', prefix]);
  35. this.formData.key = prefix;
  36. }
  37. // set bucket name
  38. setBucket(bucketName) {
  39. if (!(0, _helper.isValidBucketName)(bucketName)) {
  40. throw new errors.InvalidBucketNameError(`Invalid bucket name : ${bucketName}`);
  41. }
  42. this.policy.conditions.push(['eq', '$bucket', bucketName]);
  43. this.formData.bucket = bucketName;
  44. }
  45. // set Content-Type
  46. setContentType(type) {
  47. if (!type) {
  48. throw new Error('content-type cannot be null');
  49. }
  50. this.policy.conditions.push(['eq', '$Content-Type', type]);
  51. this.formData['Content-Type'] = type;
  52. }
  53. // set Content-Type prefix, i.e image/ allows any image
  54. setContentTypeStartsWith(prefix) {
  55. if (!prefix) {
  56. throw new Error('content-type cannot be null');
  57. }
  58. this.policy.conditions.push(['starts-with', '$Content-Type', prefix]);
  59. this.formData['Content-Type'] = prefix;
  60. }
  61. // set Content-Disposition
  62. setContentDisposition(value) {
  63. if (!value) {
  64. throw new Error('content-disposition cannot be null');
  65. }
  66. this.policy.conditions.push(['eq', '$Content-Disposition', value]);
  67. this.formData['Content-Disposition'] = value;
  68. }
  69. // set minimum/maximum length of what Content-Length can be.
  70. setContentLengthRange(min, max) {
  71. if (min > max) {
  72. throw new Error('min cannot be more than max');
  73. }
  74. if (min < 0) {
  75. throw new Error('min should be > 0');
  76. }
  77. if (max < 0) {
  78. throw new Error('max should be > 0');
  79. }
  80. this.policy.conditions.push(['content-length-range', min, max]);
  81. }
  82. // set user defined metadata
  83. setUserMetaData(metaData) {
  84. if (!(0, _helper.isObject)(metaData)) {
  85. throw new TypeError('metadata should be of type "object"');
  86. }
  87. Object.entries(metaData).forEach(([key, value]) => {
  88. const amzMetaDataKey = `x-amz-meta-${key}`;
  89. this.policy.conditions.push(['eq', `$${amzMetaDataKey}`, value]);
  90. this.formData[amzMetaDataKey] = value.toString();
  91. });
  92. }
  93. }
  94. exports.PostPolicy = PostPolicy;
  95. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlcnJvcnMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfaGVscGVyIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiZGVmYXVsdCIsImhhcyIsImdldCIsInNldCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiUG9zdFBvbGljeSIsInBvbGljeSIsImNvbmRpdGlvbnMiLCJmb3JtRGF0YSIsInNldEV4cGlyZXMiLCJkYXRlIiwiSW52YWxpZERhdGVFcnJvciIsImV4cGlyYXRpb24iLCJ0b0lTT1N0cmluZyIsInNldEtleSIsIm9iamVjdE5hbWUiLCJpc1ZhbGlkT2JqZWN0TmFtZSIsIkludmFsaWRPYmplY3ROYW1lRXJyb3IiLCJwdXNoIiwia2V5Iiwic2V0S2V5U3RhcnRzV2l0aCIsInByZWZpeCIsImlzVmFsaWRQcmVmaXgiLCJJbnZhbGlkUHJlZml4RXJyb3IiLCJzZXRCdWNrZXQiLCJidWNrZXROYW1lIiwiaXNWYWxpZEJ1Y2tldE5hbWUiLCJJbnZhbGlkQnVja2V0TmFtZUVycm9yIiwiYnVja2V0Iiwic2V0Q29udGVudFR5cGUiLCJ0eXBlIiwiRXJyb3IiLCJzZXRDb250ZW50VHlwZVN0YXJ0c1dpdGgiLCJzZXRDb250ZW50RGlzcG9zaXRpb24iLCJ2YWx1ZSIsInNldENvbnRlbnRMZW5ndGhSYW5nZSIsIm1pbiIsIm1heCIsInNldFVzZXJNZXRhRGF0YSIsIm1ldGFEYXRhIiwiaXNPYmplY3QiLCJUeXBlRXJyb3IiLCJlbnRyaWVzIiwiZm9yRWFjaCIsImFtek1ldGFEYXRhS2V5IiwidG9TdHJpbmciLCJleHBvcnRzIl0sInNvdXJjZXMiOlsicG9zdC1wb2xpY3kudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQnVpbGQgUG9zdFBvbGljeSBvYmplY3QgdGhhdCBjYW4gYmUgc2lnbmVkIGJ5IHByZXNpZ25lZFBvc3RQb2xpY3lcbmltcG9ydCAqIGFzIGVycm9ycyBmcm9tICcuLi9lcnJvcnMudHMnXG5pbXBvcnQgeyBpc09iamVjdCwgaXNWYWxpZEJ1Y2tldE5hbWUsIGlzVmFsaWRPYmplY3ROYW1lLCBpc1ZhbGlkUHJlZml4IH0gZnJvbSAnLi9oZWxwZXIudHMnXG5pbXBvcnQgdHlwZSB7IE9iamVjdE1ldGFEYXRhIH0gZnJvbSAnLi90eXBlLnRzJ1xuXG5leHBvcnQgY2xhc3MgUG9zdFBvbGljeSB7XG4gIHB1YmxpYyBwb2xpY3k6IHsgY29uZGl0aW9uczogKHN0cmluZyB8IG51bWJlcilbXVtdOyBleHBpcmF0aW9uPzogc3RyaW5nIH0gPSB7XG4gICAgY29uZGl0aW9uczogW10sXG4gIH1cbiAgcHVibGljIGZvcm1EYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAvLyBzZXQgZXhwaXJhdGlvbiBkYXRlXG4gIHNldEV4cGlyZXMoZGF0ZTogRGF0ZSkge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkRGF0ZUVycm9yKCdJbnZhbGlkIGRhdGU6IGNhbm5vdCBiZSBudWxsJylcbiAgICB9XG4gICAgdGhpcy5wb2xpY3kuZXhwaXJhdGlvbiA9IGRhdGUudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgLy8gc2V0IG9iamVjdCBuYW1lXG4gIHNldEtleShvYmplY3ROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKG9iamVjdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgb2JqZWN0IG5hbWUgOiAke29iamVjdE5hbWV9YClcbiAgICB9XG4gICAgdGhpcy5wb2xpY3kuY29uZGl0aW9ucy5wdXNoKFsnZXEnLCAnJGtleScsIG9iamVjdE5hbWVdKVxuICAgIHRoaXMuZm9ybURhdGEua2V5ID0gb2JqZWN0TmFtZVxuICB9XG5cbiAgLy8gc2V0IG9iamVjdCBuYW1lIHByZWZpeCwgaS5lIHBvbGljeSBhbGxvd3MgYW55IGtleXMgd2l0aCB0aGlzIHByZWZpeFxuICBzZXRLZXlTdGFydHNXaXRoKHByZWZpeDogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1ZhbGlkUHJlZml4KHByZWZpeCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFByZWZpeEVycm9yKGBJbnZhbGlkIHByZWZpeCA6ICR7cHJlZml4fWApXG4gICAgfVxuICAgIHRoaXMucG9saWN5LmNvbmRpdGlvbnMucHVzaChbJ3N0YXJ0cy13aXRoJywgJyRrZXknLCBwcmVmaXhdKVxuICAgIHRoaXMuZm9ybURhdGEua2V5ID0gcHJlZml4XG4gIH1cblxuICAvLyBzZXQgYnVja2V0IG5hbWVcbiAgc2V0QnVja2V0KGJ1Y2tldE5hbWU6IHN0cmluZykge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcihgSW52YWxpZCBidWNrZXQgbmFtZSA6ICR7YnVja2V0TmFtZX1gKVxuICAgIH1cbiAgICB0aGlzLnBvbGljeS5jb25kaXRpb25zLnB1c2goWydlcScsICckYnVja2V0JywgYnVja2V0TmFtZV0pXG4gICAgdGhpcy5mb3JtRGF0YS5idWNrZXQgPSBidWNrZXROYW1lXG4gIH1cblxuICAvLyBzZXQgQ29udGVudC1UeXBlXG4gIHNldENvbnRlbnRUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIGlmICghdHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb250ZW50LXR5cGUgY2Fubm90IGJlIG51bGwnKVxuICAgIH1cbiAgICB0aGlzLnBvbGljeS5jb25kaXRpb25zLnB1c2goWydlcScsICckQ29udGVudC1UeXBlJywgdHlwZV0pXG4gICAgdGhpcy5mb3JtRGF0YVsnQ29udGVudC1UeXBlJ10gPSB0eXBlXG4gIH1cblxuICAvLyBzZXQgQ29udGVudC1UeXBlIHByZWZpeCwgaS5lIGltYWdlLyBhbGxvd3MgYW55IGltYWdlXG4gIHNldENvbnRlbnRUeXBlU3RhcnRzV2l0aChwcmVmaXg6IHN0cmluZykge1xuICAgIGlmICghcHJlZml4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbnRlbnQtdHlwZSBjYW5ub3QgYmUgbnVsbCcpXG4gICAgfVxuICAgIHRoaXMucG9saWN5LmNvbmRpdGlvbnMucHVzaChbJ3N0YXJ0cy13aXRoJywgJyRDb250ZW50LVR5cGUnLCBwcmVmaXhdKVxuICAgIHRoaXMuZm9ybURhdGFbJ0NvbnRlbnQtVHlwZSddID0gcHJlZml4XG4gIH1cblxuICAvLyBzZXQgQ29udGVudC1EaXNwb3NpdGlvblxuICBzZXRDb250ZW50RGlzcG9zaXRpb24odmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY29udGVudC1kaXNwb3NpdGlvbiBjYW5ub3QgYmUgbnVsbCcpXG4gICAgfVxuICAgIHRoaXMucG9saWN5LmNvbmRpdGlvbnMucHVzaChbJ2VxJywgJyRDb250ZW50LURpc3Bvc2l0aW9uJywgdmFsdWVdKVxuICAgIHRoaXMuZm9ybURhdGFbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9IHZhbHVlXG4gIH1cblxuICAvLyBzZXQgbWluaW11bS9tYXhpbXVtIGxlbmd0aCBvZiB3aGF0IENvbnRlbnQtTGVuZ3RoIGNhbiBiZS5cbiAgc2V0Q29udGVudExlbmd0aFJhbmdlKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikge1xuICAgIGlmIChtaW4gPiBtYXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWluIGNhbm5vdCBiZSBtb3JlIHRoYW4gbWF4JylcbiAgICB9XG4gICAgaWYgKG1pbiA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWluIHNob3VsZCBiZSA+IDAnKVxuICAgIH1cbiAgICBpZiAobWF4IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYXggc2hvdWxkIGJlID4gMCcpXG4gICAgfVxuICAgIHRoaXMucG9saWN5LmNvbmRpdGlvbnMucHVzaChbJ2NvbnRlbnQtbGVuZ3RoLXJhbmdlJywgbWluLCBtYXhdKVxuICB9XG5cbiAgLy8gc2V0IHVzZXIgZGVmaW5lZCBtZXRhZGF0YVxuICBzZXRVc2VyTWV0YURhdGEobWV0YURhdGE6IE9iamVjdE1ldGFEYXRhKSB7XG4gICAgaWYgKCFpc09iamVjdChtZXRhRGF0YSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21ldGFkYXRhIHNob3VsZCBiZSBvZiB0eXBlIFwib2JqZWN0XCInKVxuICAgIH1cbiAgICBPYmplY3QuZW50cmllcyhtZXRhRGF0YSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBjb25zdCBhbXpNZXRhRGF0YUtleSA9IGB4LWFtei1tZXRhLSR7a2V5fWBcbiAgICAgIHRoaXMucG9saWN5LmNvbmRpdGlvbnMucHVzaChbJ2VxJywgYCQke2Ftek1ldGFEYXRhS2V5fWAsIHZhbHVlXSlcbiAgICAgIHRoaXMuZm9ybURhdGFbYW16TWV0YURhdGFLZXldID0gdmFsdWUudG9TdHJpbmcoKVxuICAgIH0pXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFBMkYsU0FBQUQsd0JBQUFHLENBQUEsRUFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxNQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFMLHVCQUFBLFlBQUFBLENBQUFHLENBQUEsRUFBQUMsQ0FBQSxTQUFBQSxDQUFBLElBQUFELENBQUEsSUFBQUEsQ0FBQSxDQUFBSyxVQUFBLFNBQUFMLENBQUEsTUFBQU0sQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsS0FBQUMsU0FBQSxRQUFBQyxPQUFBLEVBQUFWLENBQUEsaUJBQUFBLENBQUEsdUJBQUFBLENBQUEseUJBQUFBLENBQUEsU0FBQVEsQ0FBQSxNQUFBRixDQUFBLEdBQUFMLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLFFBQUFHLENBQUEsQ0FBQUssR0FBQSxDQUFBWCxDQUFBLFVBQUFNLENBQUEsQ0FBQU0sR0FBQSxDQUFBWixDQUFBLEdBQUFNLENBQUEsQ0FBQU8sR0FBQSxDQUFBYixDQUFBLEVBQUFRLENBQUEsZ0JBQUFQLENBQUEsSUFBQUQsQ0FBQSxnQkFBQUMsQ0FBQSxPQUFBYSxjQUFBLENBQUFDLElBQUEsQ0FBQWYsQ0FBQSxFQUFBQyxDQUFBLE9BQUFNLENBQUEsSUFBQUQsQ0FBQSxHQUFBVSxNQUFBLENBQUFDLGNBQUEsS0FBQUQsTUFBQSxDQUFBRSx3QkFBQSxDQUFBbEIsQ0FBQSxFQUFBQyxDQUFBLE9BQUFNLENBQUEsQ0FBQUssR0FBQSxJQUFBTCxDQUFBLENBQUFNLEdBQUEsSUFBQVAsQ0FBQSxDQUFBRSxDQUFBLEVBQUFQLENBQUEsRUFBQU0sQ0FBQSxJQUFBQyxDQUFBLENBQUFQLENBQUEsSUFBQUQsQ0FBQSxDQUFBQyxDQUFBLFdBQUFPLENBQUEsS0FBQVIsQ0FBQSxFQUFBQyxDQUFBO0FBRjNGOztBQUtPLE1BQU1rQixVQUFVLENBQUM7RUFDZkMsTUFBTSxHQUErRDtJQUMxRUMsVUFBVSxFQUFFO0VBQ2QsQ0FBQztFQUNNQyxRQUFRLEdBQTJCLENBQUMsQ0FBQzs7RUFFNUM7RUFDQUMsVUFBVUEsQ0FBQ0MsSUFBVSxFQUFFO0lBQ3JCLElBQUksQ0FBQ0EsSUFBSSxFQUFFO01BQ1QsTUFBTSxJQUFJNUIsTUFBTSxDQUFDNkIsZ0JBQWdCLENBQUMsOEJBQThCLENBQUM7SUFDbkU7SUFDQSxJQUFJLENBQUNMLE1BQU0sQ0FBQ00sVUFBVSxHQUFHRixJQUFJLENBQUNHLFdBQVcsQ0FBQyxDQUFDO0VBQzdDOztFQUVBO0VBQ0FDLE1BQU1BLENBQUNDLFVBQWtCLEVBQUU7SUFDekIsSUFBSSxDQUFDLElBQUFDLHlCQUFpQixFQUFDRCxVQUFVLENBQUMsRUFBRTtNQUNsQyxNQUFNLElBQUlqQyxNQUFNLENBQUNtQyxzQkFBc0IsQ0FBRSx5QkFBd0JGLFVBQVcsRUFBQyxDQUFDO0lBQ2hGO0lBQ0EsSUFBSSxDQUFDVCxNQUFNLENBQUNDLFVBQVUsQ0FBQ1csSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRUgsVUFBVSxDQUFDLENBQUM7SUFDdkQsSUFBSSxDQUFDUCxRQUFRLENBQUNXLEdBQUcsR0FBR0osVUFBVTtFQUNoQzs7RUFFQTtFQUNBSyxnQkFBZ0JBLENBQUNDLE1BQWMsRUFBRTtJQUMvQixJQUFJLENBQUMsSUFBQUMscUJBQWEsRUFBQ0QsTUFBTSxDQUFDLEVBQUU7TUFDMUIsTUFBTSxJQUFJdkMsTUFBTSxDQUFDeUMsa0JBQWtCLENBQUUsb0JBQW1CRixNQUFPLEVBQUMsQ0FBQztJQUNuRTtJQUNBLElBQUksQ0FBQ2YsTUFBTSxDQUFDQyxVQUFVLENBQUNXLElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUVHLE1BQU0sQ0FBQyxDQUFDO0lBQzVELElBQUksQ0FBQ2IsUUFBUSxDQUFDVyxHQUFHLEdBQUdFLE1BQU07RUFDNUI7O0VBRUE7RUFDQUcsU0FBU0EsQ0FBQ0MsVUFBa0IsRUFBRTtJQUM1QixJQUFJLENBQUMsSUFBQUMseUJBQWlCLEVBQUNELFVBQVUsQ0FBQyxFQUFFO01BQ2xDLE1BQU0sSUFBSTNDLE1BQU0sQ0FBQzZDLHNCQUFzQixDQUFFLHlCQUF3QkYsVUFBVyxFQUFDLENBQUM7SUFDaEY7SUFDQSxJQUFJLENBQUNuQixNQUFNLENBQUNDLFVBQVUsQ0FBQ1csSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRU8sVUFBVSxDQUFDLENBQUM7SUFDMUQsSUFBSSxDQUFDakIsUUFBUSxDQUFDb0IsTUFBTSxHQUFHSCxVQUFVO0VBQ25DOztFQUVBO0VBQ0FJLGNBQWNBLENBQUNDLElBQVksRUFBRTtJQUMzQixJQUFJLENBQUNBLElBQUksRUFBRTtNQUNULE1BQU0sSUFBSUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDO0lBQ2hEO0lBQ0EsSUFBSSxDQUFDekIsTUFBTSxDQUFDQyxVQUFVLENBQUNXLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUVZLElBQUksQ0FBQyxDQUFDO0lBQzFELElBQUksQ0FBQ3RCLFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBR3NCLElBQUk7RUFDdEM7O0VBRUE7RUFDQUUsd0JBQXdCQSxDQUFDWCxNQUFjLEVBQUU7SUFDdkMsSUFBSSxDQUFDQSxNQUFNLEVBQUU7TUFDWCxNQUFNLElBQUlVLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQztJQUNoRDtJQUNBLElBQUksQ0FBQ3pCLE1BQU0sQ0FBQ0MsVUFBVSxDQUFDVyxJQUFJLENBQUMsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFRyxNQUFNLENBQUMsQ0FBQztJQUNyRSxJQUFJLENBQUNiLFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBR2EsTUFBTTtFQUN4Qzs7RUFFQTtFQUNBWSxxQkFBcUJBLENBQUNDLEtBQWEsRUFBRTtJQUNuQyxJQUFJLENBQUNBLEtBQUssRUFBRTtNQUNWLE1BQU0sSUFBSUgsS0FBSyxDQUFDLG9DQUFvQyxDQUFDO0lBQ3ZEO0lBQ0EsSUFBSSxDQUFDekIsTUFBTSxDQUFDQyxVQUFVLENBQUNXLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRWdCLEtBQUssQ0FBQyxDQUFDO0lBQ2xFLElBQUksQ0FBQzFCLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHMEIsS0FBSztFQUM5Qzs7RUFFQTtFQUNBQyxxQkFBcUJBLENBQUNDLEdBQVcsRUFBRUMsR0FBVyxFQUFFO0lBQzlDLElBQUlELEdBQUcsR0FBR0MsR0FBRyxFQUFFO01BQ2IsTUFBTSxJQUFJTixLQUFLLENBQUMsNkJBQTZCLENBQUM7SUFDaEQ7SUFDQSxJQUFJSyxHQUFHLEdBQUcsQ0FBQyxFQUFFO01BQ1gsTUFBTSxJQUFJTCxLQUFLLENBQUMsbUJBQW1CLENBQUM7SUFDdEM7SUFDQSxJQUFJTSxHQUFHLEdBQUcsQ0FBQyxFQUFFO01BQ1gsTUFBTSxJQUFJTixLQUFLLENBQUMsbUJBQW1CLENBQUM7SUFDdEM7SUFDQSxJQUFJLENBQUN6QixNQUFNLENBQUNDLFVBQVUsQ0FBQ1csSUFBSSxDQUFDLENBQUMsc0JBQXNCLEVBQUVrQixHQUFHLEVBQUVDLEdBQUcsQ0FBQyxDQUFDO0VBQ2pFOztFQUVBO0VBQ0FDLGVBQWVBLENBQUNDLFFBQXdCLEVBQUU7SUFDeEMsSUFBSSxDQUFDLElBQUFDLGdCQUFRLEVBQUNELFFBQVEsQ0FBQyxFQUFFO01BQ3ZCLE1BQU0sSUFBSUUsU0FBUyxDQUFDLHFDQUFxQyxDQUFDO0lBQzVEO0lBQ0F2QyxNQUFNLENBQUN3QyxPQUFPLENBQUNILFFBQVEsQ0FBQyxDQUFDSSxPQUFPLENBQUMsQ0FBQyxDQUFDeEIsR0FBRyxFQUFFZSxLQUFLLENBQUMsS0FBSztNQUNqRCxNQUFNVSxjQUFjLEdBQUksY0FBYXpCLEdBQUksRUFBQztNQUMxQyxJQUFJLENBQUNiLE1BQU0sQ0FBQ0MsVUFBVSxDQUFDVyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUcsSUFBRzBCLGNBQWUsRUFBQyxFQUFFVixLQUFLLENBQUMsQ0FBQztNQUNoRSxJQUFJLENBQUMxQixRQUFRLENBQUNvQyxjQUFjLENBQUMsR0FBR1YsS0FBSyxDQUFDVyxRQUFRLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUM7RUFDSjtBQUNGO0FBQUNDLE9BQUEsQ0FBQXpDLFVBQUEsR0FBQUEsVUFBQSJ9