spoclip-kit 1.0.18 → 1.0.20

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.
package/README.md CHANGED
@@ -50,6 +50,8 @@ npm run release:major
50
50
 
51
51
  ### 1. src/new-module
52
52
 
53
+ - 파일 생성
54
+
53
55
  ```
54
56
  src
55
57
  new-module
@@ -57,6 +59,16 @@ src
57
59
  new-feature.ts
58
60
  ```
59
61
 
62
+ - main entry point 에서 export
63
+
64
+ ```src/index.ts
65
+ // Main entry point for spoclip-kit
66
+ export * from './libs';
67
+ export * from './types';
68
+ // ...
69
+ export * from './new-module';
70
+ ```
71
+
60
72
  ### 2. Update tsup.config.ts
61
73
 
62
74
  ```ts
package/dist/index.cjs CHANGED
@@ -20,6 +20,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
+ getClipVideoDownloadCost: () => getClipVideoDownloadCost,
24
+ getRawVideoDownloadCost: () => getRawVideoDownloadCost,
23
25
  getVideoDownloadCost: () => getVideoDownloadCost
24
26
  });
25
27
  module.exports = __toCommonJS(src_exports);
@@ -60,6 +62,8 @@ function getRawVideoDownloadCost() {
60
62
  }
61
63
  // Annotate the CommonJS export names for ESM import in node:
62
64
  0 && (module.exports = {
65
+ getClipVideoDownloadCost,
66
+ getRawVideoDownloadCost,
63
67
  getVideoDownloadCost
64
68
  });
65
69
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/libs/cost.ts"],"sourcesContent":["// Main entry point for spoclip-kit\nexport * from './libs';\nexport * from './types';\n","import type { TicketCode } from '@/types/membership';\n\nconst CLIP_COST_PER_SECOND = 1 / 60;\n\n/**\n * 비디오 다운로드 비용을 계산합니다.\n *\n * @description\n * - 전체 시간 4K 다운로드 시 티켓 상관없이 20톨\n * - 1분 미만인 경우, remainingFreeDownloads > 0 이면 무료\n * - 1분 미만인 경우, remainingFreeDownloads <= 0 이면 1톨부터 시작\n * - 55초부터는 1.92xx 이므로 반올림 시 1.9톨\n * - 59초부터는 1.98xx 이므로 반올림 시 2톨\n * - 60초부터는 2.00xx 이므로 반올림 시 2톨\n * - 62초부터는 2.03xx 이므로 반올림 시 2톨\n * - 63초부터는 2.05xx 이므로 반올림 시 2.1톨\n *\n */\n\ntype GetVideoDownloadCostParams = {\n duration: number;\n quality: '2K' | '4K';\n ticketCode?: TicketCode;\n remainingFreeDownloads?: number;\n\n /** @deprecated 이 파라미터는 더이상 사용되지 않습니다. */\n isFullTime?: boolean;\n};\n\nexport function getVideoDownloadCost({\n duration,\n quality,\n ticketCode = 'FREE',\n remainingFreeDownloads = 0,\n}: GetVideoDownloadCostParams) {\n if (quality === '4K') {\n return getRawVideoDownloadCost();\n }\n\n return getClipVideoDownloadCost({\n duration,\n ticketCode,\n remainingFreeDownloads,\n });\n}\n\ntype GetClipVideoDownloadCostParams = {\n duration: number;\n ticketCode?: TicketCode;\n remainingFreeDownloads?: number;\n};\n\nexport function getClipVideoDownloadCost({\n duration,\n ticketCode = 'FREE',\n remainingFreeDownloads = 0,\n}: GetClipVideoDownloadCostParams) {\n const durationInSeconds = duration / 1000;\n const isUnder61 = durationInSeconds < 61;\n const isPlus = ticketCode === 'PLUS';\n\n if (isPlus && remainingFreeDownloads > 0 && isUnder61) {\n return { cost: 0, isPlusFree: true };\n }\n\n const cost = Math.round(durationInSeconds * CLIP_COST_PER_SECOND * 10) / 10;\n return { cost, isPlusFree: false };\n}\n\nexport function getRawVideoDownloadCost() {\n return { cost: 20, isPlusFree: false };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,IAAM,uBAAuB,IAAI;AA2B1B,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,yBAAyB;AAC3B,GAA+B;AAC7B,MAAI,YAAY,MAAM;AACpB,WAAO,wBAAwB;AAAA,EACjC;AAEA,SAAO,yBAAyB;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAQO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA,aAAa;AAAA,EACb,yBAAyB;AAC3B,GAAmC;AACjC,QAAM,oBAAoB,WAAW;AACrC,QAAM,YAAY,oBAAoB;AACtC,QAAM,SAAS,eAAe;AAE9B,MAAI,UAAU,yBAAyB,KAAK,WAAW;AACrD,WAAO,EAAE,MAAM,GAAG,YAAY,KAAK;AAAA,EACrC;AAEA,QAAM,OAAO,KAAK,MAAM,oBAAoB,uBAAuB,EAAE,IAAI;AACzE,SAAO,EAAE,MAAM,YAAY,MAAM;AACnC;AAEO,SAAS,0BAA0B;AACxC,SAAO,EAAE,MAAM,IAAI,YAAY,MAAM;AACvC;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/libs/cost.ts"],"sourcesContent":["// Main entry point for spoclip-kit\nexport * from './libs';\nexport * from './types';\n","import type { TicketCode } from '@/types/membership';\n\nconst CLIP_COST_PER_SECOND = 1 / 60;\n\n/**\n * 비디오 다운로드 비용을 계산합니다.\n *\n * @description\n * - 전체 시간 4K 다운로드 시 티켓 상관없이 20톨\n * - 1분 미만인 경우, remainingFreeDownloads > 0 이면 무료\n * - 1분 미만인 경우, remainingFreeDownloads <= 0 이면 1톨부터 시작\n * - 55초부터는 1.92xx 이므로 반올림 시 1.9톨\n * - 59초부터는 1.98xx 이므로 반올림 시 2톨\n * - 60초부터는 2.00xx 이므로 반올림 시 2톨\n * - 62초부터는 2.03xx 이므로 반올림 시 2톨\n * - 63초부터는 2.05xx 이므로 반올림 시 2.1톨\n *\n */\n\ntype GetVideoDownloadCostParams = {\n duration: number;\n quality: '2K' | '4K';\n ticketCode?: TicketCode;\n remainingFreeDownloads?: number;\n\n /** @deprecated 이 파라미터는 더이상 사용되지 않습니다. */\n isFullTime?: boolean;\n};\n\nexport function getVideoDownloadCost({\n duration,\n quality,\n ticketCode = 'FREE',\n remainingFreeDownloads = 0,\n}: GetVideoDownloadCostParams) {\n if (quality === '4K') {\n return getRawVideoDownloadCost();\n }\n\n return getClipVideoDownloadCost({\n duration,\n ticketCode,\n remainingFreeDownloads,\n });\n}\n\ntype GetClipVideoDownloadCostParams = {\n duration: number;\n ticketCode?: TicketCode;\n remainingFreeDownloads?: number;\n};\n\nexport function getClipVideoDownloadCost({\n duration,\n ticketCode = 'FREE',\n remainingFreeDownloads = 0,\n}: GetClipVideoDownloadCostParams) {\n const durationInSeconds = duration / 1000;\n const isUnder61 = durationInSeconds < 61;\n const isPlus = ticketCode === 'PLUS';\n\n if (isPlus && remainingFreeDownloads > 0 && isUnder61) {\n return { cost: 0, isPlusFree: true };\n }\n\n const cost = Math.round(durationInSeconds * CLIP_COST_PER_SECOND * 10) / 10;\n return { cost, isPlusFree: false };\n}\n\nexport function getRawVideoDownloadCost() {\n return { cost: 20, isPlusFree: false };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,IAAM,uBAAuB,IAAI;AA2B1B,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,yBAAyB;AAC3B,GAA+B;AAC7B,MAAI,YAAY,MAAM;AACpB,WAAO,wBAAwB;AAAA,EACjC;AAEA,SAAO,yBAAyB;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAQO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA,aAAa;AAAA,EACb,yBAAyB;AAC3B,GAAmC;AACjC,QAAM,oBAAoB,WAAW;AACrC,QAAM,YAAY,oBAAoB;AACtC,QAAM,SAAS,eAAe;AAE9B,MAAI,UAAU,yBAAyB,KAAK,WAAW;AACrD,WAAO,EAAE,MAAM,GAAG,YAAY,KAAK;AAAA,EACrC;AAEA,QAAM,OAAO,KAAK,MAAM,oBAAoB,uBAAuB,EAAE,IAAI;AACzE,SAAO,EAAE,MAAM,YAAY,MAAM;AACnC;AAEO,SAAS,0BAA0B;AACxC,SAAO,EAAE,MAAM,IAAI,YAAY,MAAM;AACvC;","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,2 +1,2 @@
1
- export { getVideoDownloadCost } from './libs.cjs';
1
+ export { getClipVideoDownloadCost, getRawVideoDownloadCost, getVideoDownloadCost } from './libs.cjs';
2
2
  export { TicketCode } from './types.cjs';
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { getVideoDownloadCost } from './libs.js';
1
+ export { getClipVideoDownloadCost, getRawVideoDownloadCost, getVideoDownloadCost } from './libs.js';
2
2
  export { TicketCode } from './types.js';
package/dist/index.js CHANGED
@@ -33,6 +33,8 @@ function getRawVideoDownloadCost() {
33
33
  return { cost: 20, isPlusFree: false };
34
34
  }
35
35
  export {
36
+ getClipVideoDownloadCost,
37
+ getRawVideoDownloadCost,
36
38
  getVideoDownloadCost
37
39
  };
38
40
  //# sourceMappingURL=index.js.map
package/dist/libs.cjs CHANGED
@@ -20,6 +20,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/libs/index.ts
21
21
  var libs_exports = {};
22
22
  __export(libs_exports, {
23
+ getClipVideoDownloadCost: () => getClipVideoDownloadCost,
24
+ getRawVideoDownloadCost: () => getRawVideoDownloadCost,
23
25
  getVideoDownloadCost: () => getVideoDownloadCost
24
26
  });
25
27
  module.exports = __toCommonJS(libs_exports);
@@ -60,6 +62,8 @@ function getRawVideoDownloadCost() {
60
62
  }
61
63
  // Annotate the CommonJS export names for ESM import in node:
62
64
  0 && (module.exports = {
65
+ getClipVideoDownloadCost,
66
+ getRawVideoDownloadCost,
63
67
  getVideoDownloadCost
64
68
  });
65
69
  //# sourceMappingURL=libs.cjs.map
package/dist/libs.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/libs/index.ts","../src/libs/cost.ts"],"sourcesContent":["export { getVideoDownloadCost } from './cost';\n","import type { TicketCode } from '@/types/membership';\n\nconst CLIP_COST_PER_SECOND = 1 / 60;\n\n/**\n * 비디오 다운로드 비용을 계산합니다.\n *\n * @description\n * - 전체 시간 4K 다운로드 시 티켓 상관없이 20톨\n * - 1분 미만인 경우, remainingFreeDownloads > 0 이면 무료\n * - 1분 미만인 경우, remainingFreeDownloads <= 0 이면 1톨부터 시작\n * - 55초부터는 1.92xx 이므로 반올림 시 1.9톨\n * - 59초부터는 1.98xx 이므로 반올림 시 2톨\n * - 60초부터는 2.00xx 이므로 반올림 시 2톨\n * - 62초부터는 2.03xx 이므로 반올림 시 2톨\n * - 63초부터는 2.05xx 이므로 반올림 시 2.1톨\n *\n */\n\ntype GetVideoDownloadCostParams = {\n duration: number;\n quality: '2K' | '4K';\n ticketCode?: TicketCode;\n remainingFreeDownloads?: number;\n\n /** @deprecated 이 파라미터는 더이상 사용되지 않습니다. */\n isFullTime?: boolean;\n};\n\nexport function getVideoDownloadCost({\n duration,\n quality,\n ticketCode = 'FREE',\n remainingFreeDownloads = 0,\n}: GetVideoDownloadCostParams) {\n if (quality === '4K') {\n return getRawVideoDownloadCost();\n }\n\n return getClipVideoDownloadCost({\n duration,\n ticketCode,\n remainingFreeDownloads,\n });\n}\n\ntype GetClipVideoDownloadCostParams = {\n duration: number;\n ticketCode?: TicketCode;\n remainingFreeDownloads?: number;\n};\n\nexport function getClipVideoDownloadCost({\n duration,\n ticketCode = 'FREE',\n remainingFreeDownloads = 0,\n}: GetClipVideoDownloadCostParams) {\n const durationInSeconds = duration / 1000;\n const isUnder61 = durationInSeconds < 61;\n const isPlus = ticketCode === 'PLUS';\n\n if (isPlus && remainingFreeDownloads > 0 && isUnder61) {\n return { cost: 0, isPlusFree: true };\n }\n\n const cost = Math.round(durationInSeconds * CLIP_COST_PER_SECOND * 10) / 10;\n return { cost, isPlusFree: false };\n}\n\nexport function getRawVideoDownloadCost() {\n return { cost: 20, isPlusFree: false };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,IAAM,uBAAuB,IAAI;AA2B1B,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,yBAAyB;AAC3B,GAA+B;AAC7B,MAAI,YAAY,MAAM;AACpB,WAAO,wBAAwB;AAAA,EACjC;AAEA,SAAO,yBAAyB;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAQO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA,aAAa;AAAA,EACb,yBAAyB;AAC3B,GAAmC;AACjC,QAAM,oBAAoB,WAAW;AACrC,QAAM,YAAY,oBAAoB;AACtC,QAAM,SAAS,eAAe;AAE9B,MAAI,UAAU,yBAAyB,KAAK,WAAW;AACrD,WAAO,EAAE,MAAM,GAAG,YAAY,KAAK;AAAA,EACrC;AAEA,QAAM,OAAO,KAAK,MAAM,oBAAoB,uBAAuB,EAAE,IAAI;AACzE,SAAO,EAAE,MAAM,YAAY,MAAM;AACnC;AAEO,SAAS,0BAA0B;AACxC,SAAO,EAAE,MAAM,IAAI,YAAY,MAAM;AACvC;","names":[]}
1
+ {"version":3,"sources":["../src/libs/index.ts","../src/libs/cost.ts"],"sourcesContent":["export * from './cost';\n","import type { TicketCode } from '@/types/membership';\n\nconst CLIP_COST_PER_SECOND = 1 / 60;\n\n/**\n * 비디오 다운로드 비용을 계산합니다.\n *\n * @description\n * - 전체 시간 4K 다운로드 시 티켓 상관없이 20톨\n * - 1분 미만인 경우, remainingFreeDownloads > 0 이면 무료\n * - 1분 미만인 경우, remainingFreeDownloads <= 0 이면 1톨부터 시작\n * - 55초부터는 1.92xx 이므로 반올림 시 1.9톨\n * - 59초부터는 1.98xx 이므로 반올림 시 2톨\n * - 60초부터는 2.00xx 이므로 반올림 시 2톨\n * - 62초부터는 2.03xx 이므로 반올림 시 2톨\n * - 63초부터는 2.05xx 이므로 반올림 시 2.1톨\n *\n */\n\ntype GetVideoDownloadCostParams = {\n duration: number;\n quality: '2K' | '4K';\n ticketCode?: TicketCode;\n remainingFreeDownloads?: number;\n\n /** @deprecated 이 파라미터는 더이상 사용되지 않습니다. */\n isFullTime?: boolean;\n};\n\nexport function getVideoDownloadCost({\n duration,\n quality,\n ticketCode = 'FREE',\n remainingFreeDownloads = 0,\n}: GetVideoDownloadCostParams) {\n if (quality === '4K') {\n return getRawVideoDownloadCost();\n }\n\n return getClipVideoDownloadCost({\n duration,\n ticketCode,\n remainingFreeDownloads,\n });\n}\n\ntype GetClipVideoDownloadCostParams = {\n duration: number;\n ticketCode?: TicketCode;\n remainingFreeDownloads?: number;\n};\n\nexport function getClipVideoDownloadCost({\n duration,\n ticketCode = 'FREE',\n remainingFreeDownloads = 0,\n}: GetClipVideoDownloadCostParams) {\n const durationInSeconds = duration / 1000;\n const isUnder61 = durationInSeconds < 61;\n const isPlus = ticketCode === 'PLUS';\n\n if (isPlus && remainingFreeDownloads > 0 && isUnder61) {\n return { cost: 0, isPlusFree: true };\n }\n\n const cost = Math.round(durationInSeconds * CLIP_COST_PER_SECOND * 10) / 10;\n return { cost, isPlusFree: false };\n}\n\nexport function getRawVideoDownloadCost() {\n return { cost: 20, isPlusFree: false };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,IAAM,uBAAuB,IAAI;AA2B1B,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,yBAAyB;AAC3B,GAA+B;AAC7B,MAAI,YAAY,MAAM;AACpB,WAAO,wBAAwB;AAAA,EACjC;AAEA,SAAO,yBAAyB;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAQO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA,aAAa;AAAA,EACb,yBAAyB;AAC3B,GAAmC;AACjC,QAAM,oBAAoB,WAAW;AACrC,QAAM,YAAY,oBAAoB;AACtC,QAAM,SAAS,eAAe;AAE9B,MAAI,UAAU,yBAAyB,KAAK,WAAW;AACrD,WAAO,EAAE,MAAM,GAAG,YAAY,KAAK;AAAA,EACrC;AAEA,QAAM,OAAO,KAAK,MAAM,oBAAoB,uBAAuB,EAAE,IAAI;AACzE,SAAO,EAAE,MAAM,YAAY,MAAM;AACnC;AAEO,SAAS,0BAA0B;AACxC,SAAO,EAAE,MAAM,IAAI,YAAY,MAAM;AACvC;","names":[]}
package/dist/libs.d.cts CHANGED
@@ -26,5 +26,18 @@ declare function getVideoDownloadCost({ duration, quality, ticketCode, remaining
26
26
  cost: number;
27
27
  isPlusFree: boolean;
28
28
  };
29
+ type GetClipVideoDownloadCostParams = {
30
+ duration: number;
31
+ ticketCode?: TicketCode;
32
+ remainingFreeDownloads?: number;
33
+ };
34
+ declare function getClipVideoDownloadCost({ duration, ticketCode, remainingFreeDownloads, }: GetClipVideoDownloadCostParams): {
35
+ cost: number;
36
+ isPlusFree: boolean;
37
+ };
38
+ declare function getRawVideoDownloadCost(): {
39
+ cost: number;
40
+ isPlusFree: boolean;
41
+ };
29
42
 
30
- export { getVideoDownloadCost };
43
+ export { getClipVideoDownloadCost, getRawVideoDownloadCost, getVideoDownloadCost };
package/dist/libs.d.ts CHANGED
@@ -26,5 +26,18 @@ declare function getVideoDownloadCost({ duration, quality, ticketCode, remaining
26
26
  cost: number;
27
27
  isPlusFree: boolean;
28
28
  };
29
+ type GetClipVideoDownloadCostParams = {
30
+ duration: number;
31
+ ticketCode?: TicketCode;
32
+ remainingFreeDownloads?: number;
33
+ };
34
+ declare function getClipVideoDownloadCost({ duration, ticketCode, remainingFreeDownloads, }: GetClipVideoDownloadCostParams): {
35
+ cost: number;
36
+ isPlusFree: boolean;
37
+ };
38
+ declare function getRawVideoDownloadCost(): {
39
+ cost: number;
40
+ isPlusFree: boolean;
41
+ };
29
42
 
30
- export { getVideoDownloadCost };
43
+ export { getClipVideoDownloadCost, getRawVideoDownloadCost, getVideoDownloadCost };
package/dist/libs.js CHANGED
@@ -33,6 +33,8 @@ function getRawVideoDownloadCost() {
33
33
  return { cost: 20, isPlusFree: false };
34
34
  }
35
35
  export {
36
+ getClipVideoDownloadCost,
37
+ getRawVideoDownloadCost,
36
38
  getVideoDownloadCost
37
39
  };
38
40
  //# sourceMappingURL=libs.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spoclip-kit",
3
- "version": "1.0.18",
3
+ "version": "1.0.20",
4
4
  "type": "module",
5
5
  "description": "TypeScript utility library for internal use",
6
6
  "files": [
@@ -54,7 +54,12 @@
54
54
  "clean": "rimraf dist",
55
55
  "release:patch": "npm version patch && npm publish",
56
56
  "release:minor": "npm version minor && npm publish",
57
- "release:major": "npm version major && npm publish"
57
+ "release:major": "npm version major && npm publish",
58
+ "pre-release": "npm run build && npm run test:run && npm run lint",
59
+ "post-release": "git push && git push --tags",
60
+ "commit": "git-cz",
61
+ "commit:check": "commitlint --edit",
62
+ "version:check": "npm run commit:check"
58
63
  },
59
64
  "keywords": [
60
65
  "typescript",
@@ -65,10 +70,14 @@
65
70
  "author": "",
66
71
  "license": "MIT",
67
72
  "devDependencies": {
73
+ "@commitlint/cli": "^20.1.0",
74
+ "@commitlint/config-conventional": "^20.0.0",
68
75
  "@eslint/js": "^9.37.0",
69
76
  "@types/node": "^20.10.5",
70
77
  "@typescript-eslint/eslint-plugin": "^8.46.1",
71
78
  "@typescript-eslint/parser": "^8.46.1",
79
+ "commitizen": "^4.3.1",
80
+ "cz-conventional-changelog": "^3.3.0",
72
81
  "eslint": "^9.37.0",
73
82
  "globals": "^16.4.0",
74
83
  "prettier": "^3.1.1",
@@ -81,6 +90,11 @@
81
90
  "peerDependencies": {
82
91
  "typescript": ">=4.9.0"
83
92
  },
93
+ "config": {
94
+ "commitizen": {
95
+ "path": "./node_modules/cz-conventional-changelog"
96
+ }
97
+ },
84
98
  "publishConfig": {
85
99
  "access": "public"
86
100
  },