{"_id":"@carllewi2/sapcdc-ally-driver","name":"@carllewi2/sapcdc-ally-driver","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@carllewi2/sapcdc-ally-driver","version":"1.0.0","description":"A custom ally driver for SAPCDC","main":"build/providers/index.js","scripts":{"clean":"del build","copyfiles":"copyfiles \"instructions.md\" build","compile":"npm run lint && npm run clean && tsc","build":"npm run compile && npm run copyfiles","prepublishOnly":"npm run build","lint":"eslint . --ext=.ts","format":"prettier --write .","version":"npm run build"},"keywords":["adonisjs","adonis-ally"],"author":"","license":"MIT","devDependencies":{"@adonisjs/ally":"^4.0.0","@adonisjs/core":"^5.1.8","@types/node":"^15.12.2","copyfiles":"^2.4.1","del-cli":"^3.0.1","eslint":"^7.28.0","eslint-config-prettier":"^8.3.0","eslint-plugin-adonis":"^1.3.2","eslint-plugin-prettier":"^3.4.0","prettier":"^2.3.1","typescript":"^4.3.2"},"peerDependencies":{"@adonisjs/ally":"^4.0.0","@adonisjs/core":"^5.0.0"},"adonisjs":{"instructionsMd":"./build/instructions.md","env":{"SAPCDC_DRIVER_CLIENT_ID":"","SAPCDC_DRIVER_CLIENT_SECRET":"","SAPCDC_DRIVER_AUTHORIZE_URL":"","SAPCDC_DRIVER_USER_INFO_URL":"","SAPCDC_DRIVER_TOKEN_URL":"","SAPCDC_DRIVER_RESPONSE_TYPE":"","SAPCDC_DRIVER_SCOPES":""},"types":"sapcdc-ally-driver","providers":["sapcdc-ally-driver"]},"types":"./build/providers/index.d.ts","dependencies":{"acorn-jsx":"^5.3.1","acorn":"^7.4.1","ansi-colors":"^4.1.1","ajv":"^6.12.6","ansi-escapes":"^4.3.2","argparse":"^1.0.10","ansi-regex":"^5.0.0","ansi-styles":"^4.3.0","array-union":"^2.1.0","astral-regex":"^2.0.0","arrify":"^1.0.1","atomic-sleep":"^1.0.0","balanced-match":"^1.0.2","brace-expansion":"^1.1.11","buffer-alloc":"^1.2.0","braces":"^3.0.2","bytes":"^3.1.0","buffer-alloc-unsafe":"^1.1.0","buffer-fill":"^1.0.0","cacheable-lookup":"^5.0.4","call-bind":"^1.0.2","cacheable-request":"^7.0.1","callsites":"^3.1.0","camel-case":"^4.1.2","camelcase":"^5.3.1","camelcase-keys":"^6.2.2","capital-case":"^1.0.4","chalk":"^4.1.1","change-case":"^4.1.2","clean-stack":"^2.2.0","cli-cursor":"^3.1.0","cli-boxes":"^3.0.0","cli-table3":"^0.6.0","cliui":"^7.0.4","co-compose":"^6.1.3","clone-response":"^1.0.2","color-convert":"^2.0.1","color-name":"^1.1.4","colors":"^1.4.0","color-support":"^1.1.3","concat-map":"^0.0.1","constant-case":"^3.0.4","cookie":"^0.4.1","core-util-is":"^1.0.3","content-disposition":"^0.5.3","cross-spawn":"^7.0.3","cuid":"^2.1.8","debug":"^4.3.2","decamelize":"^1.2.0","decompress-response":"^6.0.0","decamelize-keys":"^1.1.0","defer-to-connect":"^2.0.1","deep-is":"^0.1.3","del":"^5.1.0","destroy":"^1.0.4","depd":"^1.1.2","doctrine":"^3.0.0","dir-glob":"^3.0.1","ee-first":"^1.1.1","dot-case":"^3.0.4","dotenv":"^10.0.0","emittery":"^0.9.2","emoji-regex":"^8.0.0","encodeurl":"^1.0.2","end-of-stream":"^1.4.4","enquirer":"^2.3.6","error-ex":"^1.3.2","escape-goat":"^2.1.1","escape-html":"^1.0.3","escalade":"^3.1.1","eslint-utils":"^2.1.0","escape-string-regexp":"^4.0.0","eslint-visitor-keys":"^2.1.0","espree":"^7.3.1","eslint-scope":"^5.1.1","esrecurse":"^4.3.0","esquery":"^1.4.0","esprima":"^4.0.1","estraverse":"^4.3.0","etag":"^1.8.1","esutils":"^2.0.3","fast-deep-equal":"^3.1.3","fast-diff":"^1.2.0","fast-levenshtein":"^2.0.6","fast-json-stable-stringify":"^2.1.0","fast-glob":"^3.2.5","fast-redact":"^3.0.1","fastq":"^1.11.0","fast-safe-stringify":"^2.0.7","file-entry-cache":"^6.0.1","file-type":"^16.5.0","find-up":"^4.1.0","fill-range":"^7.0.1","flat-cache":"^3.0.4","fresh":"^0.5.2","flatstr":"^1.0.12","flatted":"^3.1.1","forwarded":"^0.2.0","fs-extra":"^10.0.0","function-bind":"^1.1.1","fs.realpath":"^1.0.0","fs-readdir-recursive":"^1.1.0","functional-red-black-tree":"^1.0.1","get-caller-file":"^2.0.5","get-stream":"^5.2.0","get-intrinsic":"^1.1.1","getopts":"^2.3.0","glob-parent":"^5.1.2","globals":"^13.9.0","glob":"^7.1.7","globby":"^10.0.2","graceful-fs":"^4.2.6","hard-rejection":"^2.1.0","got":"^11.8.2","has":"^1.0.3","he":"^1.2.0","has-flag":"^4.0.0","haye":"^3.0.0","hosted-git-info":"^2.8.9","header-case":"^2.0.4","has-symbols":"^1.0.2","http-cache-semantics":"^4.1.0","http-errors":"^1.8.0","http2-wrapper":"^1.0.3","ieee754":"^1.2.1","iconv-lite":"^0.4.24","ignore":"^4.0.6","indent-string":"^4.0.0","imurmurhash":"^0.1.4","import-fresh":"^3.3.0","inflation":"^2.0.0","inherits":"^2.0.4","inflight":"^1.0.6","ipaddr.js":"^1.9.1","is-arrayish":"^0.2.1","is-fullwidth-code-point":"^3.0.0","is-extglob":"^2.1.1","is-glob":"^4.0.1","is-core-module":"^2.4.0","is-path-inside":"^3.0.3","is-path-cwd":"^2.2.0","is-number":"^7.0.0","is-plain-obj":"^1.1.0","isexe":"^2.0.0","jest-worker":"^27.0.2","isarray":"^0.0.1","js-tokens":"^4.0.0","json-parse-even-better-errors":"^2.3.1","js-yaml":"^3.14.1","json-buffer":"^3.0.1","json-stable-stringify-without-jsonify":"^1.0.1","json-schema-traverse":"^0.4.1","jsonfile":"^6.1.0","keyv":"^4.0.3","kind-of":"^6.0.3","accepts":"^1.3.7","kleur":"^4.1.4","levn":"^0.4.1","lines-and-columns":"^1.1.6","lodash":"^4.17.21","locate-path":"^5.0.0","lodash.clonedeep":"^4.5.0","lodash.merge":"^4.6.2","lodash.truncate":"^4.4.2","lowercase-keys":"^2.0.0","log-update":"^4.0.0","lower-case":"^2.0.2","lru-cache":"^6.0.0","macroable":"^5.1.3","luxon":"^1.27.0","map-obj":"^4.2.1","merge-stream":"^2.0.0","media-typer":"^1.1.0","meow":"^6.1.1","mime":"^1.6.0","micromatch":"^4.0.4","merge2":"^1.4.1","mime-db":"^1.48.0","mimic-fn":"^2.1.0","mime-types":"^2.1.31","mimic-response":"^1.0.1","min-indent":"^1.0.1","minimatch":"^3.0.4","minimist-options":"^4.1.0","mkdirp":"^1.0.4","natural-compare":"^1.4.0","abstract-logging":"^2.0.1","mustache":"^4.2.0","no-case":"^3.0.4","negotiator":"^0.6.2","noms":"^0.0.0","normalize-package-data":"^2.5.0","normalize-url":"^6.0.1","on-finished":"^2.3.0","object-inspect":"^1.10.3","once":"^1.4.0","onetime":"^5.1.2","object-assign":"^4.1.1","p-cancelable":"^2.1.1","p-limit":"^2.3.0","optionator":"^0.9.1","param-case":"^3.0.4","p-locate":"^4.1.0","p-try":"^2.2.0","parent-module":"^1.0.1","p-map":"^3.0.0","parse-json":"^5.2.0","parseurl":"^1.3.3","pascal-case":"^3.1.2","path-case":"^3.0.4","path-is-absolute":"^1.0.1","path-exists":"^4.0.0","path-key":"^3.1.1","pino-std-serializers":"^3.2.0","pino":"^6.11.3","path-parse":"^1.0.7","path-type":"^4.0.0","peek-readable":"^3.1.3","ms":"^2.1.3","prettier-linter-helpers":"^1.0.0","picomatch":"^2.3.0","prelude-ls":"^1.2.1","proxy-addr":"^2.0.7","leven":"^3.1.0","pretty-hrtime":"^1.0.3","progress":"^2.0.3","pump":"^3.0.0","queue-microtask":"^1.2.3","qs":"^6.10.1","punycode":"^2.1.1","quick-lru":"^4.0.1","quick-format-unescaped":"^4.0.3","random-bytes":"^1.0.0","range-parser":"^1.2.1","raw-body":"^2.4.1","read-pkg-up":"^7.0.1","readable-stream":"^3.6.0","read-pkg":"^5.2.0","redent":"^3.0.0","regexpp":"^3.1.0","readable-web-to-node-stream":"^3.0.1","require-directory":"^2.1.1","require-all":"^3.0.0","resolve-alpn":"^1.1.2","require-from-string":"^2.0.2","resolve-from":"^5.0.0","restore-cursor":"^3.1.0","reusify":"^1.0.4","resolve":"^1.20.0","rimraf":"^3.0.2","responselike":"^2.0.0","run-parallel":"^1.2.0","safer-buffer":"^2.1.2","process-nextick-args":"^2.0.1","pluralize":"^8.0.0","send":"^0.17.1","sentence-case":"^3.0.4","serve-static":"^1.14.1","setprototypeof":"^1.2.0","shebang-command":"^2.0.0","side-channel":"^1.0.4","shebang-regex":"^3.0.0","signal-exit":"^3.0.3","slash":"^3.0.0","sonic-boom":"^1.4.1","slugify":"^1.5.3","snake-case":"^3.0.4","spdx-exceptions":"^2.3.0","spdx-correct":"^3.1.1","spdx-license-ids":"^3.0.9","spdx-expression-parse":"^3.0.1","slice-ansi":"^4.0.0","string_decoder":"^1.3.0","sprintf-js":"^1.0.3","statuses":"^1.5.0","string-width":"^4.2.2","stringify-attributes":"^2.0.0","strip-ansi":"^6.0.0","strip-indent":"^3.0.0","strtok3":"^6.0.8","supports-color":"^7.2.0","strip-json-comments":"^3.1.1","term-size":"^2.2.1","table":"^6.7.1","semver":"^7.3.5","toidentifier":"^1.0.0","trim-newlines":"^3.0.1","to-regex-range":"^5.0.1","tmp-cache":"^1.1.0","through2":"^2.0.5","truncatise":"^0.0.8","aggregate-error":"^3.1.0","safe-buffer":"^5.2.1","tslib":"^2.2.0","type-is":"^1.6.18","uid-safe":"^2.1.5","tsutils":"^3.21.0","unpipe":"^1.0.0","type-check":"^0.4.0","universalify":"^2.0.0","util-deprecate":"^1.0.2","upper-case":"^2.0.2","untildify":"^4.0.0","upper-case-first":"^2.0.2","validate-npm-package-license":"^3.0.4","uri-js":"^4.4.1","v8-compile-cache":"^2.3.0","vary":"^1.1.2","validator":"^13.6.0","which":"^2.0.2","wrap-ansi":"^6.2.0","wrappy":"^1.0.2","yallist":"^4.0.0","xtend":"^4.0.2","word-wrap":"^1.2.3","type-fest":"^0.20.2","token-types":"^2.1.1","text-table":"^0.2.0","yargs":"^16.2.0","y18n":"^5.0.8","yargs-parser":"^18.1.3"},"repository":{"type":"git","url":"git+https://github.com/cambridge-pte/sapcdc-ally-driver.git"},"bugs":{"url":"https://github.com/cambridge-pte/sapcdc-ally-driver/issues"},"homepage":"https://github.com/cambridge-pte/sapcdc-ally-driver#readme","gitHead":"39198bfa02718b6823f746a9252111d87c7ff87a","_id":"@carllewi2/sapcdc-ally-driver@1.0.0","_nodeVersion":"14.18.2","_npmVersion":"8.1.4","dist":{"integrity":"sha512-9hE6RcV0+Fwk34i49I8zdU5w8+5XhwR+WCd2F8xVkTuZ4Yzh91p8fyLfq003vQ2HfxpXa7dfpTB7EVVzw5AKew==","shasum":"ac20cf39d9ad78d451bbed28ba9d72d537cb0927","tarball":"https://registry.npmjs.org/@carllewi2/sapcdc-ally-driver/-/sapcdc-ally-driver-1.0.0.tgz","fileCount":9,"unpackedSize":33515,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDGgHv4IZWIQeFSkhsgbzHMoep8nUR0t/1THihm2at+/wIhALSm7ygKgjs7SqjlB5WL2D802Tl3iP78YYmk/aH9XNQe"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiuH7kACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr2iQ/9FduDJxZ1Y9F5Jp4Ucqtqzg3rAYvEnVT+GHU1IYhKVTfuFyot\r\nG1wU+3SA14Scb/P4BWOAOetfA4SsQSv08tWEygo9SSF99Spf1gWN8lSirdp4\r\nY3+QFyQjlCHMteJYxs60x3MC0C2kYhoJsvugvdfPeHTKQbEsyGddVABVr5K2\r\nA8UcCmyqlL1HMVftsLmBJVVRvwEHB/4sXEb2Uw/BPkUYOl0rHviYaoOw1XBk\r\ngvc3uQE2TwMqWncIf1S8GMceYtheQrfteu5KELuEsHwxCv/mMhWljm3AGOpJ\r\nQONZlNBaVR7GVmnVlLZ0GdC3bB9ifoOwGF0ZXkpf+aOLjkEEBJgsQCep92pX\r\nnGEioNwWqj0ddd7jupyEaxW606UO2f58/y7PsrwpWYBcWe+KZvcttQPG8/Xu\r\nhzZVRAr2H/xNMorC8CqPRjb23m5JX+XkWROOFR8KYVwDRg5DfzFYHHKwk8D7\r\nM8nfIZkMs7T6t4LUmGQH3ucARrS2VGg6Eo3lwZc6skXzHSLLPWGpNNqTXOD5\r\nCOJkPltDXefzljGT7Hf50vOTLdZART0PQp2A9vlq2mgMRoWrKT2CmKonH7Mm\r\ngc/QPr/QU8lwM0BfLjvFjGc+zi87L24g32QDGEDjYoytU8QSxvvmfr4/oC0l\r\nTmuipLliSZSpg2yfCVUTjTX+UQ1npgrzz3I=\r\n=d5vQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"carllewi2","email":"cgodoy@cambridge.org"},"directories":{},"maintainers":[{"name":"carllewi2","email":"cgodoy@cambridge.org"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/sapcdc-ally-driver_1.0.0_1656258275979_0.42865269771742986"},"_hasShrinkwrap":false}},"time":{"created":"2022-06-26T15:44:35.850Z","1.0.0":"2022-06-26T15:44:36.152Z","modified":"2022-06-26T15:44:36.293Z"},"maintainers":[{"name":"carllewi2","email":"cgodoy@cambridge.org"}],"description":"A custom ally driver for SAPCDC","homepage":"https://github.com/cambridge-pte/sapcdc-ally-driver#readme","keywords":["adonisjs","adonis-ally"],"repository":{"type":"git","url":"git+https://github.com/cambridge-pte/sapcdc-ally-driver.git"},"bugs":{"url":"https://github.com/cambridge-pte/sapcdc-ally-driver/issues"},"license":"MIT","readme":"<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n\n## Table of contents\n\n- [Ally custom driver boilerplate](#ally-custom-driver-boilerplate)\n  - [Getting started](#getting-started)\n  - [How is the code structured?](#how-is-the-code-structured)\n    - [YourDriverAccessToken](#yourdriveraccesstoken)\n    - [YourDriverScopes](#yourdriverscopes)\n    - [YourDriverConfig](#yourdriverconfig)\n    - [YourDriver](#yourdriver)\n  - [Development checklist](#development-checklist)\n  - [Testing the driver](#testing-the-driver)\n  - [Release checklist](#release-checklist)\n  - [FAQ's](#faqs)\n    - [How do I define extra params during redirect?](#how-do-i-define-extra-params-during-redirect)\n    - [How do I define extra fields/params for the access token request?](#how-do-i-define-extra-fieldsparams-for-the-access-token-request)\n  - [Share with others](#share-with-others)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n# Ally custom driver boilerplate\n\n> A boilerplate for creating custom AdonisJS ally drivers\n\nThis repo serves as a starting point to create your custom OAuth2 drivers for [AdonisJS ally](https://docs.adonisjs.com/guides/auth/social).\n\nThe boilerplate is tailored to create one driver per project and publish it as a package on npm.\n\n## Getting started\n\nFollowing are the steps to get started.\n\n- Fork this repo and then clone it on your local machine.\n- Install all the dependencies using `npm` or `yarn` (whatever you prefer).\n- Open `package.json` file and update the package `name`, `description` and the `adonisjs` configuration block.\n\n  ```json\n  {\n    \"name\": \"package-name\",\n    \"description\": \"\",\n    \"adonisjs\": {\n      \"types\": \"package-name\",\n      \"providers\": [\"package-name\"]\n    }\n  }\n  ```\n\n## How is the code structured?\n\nThe code for the driver is inside the `src` directory. Make sure to change the `YourDriver` directory name to the name of the driver.\n\nThe driver implementation is mainly driven by the config, except the `user` and the `userFromToken` methods. Both of these methods are specific to the Oauth provider, and hence you have to implement them yourself.\n\nThe `src/YourDriver/index.ts` file has the following exports.\n\n#### YourDriverAccessToken\n\nThe type defines the properties that exist on the access token returned by your driver. You must read your OAuth provider documentation and list all the properties here.\n\n**Do not change the pre-defined `token` and `bearer` properties.**\n\n```ts\nexport type YourDriverAccessToken = {\n  token: string\n  type: 'bearer'\n}\n```\n\n#### YourDriverScopes\n\nDefine a union of driver scopes accepted by your OAuth provider. You can check out the [official implementations](https://github.com/adonisjs/ally/blob/develop/adonis-typings/ally.ts#L236-L268) to see how they are defined.\n\n#### YourDriverConfig\n\nThe type defines the configuration options that your driver expects. It must specify the following mentioned properties, along with any additional properties your driver needs to be functional.\n\n```ts\nexport type YourDriverConfig = {\n  driver: 'YourDriverName'\n  clientId: string\n  clientSecret: string\n  callbackUrl: string\n  authorizeUrl?: string\n  accessTokenUrl?: string\n  userInfoUrl?: string\n}\n```\n\n#### YourDriver\n\nThe driver implementation is a standard TypeScript class that extends the base `Oauth2Driver` class. The base driver class enforces you to define the following instance properties.\n\n- `authorizeUrl` is the URL for the redirect request. The user is redirected to this URL to authorize the request. Check out provider docs to find this URL.\n- `accessTokenUrl` is used to exchange the authorization code for the access token. Check out provider docs to find this URL.\n- `userInfoUrl` is used to make a request for getting the user profile information\n- `codeParamName` is the query string parameter for reading the **authorization code** after redirecting the user back to the callback URL.\n- `errorParamName` is the query string parameter for finding the error after redirecting the user back to the callback URL.\n- `stateCookieName` is the cookie name for storing the CSRF token (also known as the state). Make sure the cookie name does not collide with other drivers. A safer option is to prefix your driver name to the `oauth_state` keyword.\n- `stateParamName` is the query string parameter name for setting the state during the authorization redirect.\n- `scopeParamName` is the query string parameter name for sending the scopes during the authorization redirect.\n- `scopesSeparator` is the character to use for separating multiple parameters.\n\n## Development checklist\n\n- [ ] I have renamed all `YourDriver` references to a more meaningful driver name inside the `src/YourDriver/index.ts` file.\n- [ ] I have renamed the `YourDriverProvider` inside the `providers/index.ts` file.\n- [ ] I have updated the driver name in the `Ally.extend` method call inside the `providers/index.ts` file.\n- [ ] I have defined the `authorizeUrl` class property.\n- [ ] I have defined the `accessTokenUrl` class property.\n- [ ] I have defined the `userInfoUrl` class property.\n- [ ] I have defined the `codeParamName` class property.\n- [ ] I have defined the `errorParamName` class property.\n- [ ] I have defined the `stateCookieName` class property.\n- [ ] I have defined the `stateParamName` class property.\n- [ ] I have defined the `scopeParamName` class property.\n- [ ] I have defined the `scopesSeparator` class property.\n- [ ] I have implemented the `accessDenied` class method.\n- [ ] I have implemented the `user` class method.\n- [ ] I have implemented the `userFromToken` class method.\n- [ ] I have updated the `standalone.ts` file to export the renamed driver file name.\n\n## Testing the driver\n\nYou can test the driver by installing it locally inside your AdonisJS application. Following are the steps you need to perform.\n\n- Compile the TypeScript code to JavaScript using the `npm run build` script.\n- `cd` into your AdonisJS project and install the package locally using `npm i path/to/your/driver/package`.\n- Run `node ace configure <package-name>`. The configure command needs the package name and not the package path.\n- Inform typescript about your driver by defining a mapping inside the `contracts/ally.ts` file.\n\n  ```ts\n  import { YourDriverConfig, YourDriver } from 'ally-custom-driver/build/standalone'\n\n  interface SocialProviders {\n    yourDriver: {\n      config: YourDriverConfig\n      implementation: YourDriver\n    }\n  }\n  ```\n\n- Define the config inside the `config/ally.ts` file.\n- And now you can use your driver like any other inbuilt driver.\n\n## Release checklist\n\nMake sure to finish the following tasks before releasing your package.\n\n- [ ] I have renamed the `name` and `description` properties inside the `package.json` file.\n- [ ] I have renamed the `adonisjs.types` and `adonisjs.providers` properties to use the package name inside the `package.json` file.\n- [ ] I have updated the post-install instructions inside the `instructions.md` file.\n- [ ] I have updated the `adonisjs.env` property inside the `package.json` file to use the correct driver name for environment variables.\n\n## FAQ's\n\n### How do I define extra params during redirect?\n\nYou can configure the redirect request by implementing the `configureRedirectRequest` method on the driver class. The method is already pre-defined and commented out.\n\n```ts\nprotected configureRedirectRequest(request: RedirectRequest<YourDriverScopes>) {\n  request.param('key', 'value')\n}\n```\n\n### How do I define extra fields/params for the access token request?\n\nYou can configure the access token request by implementing the `configureAccessTokenRequest` method on the driver class. The method is already pre-defined and commented out.\n\n```ts\nprotected configureAccessTokenRequest(request: ApiRequest) {\n  // Request body\n  request.field('key', 'value')\n\n  // Query param\n  request.param('key', 'value')\n}\n```\n\n## Share with others\n\nAre you excited about sharing your work with others? Make sure to submit your package to the [awesome-adonisjs](https://github.com/adonisjs-community/awesome-adonisjs) repo.\n","readmeFilename":"README.md"}